2012-01-04 324 views
2

的Javascript位圖我需要幫助/建議進行改進/發表評論我目前的設計,請:)簡單的碰撞檢測

這涉及到碰撞檢測在一個簡單的遊戲:動態物體(移動的)可能與靜態物體碰撞(即地面,牆壁)。我正在將我的Obj-C模型移植到Javascript中,並且正面臨着關於我的實現方式的內存/性能問題。

我正在使用一種非常基本的方法:數組數組代表了我在物理不透明度方面的水平。

  • 位設置爲0:透明區域,機構可以順利通過

  • 位設置爲1:不透明的面積,體碰撞

測試的透明度像素/阻簡單如下所示:

if (grid[x][y]) { 
// collide! 
} 

我對JS的認識相當有限, e /內存,並且不能評估這種方法有多好:)不知道使用數組的效率。

想象一下600像素高的1000像素寬的水平。這是一個小的層次,但這已經意味着一個包含1000個數組的數組,每個數組最多包含600個條目。此外,我還沒有找到一種方法來確保我創建一個像低級語言一樣的1位大小的元素。

使用以下內容,我可以確定一個條目不是「別的」而不是一點東西嗎?

grid[x][y] = true; 
grid[x][y] = false; 

感謝您的時間和意見/建議!

J.

+0

順便說一句,有沒有人蔘考每個值類型的內存使用情況?我在這裏發現了這個,但無法用其他來源證實它:http://stackoverflow.com/questions/1248302/javascript-object-size – Jem 2012-01-04 14:12:48

回答

1

如果你有一個爲1000x600網格,你能保證你在內存至少601門陣列(1001,如果你做輪用另一種方式)。

而不是這樣做,我會考慮使用1陣列或(最好)一個對象與映射方案。

var map = {}; 
map["1x1"] = 1; 
map["1x3"] = 1; 
// assume no-hits are empty and free to move through 

function canGoIn(x, y) { 
    return map.hasOwnProperty(x + "x" + y); 
}; 

交替地;

var map = []; 
var width = 600; 
map.push(0); 
map.push(1); 
// etc 

function canGoIn(x, y) { 
    return map[(x * width) + y] == 1; 
} 
+0

嘿,這是一個非常有趣的想法,我非常喜歡它。在您的第一個提議中,您正在使用字符串「1x3」作爲數組中的索引。我想象「10000x10000」是最長的值,即11個字符。在內存方面,這不算很大嗎? – Jem 2012-01-04 14:05:16

+0

@ jeM680000:我不會說「巨大」,但它顯然會有一些*使用。我剛剛做了一些測試,看起來單個陣列是最有效的(〜11000k)。接下來的多個數組(〜14000kb)和地圖使用〜25000k)。 (假設輸入爲1000x1000)(請參閱http://jsperf.com/quickest-way-to-represent-a-map瞭解我使用的測試;我檢查了XP SP3上Chrome 16中的選項卡的內存使用情況) – Matt 2012-01-04 14:12:35

+0

Hey謝謝你太棒了。感謝你的時間,也讓我瞭解了jsperf。非常感激! – Jem 2012-01-04 14:23:37

0

布爾值將不會被存儲爲只有一位,並且對於我知道的任何其他語言(包括C)也是如此。

如果您有內存問題,您應該考慮實施bitarray像這樣的:https://github.com/bramstein/bit-array/blob/master/lib/bit-array.js

你必須讓你的二維數組到一個簡單的載體,將你的x,y座標如下:偏移量= x +(y * width);

瀏覽一個數組仍然會導致一個乘法來計算偏移量,所以使用一個向量相當於數組。

但我懷疑調用一個函數(如果你使用位數組)並在裏面做一些評估會導致較差的性能。

我不認爲你可以在同一時間獲得表演並節省內存。