如何提升JavaScript Canvas大地图纹理图案的渲染性能
性能优化思路
- 优先做视口裁剪,避免绘制不可见区域
你当前每帧都在绘制完整的12500×12500甚至25000×12500尺寸的矩形,而实际屏幕可视区域通常只有1~2K分辨率,90%以上的绘制内容都是不可见的无效计算。你可以先通过相机坐标、缩放系数计算出当前屏幕对应的世界坐标边界,每个地形区块仅绘制和可视边界相交的部分,仅这一项优化就能把帧率拉回满帧水平。 - 使用离屏Canvas预缓存纹理
如果你的游戏缩放档位是固定的,可以提前将不同地形的重复纹理预渲染到对应缩放级别的离屏Canvas上,每帧直接将离屏Canvas的可见区域绘制到主画布,避免重复调用createPattern相关的采样计算。 - 优化纹理资源本身
纹理素材尺寸请调整为2的幂次(比如256×256、512×512),GPU对2的幂次纹理的采样效率远高于非规则尺寸,非2的幂次的纹理浏览器需要做额外的对齐处理,会大幅消耗绘制性能。同时尽量减小纹理素材的体积,只要重复视觉效果满足需求,纹理越小采样越快。 - 移除帧循环中的冗余逻辑
不要在animate帧循环里每次都调用getElementById查询DOM,DOM查询的开销远高于JS变量读写。你可以给对应的复选框绑定change事件,把是否启用纹理的状态存在一个JS变量里,帧循环里直接读取变量即可。 - 强制开启硬件加速
给Canvas元素添加CSS属性transform: translateZ(0),强制浏览器将Canvas提升为独立的GPU合成层,大幅提升绘制性能。
内容的提问来源于stack exchange,提问作者DarePhoenix
相关产品推荐
相关产品推荐

