- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
关闭。这个问题需要更多focused .它目前不接受答案。
7年前关闭。
锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或互动。
你知道 Canvas 的更多最佳实践吗??
请将您所知道的、所学的或在线阅读的任何和所有 Canvas 最佳实践、性能提示/技巧添加到此线程
由于 Canvas 对 Internet 来说仍然很新,而且我在 future 看不到它会变老的迹象,因此没有太多记录在案的“最佳实践”或其他真正重要的技巧,这些技巧对于开发来说是“必须知道的”它在任何一个特定的地方。像这样的事情在鲜为人知的网站上多次散布。
人们需要了解的东西太多了,还有很多东西需要学习。
我想分享一些东西来帮助那些正在学习 Canvas 的人,也许一些已经很了解它的人,我希望从其他人那里得到一些反馈,让他们知道在 HTML5 中使用 Canvas 的一些最佳实践或其他技巧和窍门.
我想从我个人认为对开发人员来说非常有用但非常罕见的事情开始。
1. 缩进你的代码
就像您在其他任何时候一样,无论情况如何,都可以使用任何其他语言。这是其他所有方面的最佳实践,我发现在复杂的 Canvas 应用程序中,在处理多个不同的上下文和保存/恢复状态时,事情可能会变得有点困惑。更不用说代码更具可读性,整体看起来也更干净。
例如:
...
// Try to tell me this doesn't make sense to do
ctx.fillStyle = 'red';
ctx.fill();
ctx.save();
if (thing < 3) {
// indenting
ctx.beginPath();
ctx.arc(2, 6, 11, 0, Math.PI*2, true);
ctx.closePath();
ctx.beginPath();
ctx.moveTo(20, 40);
ctx.lineTo(10, 200);
ctx.moveTo(20, 40);
ctx.lineTo(100, 40);
ctx.closePath();
ctx.save();
ctx.fillStyle = 'blue'
ctx.fill();
ctx.restore();
} else {
// no indenting
ctx.drawImage(img, 0, 0, 200, 200);
ctx.save();
ctx.shadowBlur();
ctx.beginPath();
ctx.arc(2, 60, 10, 0, Math.PI*2, false);
ctx.closePath();
ctx.fillStyle 'green';
ctx.fill();
ctx.restore();
}
ctx.restore();
ctx.drawRect();
ctx.fill();
...
IF 语句不是比 ELSE 语句更容易和更清晰地阅读并了解立即发生的事情吗?你能看到我在这里说什么吗?我认为这应该是开发人员应该继续练习的一种方法,就像他们在编写普通的 'ol javascript 或任何其他语言时一样。
var tmpCanvas = document.createElement('canvas'),
tmpCtx = tmpCanvas.getContext('2d'),
img = document.createElement('img');
img.onload = function() {
tmpCtx.drawImage(thumbImg, 0, 0, 200, 200);
};
img.src = '/some/image/source.png';
请注意,图像的 src 是在加载后设置的。这也是要记住的关键事情。一旦图像完成加载并绘制到这些临时 Canvas 中,您就可以使用相同的 ctx.drawImage() 将它们绘制到主 Canvas 上,但不是将图像作为第一个参数,而是使用 'tmpCtx.canvas'引用临时 Canvas 。
var ctx = doc.getElementById('canvas').getContext('2d');
console.log(ctx.canvas); // HTMLCanvasElement
我很想从其他人那里听到更多关于这方面的信息。我正在制定一份 list ,列出我们应该标准化的内容,以便在我公司的
Front-end Code Standards and Best Practices 中添加一个新部分。 .我很想得到尽可能多的反馈。
最佳答案
重绘区域
动画的最佳 Canvas 优化技术是限制在每帧上清除/绘制的像素数量。最容易实现的解决方案是重置整个 Canvas 元素并重新绘制所有内容,但这对于您的浏览器来说是一项代价高昂的操作。
在帧之间重复使用尽可能多的像素。这意味着每帧需要处理的像素越少,程序运行得越快。例如,在使用 clearRect(x, y, w, h) 方法删除像素时,仅清除和重绘已更改的像素而不是整个 Canvas 是非常有益的。
程序 Sprite
按程序生成图形通常是可行的方法,但有时这不是最有效的方法。如果您要绘制带有实心填充的简单形状,那么按程序绘制它们是最好的方法。但是,如果您使用笔触、渐变填充和其他对性能敏感的构成来绘制更详细的实体,则最好使用图像 Sprite 。
两者混合使用是可能的。应用程序启动时,在 Canvas 上按程序绘制图形实体一次。之后,您可以通过绘制它们的副本来重用相同的 Sprite ,而不是重复生成相同的阴影、渐变和笔触。
状态堆栈和转换
Canvas 可以通过旋转和缩放等转换进行操作,从而改变 Canvas 坐标系。这是了解状态堆栈的重要之处,有两种方法可用:context.save()(将当前状态推送到堆栈)和 context.restore()(恢复到先前的状态)。这使您可以对绘图应用变换,然后恢复到之前的状态,以确保下一个形状不受任何先前变换的影响。状态还包括诸如填充和笔触颜色之类的属性。
合成
使用 Canvas 时,手头的一个非常强大的工具是合成模式,除其他外,它允许蒙版和分层。有多种可用的复合模式,它们都是通过 Canvas 上下文的 globalCompositeOperation 属性设置的。复合模式也是状态堆栈属性的一部分,因此您可以应用复合操作,堆叠状态并应用不同的状态,然后恢复到您创建第一个状态之前的状态。这可能特别有用。
抗锯齿
为了允许子像素绘图, Canvas 的所有浏览器实现都采用抗锯齿(尽管这似乎不是 HTML5 规范中的要求)。如果您想绘制清晰的线条并注意到结果看起来很模糊,请务必记住抗锯齿。发生这种情况是因为浏览器将插入图像,就好像它实际上是在这些像素之间一样。它会产生更流畅的动画(每次更新您可以真正移动半个像素),但它会使您的图像显得模糊。
要解决此问题,您需要四舍五入为整数值或偏移半个像素,具体取决于您是绘制填充还是描边。
对 drawImage() x 和 y 位置使用整数
如果在 Canvas 元素上调用 drawImage,将 x 和 y 位置四舍五入为整数会快得多。
Here's a test case on jsperf显示使用整数比使用小数快多少。
因此,在渲染之前将 x 和 y 位置四舍五入为整数。
比 Math.round() 快
Another jsperf test shows Math.round() 不一定是舍入数字的最快方法。使用按位 hack 实际上比内置方法更快。
Canvas Sprite Optimization
清除 Canvas
要清除整个 Canvas 上的任何现有像素,通常使用 context.clearRect(x, y, w, h) - 但还有另一个选项可用。每当设置 Canvas 的宽度/高度时,即使将它们重复设置为相同的值,也会重置 Canvas 。在使用动态大小的 Canvas 时,了解这一点很有好处,因为您会注意到绘图消失了。
计算分布
Chrome 开发者工具分析器对于找出您的性能瓶颈非常有用。根据您的应用程序,您可能需要重构程序的某些部分以提高性能以及浏览器如何处理代码的特定部分。
Optimization techniques
关于javascript - HTML5 Canvas 性能和优化技巧、技巧和编码最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8205828/
大家好, 我看到了来自 java 项目中的 jsp 页面。 想问一下这些html标签有什么区别。 请多多指教。 示例代码如下: 最佳答案 使用struts-html标签库,其中只是普
我有一个页面,我正在从电子邮件中读取 HTML。 有时,来自电子邮件的文本包含 HTML 和 CSS,它完全改变了我的页面样式。 我不希望我的页面样式因此受到影响。我如何严格阅读特定 div(框)内的
我知道有类似的问题,但我想对我的特定代码进行一些输入。 我有一个图像,我将其切成 9 块,并创建了一个 3x3 HTML 表来显示它。 但是我的表在行之间有空格,但在列之间没有空格。我没有使用任何 C
编辑:Waylan 的回答成功了!谢谢! 我正在尝试压缩文档的 .html 文件以发送给客户。目标是获得与浏览实际网站相同的体验。 打开 .html 文件时,单击的任何链接都会转到父文件夹,而不是特定
编辑:Waylan 的回答成功了!谢谢! 我正在尝试压缩文档的 .html 文件以发送给客户。目标是获得与浏览实际网站相同的体验。 打开 .html 文件时,单击的任何链接都会转到父文件夹,而不是特定
这是 question 的扩展.我正在尝试解析嵌入在 Blogger 博客的 XML 备份中的 HTML 片段,并用 InDesign 标签重新标记它们。 Blogger 并未对其任何帖子的 HTML
我知道在 html 中元素之间的换行符被视为空格,但我认为当您尝试使用响应式布局时这非常可怕。 例如,这里我们有预期和正确的行为,但要获得它,我必须删除元素之间的 html 中的换行符: https:
我正在尝试将文本文件显示为 html。我正在使用 ionic 。我正在发送一个 html 格式的响应,但在一个文本文件中发送到配置文件页面。它在 .ts 页面的变量名中。 @Component({
假设我有一个 html 文档: test 我想在浏览器中显示该代码。然后我会创建类似的东西: <html>test<html> 为了在中间制作 gubbins,我有一个函数
HTML 元素和 HTML 标签有什么区别?渲染有什么区别吗?使用标签或元素时有什么特殊注意事项吗? 最佳答案 是一个标签,特别是一个开始标签 也是一个标签,一个结束标签 This is a para
我有这个表格的模态形式。该表正在填充大量数据,但我不想分页。相反,我想以模式形式降低表格的高度并为表格添加溢出。下面是我的代码,但它不起作用。 请问我该如何实现? CSS #table{
我记得有一个 Linux 命令可以从给定的 URL 返回 HTML 代码。您可以将 URL 作为此命令的参数,然后返回 HTML 代码,而不是在浏览器中输入 URL。 哪个命令执行此操作? 最佳答案
我有一个 html 页面,我想在其中包含另一个有很多链接的 html 页面。我能够使用 iframe 实现它,但我希望 iframe 内的页面具有与原始页面相同的文本和链接颜色属性,我不想要滚动条,我
我正在使用 HTML 写一本书。如果我把它写在一个 html 文件中,整个代码就会变长,所以我想将每一章保存到不同的文件中,然后将它们加载到主 html 中。我的意思是有像 chapter1.html
在显示之前,我必须将一个网站重定向到另一个网站。我试过使用 .htaccess,但它给我带来了问题。我也使用过 javavscript 和 meta,但在加载我要从中传输的页面之前它不起作用。帮助?
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
如何打印“html”标签,包括“”?如何在不使用文本区域和 Javascript 的情况下对任何标签执行此操作? 最佳答案 使用HTML character references : <html
我需要将 Ruby on Rails 应用程序中的 html.slim 文件转换为 html.erb。有什么简单的方法吗?我尝试了 Stack Overflow 和其他网站中列出的许多选项。但对我没有
这个问题在这里已经有了答案: Is it necessary to write HEAD, BODY and HTML tags? (6 个答案) 关闭 8 年前。 我在 gitHub 上找到了这个
如果不允许通过 JavaScript 进行额外的 DOM 操作,我正在寻找可以加载外部资源的元素列表。我正在尝试使用 HTML 查看器托管来自第三方的电子邮件,当发生这种情况时,我需要删除任何自动加载
我是一名优秀的程序员,十分优秀!