javascript拼接导致画布中的延迟

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

我有一个简单的跑步游戏,平台从右向左滚动。这些平台存储在一个数组中,当它们离开屏幕时,我使用array.splice(索引,1)将其删除。然而,这在调用第二个接头时会导致非常轻微的滞后。我也使用了Array.shift(),但我仍然可以看到调用时帧速率的轻微下降。有没有更好的方法来移除/销毁某些东西

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++)