【发布时间】:2014-06-04 01:42:01
【问题描述】:
我需要检查一个物体是否在远处以将其显示到屏幕上(它是一个横向卷轴视频游戏)
到目前为止,我有这个:
for ( var i=0; i < Coins.length; i++ )
{
var obj = Coins[i];
if ( worldObj.distance > obj.distance && worldObj.distance < obj.distance + canvas.height )
{
DrawCoins(obj);
}
}
其中worldObj.distance是玩家走过的距离,obj.distance是物体的距离。
问题:
由于关卡中的硬币数量(超过 10,000 个),此 for 循环会导致移动设备的性能大幅下降,并且每秒执行 60 次(60 fps)
我该如何解决这个问题?
谢谢! :)
编辑:尝试在循环之前将 canvas.height 缓存到变量中(例如: var height = canvas.height; )。没有性能差异(I5 2500K 上的 44 毫秒与 44 毫秒,想象一下在移动设备上!)。
编辑:尝试在循环之前缓存 Coins.length,(例如: var len = Coins.length; )。没有性能差异(44 毫秒与 44 毫秒)。
编辑:这就是我创建硬币的方式:
for(var i=0; i<10000; i++)
{
/* Coins */
for ( var z=0; z < 6; z++ )
{
if ( RNG(0,100) < Upgrades.coinChance ) // random number generator, Upgrades.coinChance = 5; -> 5% chance
{
Coins.push({ active: 1, type: "Gold", cash: 5, x: 60*(z+1), distance: i*RNG(20,100) });
}
}
}
【问题讨论】:
-
你是怎么画硬币的?如果你使用的是 HTML5 Canvas,你应该let it handle culling for you。
-
似乎最明显的方法是 a) 只画可见的硬币或 b) 只在靠近硬币时刷新硬币。
-
在循环之前简单地将 canvas.height 缓存到 var 中会有很大帮助。缓存 worldObj.distance 也很好。
-
您可以根据硬币的 X 坐标将硬币放入二叉搜索树中。通过这种方式,您可以抓取树的整个分支并简单地刷新屏幕 X 坐标范围内的那些特定硬币。
-
不一定是这个目的,但你可以给Crossfilter一试。
标签: javascript arrays html object side-scroller