我将此发布到 Adobe 论坛,但我不希望那里有一个好的答案。我正在向在 Flash 中完成游戏并遇到同样问题的人寻求帮助。
重现我的问题的步骤:
在 Flash 中创建简单的点 DisplayObject
dot.graphics.beginFill( color); dot.graphics.drawCircle( 0, 0, 2 ); dot.graphics.endFill();
一帧多次绘制点到位图
bitmapData.draw( dot, null, null, "normal", null, _smoothing );
- 结合浏览器测试FrameRate,Win32上的flash插件版本
预计:
大多数情况下帧率接近
观察到的:
我看到在 IE7 下使用 Flash10b.ocx(10.0.22) 的帧率下降了 25%,使用 Flash10c.ocx(10.0.32) 的帧率下降了 50%。FireFox、Safari 和 Mac OSX 下的插件不会表现出同样的减速。
请帮忙:
我想就我在 Internet Explorer 中看到的性能问题获得帮助/确认。Adobe 和 Flash 社区在 Internet 上很棒,但我很惊讶没有看到这方面的信息,只有一些关于 10.0.32 与 10.0.22 上的电影播放的报告。
我的猜测是,在 IE flash 中,插件正在将绘图调用传递给 Win32,这很慢。
我的解决方案是:
不要每次都使用 draw 在位图上绘制,而是将绘制调用缓存到位图并使用CopyPixels
. 当我这样做时,跨浏览器的性能是相同的,在 10% 以内。
bitmapData.copyPixels(dot.bitmapData,dot.bitmapData.rect,new Point(dot.x,dot.y),null,null,true);
我正在使用的循环:
function enterFrame(e:Event) {
bitmap.lock();
for (var i:int=0;i<particles.length;i++) {
draw(particle[i]);
}
bitmap.unlock();
}
关于其他可能“已知”问题的注释,我想了解更多:
- 据报道,在 IE 下,我的应用程序使用的内存要小得多(在 flashplayer 中通常为 33MB,在 IE 下为 16MB)。
- 在 IE 下,内存页面错误超过 10k/秒,而在 flash 播放器中则没有。
- 在 IE 下,stage.invalidate 似乎会导致性能问题。
- 在 IE 下,在位图上放置模糊滤镜比在 Flash 播放器中具有更大的性能影响。