它是否要求过多的画布来重绘游戏循环中的所有内容?

时间:2011-04-27 14:26:06

标签: javascript html5 canvas

I've started a Breakout game in Canvas

此刻,我只编写了块和播放器的显示。

当游戏需要自我更新(每10分钟左右)时,它需要调用draw(),目前将根据玩家,块和球的当前状态重新绘制整个画布。

它的表现开始成为一个问题。

每帧重绘整个画布绝对不是一个好主意吗?我应该改变我的代码只绘制正在改变的部分吗?

4 个答案:

答案 0 :(得分:8)

首先关闭:是的,更改代码只绘制正在更改的部分可能有用,但是您应该始终使用自己的代码测试特定的改进,因为任何一个优化的性能因应用程序而异(有时很大)。

但它不仅绘图会导致缓慢。例如,确保您不会重新计算/重建绘制循环中永不改变的任何内容。

另外,如果您有很多物品,除非必须,否则不要设置fillStyle,这意味着通过将填充设置为一种颜色可以进行优化,绘图该颜色的所有对象,然后设置第二个填充颜色等

最后,我建议您编写整个游戏(或大部分游戏),然后返回并进行优化。

Canvas需要进行大量优化。我最近开始制作一本关于游戏相关性能增强的指南,希望它能在今年结束时完成。

答案 1 :(得分:3)

你必须要确保,但我不同意这里的两个答案。在我的简单测试中,尝试清除和重绘画布的特定区域会产生稍差的性能,而不是更好。

您可以在此处查看我的测试:http://phrogz.net/tmp/image_move_sprites_canvas.html

但这取决于您的需求。如果您有数百个不需要更新的项目,并且只有一小部分画布会更改每个帧,那么清理和重新绘制该部分可能会很好。

答案 2 :(得分:0)

  

每帧重绘整个画布绝对不是一个好主意吗?

不,有时这是一个非常好的主意

  

它的性能开始成为一个问题

但不是那么。

尽管如此,你的代码并不复杂,没有什么可以导致明显的大幅减速。你是如何衡量其表现的?

答案 3 :(得分:0)

首先,我将所有这些从init()中取出:

canvas = document.createElement('canvas');
canvas.width = 400;
canvas.height = 300;
ctx = canvas.getContext('2d');
document.body.appendChild(canvas);

每毫秒处理这个问题毫无意义!

其次,看看这个:http://paulirish.com/2011/requestanimationframe-for-smart-animating/