Firefox 开发者工具中的 Canvas 调试器

Canvas 调试器是我们将在旧金山举行的 游戏开发者大会 上演示的一款新工具。它用于调试在 Canvas 元素上渲染的动画帧。无论您是创建可视化效果、动画还是调试游戏,此工具都将帮助您理解和优化动画循环。它可以调试 WebGL 或 2D Canvas 上下文。

Canvas Debugger Screenshot

您可以使用传统的调试器(如我们自己的 Firefox 开发者工具中的 JavaScript 调试器)调试动画。但是,这可能很困难,因为它需要手动搜索您可能希望逐步执行的所有各种 Canvas 方法。Canvas 调试器旨在让您从动画循环本身的角度查看渲染调用,从而更好地了解发生了什么。

工作原理

Canvas 调试器通过创建渲染帧期间发生的所有事件的快照来工作。它记录所有 Canvas 上下文方法调用。每个帧快照都包含上下文方法调用的列表以及相关的 JavaScript 堆栈。通过检查此堆栈,开发人员可以将调用追踪回应用程序或引擎调用的更高级别函数,这些函数导致绘制了一些内容。

某些类型的 Canvas 上下文函数已突出显示,以便在快照中更容易发现它们。快速滚动浏览列表时,开发人员可以轻松发现绘制调用或冗余操作。

Canvas Debugger Call Highlighting Detail

每个绘制调用都有一个相关的屏幕截图,该屏幕截图以“胶片带”视图的形式排列在屏幕底部的时间线上。您可以使用滑块“擦洗”此胶片带,以快速定位与特定渲染部分相关的绘制调用。您还可以单击缩略图以直接转到动画帧快照中的相关绘制调用。

Canvas Debugger Timeline Picture

缩略图胶片带可以让您快速了解绘制过程。您可以轻松地看到场景是如何组合起来以获得最终渲染的。

逐步操作

您可能会注意到附加屏幕截图中有一排熟悉的按钮。它们是从 JavaScript 调试器借用的,为开发人员提供了一种在动画快照中导航的方法。这些按钮在最终发布时可能会更改其图标,但现在我们将描述它们当前的样子。

Canvas Debugger Buttons image

  • “继续” - 跳到下一个绘制调用。
  • “单步跳过” - 跳过当前上下文调用。
  • “单步跳出” - 跳出动画帧(通常跳到下一个 requestAnimationFrame 调用)。
  • “单步进入” - 跳到 JavaScript 调试器中的下一个非上下文调用。

通过在快照函数调用上“单步进入”或通过函数的堆栈跳转到 JavaScript 调试器,您可以在动画仍在运行的情况下添加断点并立即暂停。非常方便!

未来工作

我们还没有完成。我们还有一些改进措施,可以使此工具更强大。

  • 添加检查每次方法调用时上下文的 state 的功能。突出显示调用之间 state 的差异。
  • 测量每个绘制调用中花费的时间。这将清楚地显示昂贵的 Canvas 操作。
  • 更轻松地了解哪些程序和着色器当前在每个绘制调用中使用,从而允许您跳转到着色器编辑器并实时调整着色器。总体上与着色器编辑器更好的链接。
  • 通过分别绘制各个区域(通过 ID 以不同颜色绘制)或在使用鼠标悬停在预览面板上时显示像素的命中区域 ID 来检查 命中区域

我们才刚刚开始。Canvas 调试器应该很快就会出现在 Firefox Nightly 中。请关注此空间以获取其发布的新闻和更多更新。

关于 Victor Porof

Mozilla 成员,黑客,从事 Firefox DevTools 工作。

Victor Porof 的更多文章…


9 条评论

  1. Bob Thulfram

    Chrome 有类似的东西吗?我敢肯定 IE 没有。但这似乎真的很有用!我总是觉得 Canvas 在我编程的时候就像一个黑洞。尤其是像这样,它可以用于 2D 和 3D。一旦它能用,我将在我的博客 http://firefoxosgaming.blogspot.com 上写一篇文章。哇!

    2014 年 3 月 18 日 下午 1:56

  2. ThomasG77

    对于 Chrome,您可以看看 http://benvanik.github.io/WebGL-Inspector/
    我不知道 Firefox 工具和 Chrome 扩展程序之间的确切区别是什么

    2014 年 3 月 18 日 下午 4:00

  3. Mike Cooper

    Chrome 在其版本的 about:config 中的“实验性开发者工具”选项后面也有一些类似的东西。我今天在 Chromium 稳定版中试用了 Firefox 版本,感觉它比我今天试用的版本更令人印象深刻。

    2014 年 3 月 18 日 下午 6:33

  4. Forrest O.

    顺便说一下,我们什么时候可以期待实现 Canvas 命中区域???

    2014 年 3 月 19 日 上午 1:43

  5. Forrest O.

    顺便说一下,有任何线索可以知道 Canvas 命中区域何时可用???

    2014 年 3 月 19 日 上午 3:16

    1. Brian Grinstead

      不确定确切时间,但有一个关于命中区域的 bug 已经打开,您可以关注它:https://bugzilla.mozilla.org/show_bug.cgi?id=979925.

      2014 年 3 月 19 日 上午 11:36

  6. Jerome Etienne

    非常棒!

    我喜欢附加到每个调用的 JavaScript 堆栈跟踪!

    2014 年 3 月 19 日 上午 5:51

  7. dirk

    真不错。感谢您的辛勤工作。

    2014 年 3 月 20 日 上午 7:39

  8. mte90

    关于此工具有什么消息吗?
    https://mdn.org.cn/en-US/docs/Tools 上,我什么也没找到。

    2014 年 4 月 14 日 上午 9:28

本文的评论已关闭。