HTML5 Canvas在Chrome上速度较慢,但​​在FireFox上速度较快

Blu*_*kMN 5 javascript performance firefox google-chrome html5-canvas

我正在具有4 GB RAM的双核2.8 GHz Pentium Windows 7系统上测试Chrome 15.0.874.106m(具有大量内存的高度加速的视频卡),并且正在单核上测试FireFox 7.0.1具有2 GB RAM的1.6 GHz Athalon Windows Vista笔记本电脑。但是,FireFox系统的性能要比Chrome系统好大约10倍(根据我的视觉估计,它是FPS的10倍)。

我看到的大多数帖子在FireFox和Chrome上的运行速度都还不错,但是在这里我似乎遇到了严重的逆转。关于什么可能对此负责的任何想法?我正在测试的HTML文件(单个文件,没有依赖项)约为33 MB(压缩后为16 MB),可在此处获得

这是对小文件与大文件的HTML5 canvas性能的跟踪。

我发现chrome:// tracing可以帮助我通过chrome profiler运行问题文件来获取这些配置文件结果:

编辑: 结果已删除,我得到了一些更有趣的新结果,我将在新部分中进行介绍(请参见下文)。 结束编辑

我还发现了--show-fps-counter,它显示了大约3.5 FPS的滚动速度。但是我仍然不清楚问题出在哪里。

我还找到了--use-gl开关,并尝试了台式机,例如egl和osmesa。对于osmesa,性能似乎最好,但几乎没有。我不知道确切多少,因为show-fps-counter开关显然不能与use-gl = osmesa一起使用。在其他系统上,osmesa的性能仍然不如FireFox差。

编辑续:由于事件处理中的偶然事件,我以某种方式进入了一种模式,无需按住鼠标键即可滚动地图。令我震惊和惊讶的是,它的滚动非常平稳!通过进行一些其他编辑(即,删除处理mouseup事件的代码),我切换了代码,因此不再需要按住按钮来滚动。瞧,只要不按住鼠标按钮,我就可以持续非常流畅地滚动。因此,我在使用chrome:// tracing的情况下(没有按住鼠标按钮的情况下)来分析/跟踪了行为。我的结果如下。

无需按住鼠标键即可平滑滚动:

选择摘要:
 RenderWidget :: OnHandleInputEvent:1340.968ms 212次出现
 RenderWidget :: InvalidationCallback:7.867ms 27次出现
 RenderWidget :: OnUpdateRectAck:1.319ms 173次出现
 RenderWidget :: OnSwapBuffersComplete:129.018ms 173次出现
 V8EventListener :: callListenerFunction:1306.923ms 173次出现
 RenderWidget :: DoDeferredUpdate:120.033ms 204次
 EarlyOut_UpdateReplyPending:0.004ms 4次
 EarlyOut_SwapStillPending:0.181ms 165次出现
 CommandBufferHelper :: WaitForToken:8.358ms 3次
 WebViewImpl :: layout:1.24ms 190次
 CCLayerTreeHost :: updateLayers:34.726ms 173次出现
 CCLayerTreeHost :: commitTo:24.426ms 173次出现
 CCLayerTreeHostImpl :: drawLayers:24.483ms 173次出现
 LayerRendererChromium :: present:8.434ms 173次出现
 EarlyOut_NoPendingUpdate:0.018ms 17次出现
 CommandBufferProxy :: FlushSync:8.307ms 3次
 CCLayerTreeHost :: updateLayers :: calcDrawEtc:15.871ms 173次出现
 LayerRendererChromium :: drawLayers:23.441ms 173次出现
 RenderWidget :: OnSwapBuffersPosted:0.185ms 173次出现
 RendererGLContext :: SwapBuffers:4.431ms 173次出现
 LayerRendererChromium :: drawLayersInternal :: calcDrawEtc:10.783ms 173次出现
 GpuCommandBufferStub :: OnFlush:7.581ms 3次
 GpuCommandBufferStub :: OnAsyncFlush:2825.339ms 352次出现
 GpuCommandBufferStub :: OnEcho:0.83ms 173次出现
 GpuScheduler:PutChanged:2823.239ms 355次
 GLES2DecoderImpl :: HandleTexImage2D:5.779ms 6次出现
 GLES2DecoderImpl :: HandleTexSubImage2D:1.784ms 3次出现
 GLES2DecoderImpl :: HandleSwapBuffers:2387.561ms 173次出现
 GLContext :: SwapBuffers:2384.623ms 173次出现
 ScheduledAction :: execute:2.453ms 16次
 v8.compile:1.037ms 14次
 v8.run:3.142ms 14次
 EarlyOut_NotVisible:0.021ms 14次
 RenderWidgetHost :: ForwardMouseEvent:7.465ms 538次
 RenderWidgetHost :: OnMsgInputEventAck:5.218ms 212次
 RenderWidgetHost :: OnMsgUpdateRect:4.172ms 173次出现
 RenderWidgetHost :: ForwardInputEvent:4.551ms 212次出现
*总数:13535.811ms 5332次

选择开始:986.276ms
选择范围:3320.488ms

按住鼠标按钮时,这是不稳定的/缓慢的滚动:

选择摘要:
 RenderWidget :: OnHandleInputEvent:3852.921ms 61次出现
 RenderWidget :: InvalidationCallback:4.549ms 61次出现
 RenderWidget :: OnUpdateRectAck:1.235ms 40次
 RenderWidget :: OnSwapBuffersComplete:20.684ms 40次
 V8EventListener :: callListenerFunction:357.075ms 39次出现
 RenderWidget :: DoDeferredUpdate:25.208ms 132次出现
 EarlyOut_SwapStillPending:0.004ms 6次
 EarlyOut_UpdateReplyPending:0.032ms 32次
 CommandBufferHelper :: WaitForToken:8.09ms 3次
 WebViewImpl :: layout:0.346ms 78次出现
 CCLayerTreeHost :: updateLayers:7.805ms 40次
 CCLayerTreeHost :: commitTo:4.727ms 40次
 CCLayerTreeHostImpl :: drawLayers:9.449ms 40次
 LayerRendererChromium :: present:1.122ms 40次
 EarlyOut_NoPendingUpdate:0.038ms 38次
 CommandBufferProxy :: FlushSync:8.05ms 3次
 CCLayerTreeHost :: updateLayers :: calcDrawEtc:3.694ms 40次
 LayerRendererChromium :: drawLayers:9.177ms 40次
 RenderWidget :: OnSwapBuffersPosted:0.035ms 40次
 RendererGLContext :: SwapBuffers:0.684ms 40次
 LayerTextureUpdaterCanvas :: paint:0.483ms 1次出现
 LayerTextureSubImage ::: uploadWithMapTexSubImage:0.02ms 1次
 LayerRendererChromium :: drawLayersInternal :: calcDrawEtc:2.329ms 40次
 GpuCommandBufferStub :: OnFlush:7.326ms 3次
 GpuCommandBufferStub :: OnAsyncFlush:226.88ms 121次
 GpuCommandBufferStub :: OnEcho:0.377ms 40次
 GpuScheduler:PutChanged:230.2ms 124次
 GLES2DecoderImpl :: HandleTexImage2D:5.705ms 8次
 GLES2DecoderImpl :: HandleTexSubImage2D:2.057ms 4次出现
 GLES2DecoderImpl :: HandleSwapBuffers:113.857ms 40次
 GLContext :: SwapBuffers:113.377ms 40次
 ScheduledAction :: execute:12.708ms 83次出现
 v8.compile:1.982ms 25次
 v8.run:4.499ms 25次
 EarlyOut_NotVisible:0.022ms 25次
 RenderWidgetHost :: ForwardMouseEvent:4.671ms 640次
 RenderWidgetHost :: OnMsgInputEventAck:1.102ms 61次
 RenderWidgetHost :: OnMsgUpdateRect:0.894ms 40次
 RenderWidgetHost :: ForwardInputEvent:1.527ms 61次出现
*总数:5044.941ms 2235次

选择开始:956.043ms
选择范围:6082.888ms

通过这种比较,在我看来,Chrome的OnHandleInputEvent实现一直在这里吃光。这是怎么回事?

效果是可见的,即使在更小/更简单的项目中也没有那么明显。 这是一个只有700K的示例,与30 MB以上的项目相比,这是一个更易于管理的测试。如果单击并拖动,您会看到滚动不稳定,但是如果松开鼠标按钮,滚动将继续更加流畅。

Blu*_*kMN 0

如果我正确阅读,我报告的错误(https://code.google.com/p/chromium/issues/detail?id=103148)已被标记为“无法重现”,所以我要运行假设这是 Chrome 中的一个错误,并且已被其他更新修复(有意或无意)。无论如何,我自己已经不再有这个问题了。