用于简单碰撞检测的Javascript位图

用于简单碰撞检测的Javascript位图,javascript,arrays,performance,multidimensional-array,bitmap,Javascript,Arrays,Performance,Multidimensional Array,Bitmap,我需要帮助/建议来改进/评论我当前的设计(请:) 这与简单游戏中的碰撞检测有关:动态物体(移动物体)可能与静态物体(即地面、墙壁)碰撞。我正在将我的Obj-C模型移植到Javascript,并且在实现这一点的方式上面临内存/性能问题 我使用的是一种非常基本的方法:数组的数组表示我的物理不透明度级别 位设置为0:透明区域,物体可以通过 位设置为1:不透明区域,实体碰撞 测试像素的透明度/不透明度的步骤如下: if (grid[x][y]) { // collide! } 我对JS的了解在性

我需要帮助/建议来改进/评论我当前的设计(请:)

这与简单游戏中的碰撞检测有关:动态物体(移动物体)可能与静态物体(即地面、墙壁)碰撞。我正在将我的Obj-C模型移植到Javascript,并且在实现这一点的方式上面临内存/性能问题

我使用的是一种非常基本的方法:数组的数组表示我的物理不透明度级别

  • 位设置为0:透明区域,物体可以通过

  • 位设置为1:不透明区域,实体碰撞

测试像素的透明度/不透明度的步骤如下:

if (grid[x][y]) {
 // collide!
}
我对JS的了解在性能/内存方面非常有限,无法评估这种方法有多好:)不知道使用数组的效率

想象一下一个1000像素宽的600像素高的水平。这是一个小级别,但这已经意味着一个数组包含1000个数组,每个数组最多包含600个条目。此外,我还没有找到一种方法来确保像低级语言那样创建1位大小的元素

使用下面的方法,我可以确保一个条目不是一点以外的“其他”东西吗

grid[x][y] = true;
grid[x][y] = false;
感谢您的时间和意见/建议


J.

如果你有一个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;
}

布尔值不会仅存储为一位,对于我所知道的任何其他语言(包括C语言)也是如此

如果你有内存问题,你应该考虑像这样执行一个位数组:

你必须把你的二维数组变成一个简单的向量,然后像这样转换你的x,y坐标:offset=x+(y*width)

浏览数组仍然会导致乘法来计算偏移量,因此使用向量与数组等效

但我怀疑调用函数(如果使用位数组)并在内部进行一些计算会导致性能下降


我认为你不能同时获得性能和节省内存。

嘿,这是一个非常有趣的想法,我非常喜欢。在第一个方案中,使用字符串“1x3”作为数组中的索引。我认为“10000x1000”是最长的值,即11个字符。就内存而言,这不是仍然很大吗?@jeM680000:我不会说“很大”,但它显然会有一些用途。我刚刚做了一些测试,单阵列似乎是最有效的(约11000k)。接下来是多个阵列(~14000kb),地图使用~25000k)。(假设输入为1000x1000)(请参阅我使用的测试;我检查了XP SP3上Chrome 16中一个选项卡的内存使用情况)嘿,谢谢,太棒了。感谢您抽出时间,让我也了解了jsperf。非常感谢!顺便说一句,有没有人提供每种值类型的内存使用率的参考?我在这里找到了这个,但无法与其他来源确认: