画布只是一个图像,从我的经验来看,使用画布或图像在性能方面没有区别。
离线或在画布上没有什么不同,他们都会尽可能利用GPU。
使用context.getImageData()
,context.createImageData()
和context.putImageData()
应避免实时渲染,它并不需要GPU和你做它将在主内存的Javascript进行任何处理的优势。虽然数据存储在一个类型数组Uint8ClampedArray
中,并且可以转换为任何类型的类型数组,例如Uint32Array
,允许您使用一个变量处理单个像素,而不是4.还有许多用于类型化数组的原生函数,提供比标准Javascript数组更快的数组操作。
图像的限制因素(包括画布作为图像)是可用GPU RAM的数量,当超过可用RAM的数量时,浏览器将根据需要开始将图像交换到GPU RAM中,阻碍了GPU的渲染能力,与正常的RAM访问相比,从主RAM到GPU RAM的传输速度较慢。发生这种情况时,您将立即看到帧速率的损失。由于浏览器可以运行的平台种类繁多,并且无法了解机器功能,所以在发布实时应用程序时应该小心。
如果您已经为高端桌面机器编写了高分辨率图像的游戏,它在平板电脑和低端笔记本电脑上表现不佳。为了缓解这个问题,下载图像以匹配屏幕分辨率。在1/8分辨率的设备上使用招聘背景图片会给硬件带来不适当的压力。设备是用来处理屏幕的分辨率的,经过这个分辨率会产生很大的不必要的性能影响。这是您可以使用屏幕外画布以设备原始分辨率呈现图像,然后转储原始人员图像的位置。质量不会有任何损失,但性能会有很大的提高,从而将无法播放的东西变成可播放的东西。这适用于所有图形资源。切勿以高于所用设备的分辨率存储和使用图像。
由于您可以使用画布进行多种操作,因此找出最佳运行方式的最佳方法就是进行实验。监视帧速率并尝试不同的方法解决问题。如果帧速率提高,你已经找到了一个更好的做事方式,如果帧速率下降,那么你使用了错误的方法。
所以你说的是,如果我制作类似RPG和一些不同的瓷砖,我应该将它们全部渲染到屏幕外的画布上,然后从该画布获取数据并将它们放到可见区域? –
是的:)画布上放置的每个图块都有一个小的开销,因此当您在屏幕外缓冲区上绘图时,它更快,因为它不需要绘制到内存和屏幕上,它只是将其存储到内存中。 –
多个画布会对游戏开发更有益吗?一个用于瓷砖,一个用于我的主要角色,例如? –