0

我将此发布到 Adob​​e 论坛,但我不希望那里有一个好的答案。我正在向在 Flash 中完成游戏并遇到同样问题的人寻求帮助。

重现我的问题的步骤:

  1. 在 Flash 中创建简单的点 DisplayObject

    dot.graphics.beginFill( color);
    dot.graphics.drawCircle( 0, 0, 2 );
    dot.graphics.endFill();
    
  2. 一帧多次绘制点到位图

    bitmapData.draw( dot, null, null, "normal", null, _smoothing );
    
  3. 结合浏览器测试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 播放器中具有更大的性能影响。
4

2 回答 2

0

每个平台/浏览器/次要版本/调试器/等的 Flash 插件性能(非常)不同。除了针对目标受众的最小公分母进行编码之外,您几乎无法弥补这些差异。

也就是说,bitmapData.draw速度很慢,因为它会在每次调用时强制重新光栅化矢量数据。在底层,Flash 也使用此方法,但它会跟踪屏幕的脏区域,因此调用它的次数比您少(在调试器中打开“显示重绘区域”以直观地看到这一点)。

您的bitmapData.copyPixels解决方案是手动栅格实施的正确解决方案。这几乎是在 Flash 中获得高性能复杂动画的唯一机制。

于 2009-11-12T02:41:09.083 回答
0

感谢您的确认。我认为锁定的目的是帮助 Flash 最大限度地减少重绘。即使 Flash 应用程序以接近 60 fps 的速度运行,我也看到了卡顿。

而不是人们想知道我是否编码正确。我将一些全新的 tweenlite 性能示例代码修改为大约 150 像素/秒的线性运动。这突出了人们看到的口吃。示例位于http://forums.greensock.com/viewtopic.php?f=1&t=1857

于 2009-11-13T00:12:23.213 回答