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

时间:2012-01-04 13:50:27

标签: javascript arrays performance multidimensional-array bitmap

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

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

我正在使用一种非常基本的方法:数组数组代表我在物理不透明度方面的水平。

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

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

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

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

我对JS的了解在性能/内存方面非常有限,无法评估这种方法有多好:)不知道使用数组的效率。

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

使用以下内容,我可以确定一个条目不是“其他”而不是一点吗?

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

感谢您的时间和意见/建议!

学家

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

如果您遇到内存问题,您应该考虑实施类似这样的阵列:https://github.com/bramstein/bit-array/blob/master/lib/bit-array.js

您必须将2d数组转换为简单向量并转换x,y坐标,如下所示:offset = x +(y * width);

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

但我怀疑调用一个函数(以防你使用位数组)并在里面进行一些评估会导致较差的表现。

我认为你不能同时获得表演和节省记忆。