javascript拼接导致画布中的延迟
我有一个简单的跑步游戏,平台从右向左滚动。这些平台存储在一个数组中,当它们离开屏幕时,我使用array.splice(索引,1)将其删除。然而,这在调用第二个接头时会导致非常轻微的滞后。我也使用了Array.shift(),但我仍然可以看到调用时帧速率的轻微下降。有没有更好的方法来移除/销毁某些东西javascript拼接导致画布中的延迟,javascript,canvas,Javascript,Canvas,我有一个简单的跑步游戏,平台从右向左滚动。这些平台存储在一个数组中,当它们离开屏幕时,我使用array.splice(索引,1)将其删除。然而,这在调用第二个接头时会导致非常轻微的滞后。我也使用了Array.shift(),但我仍然可以看到调用时帧速率的轻微下降。有没有更好的方法来移除/销毁某些东西 for(var x = 0; x < platforms.length; x++){ var platform = platforms[x]; platform.x -= 1
for(var x = 0; x < platforms.length; x++){
var platform = platforms[x];
platform.x -= 10;
if(platform.x + platform.width < 0){
platforms.shift();
}
}
for(var x=0;x
您无法从阵列中删除项目
改为使用固定大小的数组(大到足以存储所有需要的项目),并将不想再渲染的项目标记为已取消,以后可以重用这些标记的插槽
或者,如果问题所在的领域允许,您可以直接覆盖元素
[编辑]
针对这些评论,还有一些考虑:
附加标志的计算是时间上稳定的计算,这意味着您可以预见它们需要多少时间,并查看它们是否适合以特定帧速率渲染的帧<另一方面,代码>数组.拼接可以触发垃圾收集,这可能比其他语言控制流构造的时间长一些数量级
垃圾收集是一项密集型任务,应该不惜一切代价避免在游戏主循环中进行垃圾收集,以实现流畅的帧速率。这里有一些资源和其他问题详细阐述了这一点,例如:您不能从数组中删除项 改为使用固定大小的数组(大到足以存储所有需要的项目),并将不想再渲染的项目标记为已取消,以后可以重用这些标记的插槽 或者,如果问题所在的领域允许,您可以直接覆盖元素 [编辑] 针对这些评论,还有一些考虑:
附加标志的计算是时间上稳定的计算,这意味着您可以预见它们需要多少时间,并查看它们是否适合以特定帧速率渲染的帧<另一方面,代码>数组.拼接可以触发垃圾收集,这可能比其他语言控制流构造的时间长一些数量级
垃圾收集是一项密集型任务,应该不惜一切代价避免在游戏主循环中进行垃圾收集,以实现流畅的帧速率。这里有一些资源和其他问题详细阐述了这一点,例如:您不能从数组中删除项 改为使用固定大小的数组(大到足以存储所有需要的项目),并将不想再渲染的项目标记为已取消,以后可以重用这些标记的插槽 或者,如果问题所在的领域允许,您可以直接覆盖元素 [编辑] 针对这些评论,还有一些考虑:
附加标志的计算是时间上稳定的计算,这意味着您可以预见它们需要多少时间,并查看它们是否适合以特定帧速率渲染的帧<另一方面,代码>数组.拼接可以触发垃圾收集,这可能比其他语言控制流构造的时间长一些数量级
垃圾收集是一项密集型任务,应该不惜一切代价避免在游戏主循环中进行垃圾收集,以实现流畅的帧速率。这里有一些资源和其他问题详细阐述了这一点,例如:您不能从数组中删除项 改为使用固定大小的数组(大到足以存储所有需要的项目),并将不想再渲染的项目标记为已取消,以后可以重用这些标记的插槽 或者,如果问题所在的领域允许,您可以直接覆盖元素 [编辑] 针对这些评论,还有一些考虑:
附加标志的计算是时间上稳定的计算,这意味着您可以预见它们需要多少时间,并查看它们是否适合以特定帧速率渲染的帧<另一方面,代码>数组.拼接可以触发垃圾收集,这可能比其他语言控制流构造的时间长一些数量级 垃圾收集是一项密集型任务,应该不惜一切代价避免在游戏主循环中进行垃圾收集,以实现流畅的帧速率。这里有一些资源和其他问题详细阐述了这一点,例如:移位和拼接是“慢”函数。他们可能会重建整个阵列 想象一下有一个有1000件物品的区域。一个转变可能是“创建一个包含所有项(第一项除外)的新数组”。如果您的前100个项目现在导致移位,那么您将重建100个阵列,其中包含900-1000个项目,这将导致大约100.000个插入,100个新的阵列分配
for(var i = 0; i < array.length; i++)
{
if (array[i] == ....)
{
var newArray = new Array(array.length - 1);
for(var o = 1; o < array.length; o++)
newArray[o - 1] = array[o];
array = newArray
}
}
因此,这将是50万次迭代和阵列的重新创建。虽然这可以通过1次迭代(动态大小的数组)或2次传递(固定大小的数组)来修复:
//动态大小
var newArray=newArray();
对于(var i=0;i
和另一个简单的优化,为您的
for ( i = 0 to 1000 )
for ( o = i to 1000 )
recreate the array
// dynamic size
var newArray = new Array();
for(var i = 0; i < array.length; i++)
{
if (array[i] != ....)
newArray.push(array[i]);
}
array = newArray;
// fixed size
var cnt = 0;
for(var i = 0; i < array.length; i++)
if (array[i] != ....)
cnt++;
var newArray = new Array(cnt);
for(var i = 0, o = 0; i < array.length; i++)
if (array[i] != ....)
newArray[o++] = array[i];
array = newArray;
for(var i = 0, l = array.length; i < l; i++)