使用 Chrome 开发者工具检查画布

Paul Lewis

简介

无论您使用的是 2D 上下文还是 WebGL 上下文,任何使用过 <canvas> 元素的人都知道,调试它可能非常困难。使用画布通常涉及一个长而难以理解的调用列表:

function draw() {

  context.clearRect(0, 0, 258, 258);
  context.fillStyle = "#EEEEEE";
  context.beginPath();
  context.arc(129, 129, 127, 0, 6.28, true);
  context.closePath();
  context.fill();

  // … and on and on
}

有时,您可能需要捕获发送到画布上下文的指令,并逐一逐步执行这些指令。幸运的是,Chrome 的开发者工具中提供了一项新的 Canvas 检查功能,可让我们轻松实现这一点!

在本文中,我将向您展示如何使用此功能开始调试画布作品。该检查器同时支持 2D 和 WebGL 上下文,因此无论您使用哪种上下文,都应该能够立即获取有用的调试信息。

使用入门

首先,在 Chrome 中前往 about:flags,然后开启“启用开发者工具实验”

在 about:flags 中启用开发者工具实验。
图 1 - 在 about:flags 中启用开发者工具实验

接下来,前往“DevTools”(开发者工具),然后点击右下角的齿轮图标 齿轮图标。然后,您可以前往实验并启用画布检查

在开发者工具的实验中启用 Canvas 检查
图 2 - 在 DevTools 的实验中启用画布检查

您需要关闭并重新打开 DevTools,以使更改生效(您可以使用 Alt+ROption+R,这两种方法非常方便)。

当 DevTools 重新打开后,前往“Profiles”部分,您会看到一个新的 Canvas 性能分析器选项。

首先,您会发现 Canvas 性能分析器处于停用状态。创建包含要调试的画布的页面后,只需按 Enable(启用),页面就会重新加载,以便捕获 <canvas> 调用:

开启画布性能分析器
图 3 - 开启画布性能分析器

您需要决定是捕获单个帧还是连续帧,其中帧与您在开发者工具时间轴中看到的帧完全相同。

单帧会捕获当前帧结束前的调用,然后停止。另一方面,连续帧会捕获所有 <canvas> 元素的所有帧,直到您指示其停止。您选择的模式取决于您使用 <canvas> 元素的方式。对于正在播放的动画,您可能需要截取单个帧。对于响应用户事件而发生的简短动画,您可能需要捕获连续的帧。

选择要捕获的帧数
图 4 - 选择要捕获的帧数

至此,一切都已准备就绪,您可以开始拍摄了!

捕获帧

如需进行截图,只需按 Start(开始),然后像平常一样与应用互动即可。过一段时间后,返回到 DevTools,如果您要连续捕获,请按 Stop

现在,左侧列表中会显示一个全新的配置文件,其中包含所有 <canvas> 元素捕获的上下文调用次数。点击该个人资料,您会看到如下所示的界面:

开发者工具中的画布配置文件。
图 5 - 开发者工具中的画布性能分析

在下部窗格中,您会看到可逐一浏览的所有捕获的帧的列表,当您点击其中的每个帧时,顶部的屏幕截图将显示该帧结束时 <canvas> 元素的状态。如果您有多个 <canvas> 元素,则可以使用屏幕截图下方的菜单选择要显示的元素。

选择画布上下文。
图 6 - 选择画布上下文

在框架内,您会看到绘制调用组。每个绘制调用组包含单个绘制调用,该调用将是组中的最后一个调用。那么,什么是绘制调用?对于 2D 上下文,这类函数包括 clearRect()drawImage()fill()stroke()putImageData() 或任何文本渲染函数;对于 WebGL,则是 clear()drawArrays()drawElements()。它本质上是会更改当前绘制缓冲区内容的任何操作。(如果您不熟悉图形,可以将缓冲区视为包含我们要操控的像素的位图。)

现在,您只需逐个浏览列表即可。您可以在帧、绘制调用组或调用级别执行此操作。无论您选择以何种方式浏览列表(屏幕截图下方有几个按钮可帮助您快速导航),您都会看到相应时间点的上下文,这意味着您可以快速发现并修复出现的 bug。

导航按钮,方便跳转列表。
图 7 - 用于便捷跳转列表的导航按钮

找出不同之处

另一项实用功能是,您可以查看两次调用之间哪些属性和变量发生了变化。

如需查看,只需点击边栏按钮 (边栏图标。),系统就会弹出一个新视图。逐步调试绘制调用时,您会看到已更新的属性。当您将鼠标悬停在任何缓冲区或数组上时,系统都会显示其内容。

找出不同之处

让您的声音被听到!

现在,您已了解如何在 Chrome 的 DevTools 中调试画布工作。如果您对 Canvas 性能分析器工具有任何反馈,请提交 bug 或发帖到 Chrome 开发者工具群组。如果您在检查 <canvas> 时发现任何 bug 或希望看到任何其他内容,请告诉我们,因为只有通过开发者的使用和反馈,Chrome 工具才能不断改进。