Javascript画布优化

Javascript画布优化,javascript,optimization,canvas,Javascript,Optimization,Canvas,以下是我正在尝试的js小提琴: 一切重要的事情都发生在你的生活中 render() 画布将鼠标位置合并到每个帧的每个块的颜色计算中。现在,无论我从函数中删除了什么,画布都会以大尺寸(1600 x 900)渲染约10fps 即使只是渲染纯黑色,也不会更改填充样式,渲染速度为10fps 有没有什么洞察到导致这种情况的原因?这个问题太宽泛了,无法回答。它可能是任何东西,从一个小的一行效率低下,你的整个方法可能需要重新设计,或者你真的是推动太多的像素 因此,与其给你一条鱼,不如学着自己钓鱼 这

以下是我正在尝试的js小提琴:

一切重要的事情都发生在你的生活中

render()   
画布将鼠标位置合并到每个帧的每个块的颜色计算中。现在,无论我从函数中删除了什么,画布都会以大尺寸(1600 x 900)渲染约10fps

即使只是渲染纯黑色,也不会更改填充样式,渲染速度为10fps


有没有什么洞察到导致这种情况的原因?

这个问题太宽泛了,无法回答。它可能是任何东西,从一个小的一行效率低下,你的整个方法可能需要重新设计,或者你真的是推动太多的像素

因此,与其给你一条鱼,不如学着自己钓鱼

这将告诉您如何识别代码中的瓶颈并解决它们


但有一件事你应该知道,2D画布速度很慢。它非常依赖于填充率。这意味着你画的像素越多,它就越慢。代码的本质是它绘制了大量像素


如果您可以使用WebGL,您可以通过硬件加速实现一些惊人的帧率。但是,这需要完全重新设计与此相关的所有内容,并学习GLSL。你能用GLSL做什么真是太神奇了。

这个问题太宽泛了,无法回答。它可能是任何东西,从一个小的一行效率低下,你的整个方法可能需要重新设计,或者你真的是推动太多的像素

因此,与其给你一条鱼,不如学着自己钓鱼

这将告诉您如何识别代码中的瓶颈并解决它们


但有一件事你应该知道,2D画布速度很慢。它非常依赖于填充率。这意味着你画的像素越多,它就越慢。代码的本质是它绘制了大量像素


如果您可以使用WebGL,您可以通过硬件加速实现一些惊人的帧率。但是,这需要完全重新设计与此相关的所有内容,并学习GLSL。你能用GLSL做的事情真是太神奇了。

太多的代码员。。你应该在问题上贴代码,而不是在问题上jsfiddle@Izzey很抱歉,代码太多了,我真的不知道如何在不将其过度简化到没有帮助的程度的情况下提取它。一个简短的文字解释会对将来的人有所帮助吗?你有没有试过在Chrome中使用profiler?嗯。画布越大,块就越多,块更新得越快。同时拥有
setTimeout
requestAniamtionFrame
也可能与此有关。仅仅因为它是黑色并不意味着它没有更新,你可以在黑色上画黑色。然后不要为每个块设置填充样式。如果可以批处理具有相同填充样式的块并同时绘制它们,则无需对上下文的状态进行太多更改。这是游戏引擎中的一个常见优化,它只是有点违反了你的逻辑。太多的代码人。。你应该在问题上贴代码,而不是在问题上jsfiddle@Izzey很抱歉,代码太多了,我真的不知道如何在不将其过度简化到没有帮助的程度的情况下提取它。一个简短的文字解释会对将来的人有所帮助吗?你有没有试过在Chrome中使用profiler?嗯。画布越大,块就越多,块更新得越快。同时拥有
setTimeout
requestAniamtionFrame
也可能与此有关。仅仅因为它是黑色并不意味着它没有更新,你可以在黑色上画黑色。然后不要为每个块设置填充样式。如果可以批处理具有相同填充样式的块并同时绘制它们,则无需对上下文的状态进行太多更改。这是游戏引擎中的一个常见优化,它只是有点违反逻辑。谢谢,我很好奇Web GL是否能绕过我遇到的问题。我一定会更深入地研究分析工具。这个周末我还将深入研究GLSL,这是我已经避免太久的东西。哈哈。如果你发现瓶颈不在你自己的代码中,而在浏览器正在做的事情中,那么你需要找出如何少做这件事。或者完全重新思考你的方法:)如果你想走这条路,GLSL很有趣。@RyanKilleen我可以推荐作为第一种方法吗?这是我第一次成功尝试使用WebGL。一致认为WebGL在着色器和混合过滤器等操作方面速度更快、效率更高。但现代浏览器也可以硬件加速2D画布,如果设备有,GPU可以非常高效地渲染2D图形——可能比3D更高效,因为2D比3D更“平坦”(双关语!),2D自然适合GPU通过合成绘制的方法。因此,一定要测试2D画布…这取决于您的设计要求。;-)谢谢你,我很好奇Web GL是否会绕过我遇到的问题。我一定会更深入地研究分析工具。这个周末我还将深入研究GLSL,这是我已经避免太久的东西。哈哈。如果你发现瓶颈不在你自己的代码中,而在浏览器正在做的事情中,那么你需要找出如何少做这件事。或者完全重新思考你的方法:)如果你想走这条路,GLSL很有趣。@RyanKilleen我可以推荐作为第一种方法吗?这是我第一次成功尝试使用WebGL。一致认为WebGL在着色器和混合过滤器等操作方面速度更快、效率更高。但是,现代浏览器也可以硬件加速2D画布,如果设备有,GPU可以非常高效地渲染2D图形——可能比3D更高效,因为2D比3D(双关语!)和2D natu“更平坦”