陣列的數量,我需要檢查的對象是否是在距離它顯示到屏幕上(它的一個側滾輪視頻遊戲)快速地找到對象在JavaScript
到目前爲止,我還這個:
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)的量和這個被執行每秒(每秒60幀)的60倍
我該如何解決這個問題?
謝謝! :)
編輯:試圖將canvas.height緩存到循環前的變量(例如:var height = canvas.height;)。沒有性能差異(I5 2500K上44 ms vs 44 ms,想象在手機上!)。
編輯:在循環之前嘗試緩存Coins.length(例如:var len = Coins.length;)。沒有性能差異(44毫秒vs 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,你應該[讓它爲你處理剔除](http://stackoverflow.com/questions/16893626/should-i-cull-elements-before-rendering-to-html5-canvas-或者,讓最帆布剔除)。 –
似乎最明顯的將是a)只繪製可見的硬幣或b)只有當他靠近它們時刷新硬幣。 –
簡單地緩存canvas.height到一個var之前,循環將有相當大的幫助。緩存worldObj.distance也會很好。 – dandavis