我需要帮助/建议来改进/评论我目前的设计:)
这涉及简单游戏中的碰撞检测:动态物体(移动物体)可能与静态物体(即地面,墙壁)碰撞。我正在将我的Obj-C模型移植到Javascript,并且我正在面对关于我实现这个问题的方式的内存/性能问题。
我正在使用一种非常基本的方法:数组数组代表我在物理不透明度方面的水平。
位设置为0:透明区域,正文可以通过
位设置为1:不透明区域,实体碰撞
测试像素的透明度/不透明度如下:
if (grid[x][y]) {
// collide!
}
我对JS的了解在性能/内存方面非常有限,无法评估这种方法有多好:)不知道使用数组的效率。
想象一下1000像素宽的水平,高600像素。它是一个小级别,但这已经意味着一个包含1000个阵列的数组,每个阵列最多包含600个条目。此外,我还没有找到一种方法来确保我创建像低级语言一样的1位大小的元素。
使用以下内容,我可以确定一个条目不是“其他”而不是一点吗?
grid[x][y] = true;
grid[x][y] = false;
感谢您的时间和意见/建议!
学家
答案 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);
浏览数组仍然会导致乘法来计算偏移量,因此使用向量相当于数组。
但我怀疑调用一个函数(以防你使用位数组)并在里面进行一些评估会导致较差的表现。
我认为你不能同时获得表演和节省记忆。