JavaScript性能预热

JavaScript performance warmup

本文关键字:性能 JavaScript      更新时间:2024-01-23

我正在创建一个WebGL游戏,使用一段时间后速度真的快多了。每次我第一次运行它时,速度都很慢,而且断断续续。运行一些CPU密集型代码几秒钟会首先让浏览器做好充分使用的准备吗?

我已经在一个工人身上运行了ammo.js,这给了我很大的鼓舞,但最初几分钟的游戏仍然慢得多。这可能是我的笔记本电脑管理电源的策略吗?

我能想到4件事:

  1. 浏览器使用一种名为JIT(实时编译)的技术来加快代码中最常用部分的执行速度。然而,为了检测哪个部分最常用,浏览器会给它一些时间。

  2. 笔记本电脑通常以较低的速度运行CPU以节省电池。然而,当CPU使用率过高时(比如你在玩游戏时),他们会提高频率,从处理器中获得更多的能量。例如Intel Speedstephttp://en.wikipedia.org/wiki/SpeedStep

  3. 一些笔记本电脑有两个图形卡(例如许多Macbook Pro)。一个是默认的Intel,用于渲染普通GUI窗口,另一个用于图形密集型应用程序。功能更强大的显卡通常默认关闭,只在需要时使用(因为它消耗更多的电池,而且系统热量会增加,系统会发出噪音)。尽管系统不太可能在运行3D应用程序的过程中更改图形卡。

  4. 这些都是你无法控制的。游戏引擎通常使用查找表来查找频繁计算的值,以加快其运行时间。您的游戏引擎可能会根据需要填充查找表。

尽管如此,这些项目都不应该需要"几分钟"才能跟上进度。通常只需要几秒钟。所以它仍然是可疑的。

我怀疑你能做什么,但。。。您可以至少使用每个WebGL着色器程序一次,并绘制每个缓冲区一次,可能会有所帮助。看看亚历克斯的答案,了解为什么可能不会。

WebGL有很多验证工作要做。大部分验证都是懒散地进行的。一个例子是,无论何时使用gl.drawElements绘制,都必须检查您的索引是否超出范围。它会这样做,并缓存您刚才使用的索引缓冲区的特定范围的答案。如果你不更新索引,它就不必再检查了。但这意味着,当你第一次用gl.drawElements画每一件东西时,都会有一个额外的检查,这样你就可以在开始游戏之前尝试画一次所有的东西。

GLSL程序也会发生类似的情况,因此使用每个程序一次可能也有助于初始化/缓存这些程序。

注意:我怀疑这会解决问题,但可能值得一试。

是由于网络负载问题导致速度慢吗。。。还是最大化CPU?

通过在的初始缓慢时期运行top或某些资源使用实用程序来区分这些原因

如果您的CPU运行得很热,则合成顶点的效率可能会很低。