并非SleepMode之错——IE9对Flash Player的影响

Flash Player从版本10.1开始加入了Sleep Mode(睡眠模式),具体表现为在浏览器中的Flash Player窗口不可见(最小化、被完全遮挡,或被滚动条带到不能显示的地方)时,自动将帧率降低到4帧/秒。我原来也写过一篇文章介绍FPS对Socket链接的影响

睡眠模式给游戏开发者带来很大的麻烦,但并非不可解决。目前最常用的两种解决方式是这样:

  1. 在JS中写一个计时器,每隔一段时间调用SWF提供的方法,可以避免进入睡眠模式;
  2. 在swf中播放一段不间断的声音,可以让帧频维持在8帧/秒。

但是,即使是使用了这两种方法,在IE9中,依然会受到“睡眠模式”的影响! 而且,这个“睡眠模式”的提供者是IE9,我们无法绕过。

就目前我测试得到的情况,IE9对Flash Player有如下影响:

  1. 在IE9窗口最小化时,会自动切断音视频流;
  2. 在IE9窗口最小化时,会自动切断客户端与服务器的通信,但不会切断连接。

测试环境:

  • Windows 7 旗舰版
  • Internet Explorer 9
  • Flash Player 10.3.181.34 标准版+Debug版

开发环境:

  • 客户端:Flex SDK 4.5.1
  • 服务端:Flash Media Server 4.0

以上结论是只测试了FMS为服务器的情况,没有测试Socket的情况,想来应该没什么区别。

网上搜了一通,没有什么中文资料,但在Microsoft Answer上找到 这样一篇文章 。我想中文资料少的原因可能是国内的开发者都不太愿意转到Win7环境,而导致无法升级IE9,所以碰不到这个问题。

上文中也说到一个解决办法,由于公司电脑无法装IE9,我暂时还没有测试:

测试了,这方法没用。

See if this fixes the Flash/IE9 problem.
From Safety (on the IE Command Bar) uncheck) ActiveX filtering.

SWF帧频(FPS)对Socket连接的影响

SWF帧频(FPS)对Socket连接的影响

SWF帧频(FPS)对Socket连接的影响

Adobe官方帮助中对于Flash Player的睡眠模式有 这样一段介绍

ActionScript 代码在睡眠模式下继续执行,这与将 Stage.frameRate 属性设置为 4 fps 类似。但是跳过呈现步骤,因此用户看不到该 Player 正在以 4 fps 的速率运行。之所以将帧速率选择为 4 fps (而不是 0),是因为该速率允许所有连接保持打开状态(NetStream、Socket 和 NetConnection)。将帧速率切换到 0 fps 会断开打开的连接。之所以将刷新速率选择为 250 毫秒 (4 fps),是因为……。

确实是这样么?当FPS低于4或者为0的时候,Socket连接会断开么?低帧频的时候,通过Socket发送的数据,是根据帧率触发,还是直接触发呢?于是我写了个测试程序做了如下测试:

  • 在舞台上双击的时候,可以在帧频2和帧频0之间切换;
  • 每次EnterFrame的时候,向Socket服务器发送布尔值false;
  • 每次单击鼠标的时候,向Socket服务器发送布尔值true;
  • 在服务端,显示出每次发送数据之间的间隔,同时显示发送的数据内容(1=true,0=false)。

继续阅读SWF帧频(FPS)对Socket连接的影响