javascript - 如何提高画布性能
问题描述
如果可能达到数百万艘船,我想将游戏从 1 艘船扩展到 10 000 艘船的舰队。
画布绘制所有你告诉他画的东西,即使它是负坐标。所以我只绘制显示范围内的游戏对象。
我在任何地方都使用了 ES5,它更快且支持更多。缩放和旋转计算由相机、鼠标和键盘事件进行(不能仅适用于火箭和激光束)。
但是这部分代码使用了主要时间,用于显示范围内的每个游戏对象(可能有数千个游戏对象或很少):
`ctx.save()
ctx.translate(drawX, drawY);
ctx.rotate(alfa);
ctx.drawImage(images.image, -width/2, -height/2, width, height);
ctx.restore()`
我怎样才能让它更快?
提高性能最好的方法是什么?现在我考虑ctx.rotate(alfa)
根据事件删除和旋转图像并使用旋转图像并使用当前比例调整该图像的大小(仅适用于显示范围内的对象)。
谢谢。
解决方案
如果您尝试仅在 2d 画布中渲染数千个(更不用说一百万个)独立事物,您可能会遇到严格的限制。使用 WebGL 可能会更好,也许使用像PixiJS这样的库。
但是,如果您仍打算使用画布,用户 Blindman67 在另一个问题中给出了一些关于性能的好技巧。简而言之,对于您的情况,请避免使用save
/restore
并setTransform
改为使用,并绘制尺寸为 2 次方(2、4、8、16、32 等)的图像。
推荐阅读
- python - 如何使用 PyQt5 处理多用户数据库交互
- twilio - Twillio 验证 - 如何在每次通话时发送唯一代码?
- swift - 如果用户取消 WEBDAV 存储库上的文件上传,文件将损坏
- google-apps-script - 将 Arrayformula 转换为 INDEX&MATCH 以获取 googleform 响应
- cocoapods - 如何为私有 pod 指定用户名
- java - 将搜索功能从字符串更改为整数
- python - 如何对两个以上的类别进行空间情绪分析
- node.js - 按电话号码跟踪链接点击次数
- image - 如何在反应本机应用程序中通过相机(反应本机图像选择器)捕获和渲染多个图像
- javascript - 如何在 Spring MVC 的 JSP 登录页面中实现记住我?