2012-01-04 121 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);

浏览一个数组仍然会导致一个乘法来计算偏移量,所以使用一个向量相当于数组。

但我怀疑调用一个函数(如果你使用位数组)并在里面做一些评估会导致较差的性能。

我不认为你可以在同一时间获得表演并节省内存。