我使用一个非常大的 BitmapData 作为我的平台游戏的路径图,但是我只使用像素来表示 4 个特定值,而不是 4294967295。
将此位图数据转换为 bool 值的 2 个二维向量会节省一些内存吗? 如果是这样,性能如何,做这样的事情会更快还是更慢:
MapGetPixel(x:int, y:int):int
{
return MapBoolFirst[x][y] + MapBoolSecond[x][y]*2;
}
而不是位图数据类 getPixel32(x:int, y:int):uint
?
简而言之,我正在寻找一种方法来减小大小和/或优化我的 4 色位图数据。
编辑: 使用我的 bool 方法显然比位图数据消耗的内存多 2 倍。 我想一个 bool 值在内存中占用的空间不止一位,否则就太容易了。所以我正在考虑对 int 进行位移位,从而让 int 存储几个像素的值,但我对此不确定……
编辑 2: 使用 int bitshifts 我可以将 16 个像素的数据管理到一个 int 中,这个技巧应该可以节省一些内存,即使它可能会稍微影响性能。
最佳答案
位移位将是最优化内存的处理方式。在性能方面,这应该不是什么大问题,除非您需要在每一帧中轮询大量请求。 AS 的问题是 bool 值是 4 位 :(
如我所见,您可以在不同情况下处理它:
1) 为命中检测创建一个较低分辨率的纹理,通常可以将其缩小 4 倍 (256x256 --> 64x64)
2) 使用某种技术将该数据保存到某种存储中(bool 是最简单的,但如果它太大,那么你需要为它找到另一种解决方案)
3) 进行整数求解(我之前没有使用过位移位,所以我认为这将是一个有趣的挑战,结果如下)
而且该解决方案比用于 bool 值的解决方案小得多,也更难理解:/
public class Foobar extends MovieClip {
const MAX_X:int = 32;
const MAX_Y:int = 16;
var _itemPixels:Vector.<int> = new Vector.<int>(Math.ceil(MAX_X * MAX_Y / 32));
public function Foobar() {
var pre:Number = System.totalMemory;
init();
trace("size=" + _itemPixels.length);
for (var i = 0; i < MAX_Y; ++i) {
for (var j = 0; j < MAX_X; ++j) {
trace("item=" + (i*MAX_X+j) + "=" + isWalkablePixel(j, i));
}
}
trace("memory preInit=" + pre);
trace("memory postInit=" + System.totalMemory);
}
public function init() {
var MAX_SIZE:int = MAX_X * MAX_Y;
var id:int = 0;
var val:int = 0;
var b:Number = 0;
for(var y=0; y < MAX_Y; ++y) {
for (var x = 0; x < MAX_X; ++x) {
b = Math.round(Math.random()); //lookup the pixel from some kind of texture or however you expose the items
if (b == 1) {
id = Math.floor((y * MAX_X + x) / 32);
val = _itemPixels[id];
var it:uint = (y * MAX_X + x) % 32;
b = b << it;
val |= b;
_itemPixels[id] = val;
}
}
}
}
public function isWalkablePixel(x, y):Boolean {
var val:int = _itemPixels[Math.floor((y * MAX_X + x) / 32)];
var it:uint = 1 << (y * MAX_X + x) % 32;
return (val & it) != 0;
}
}
关于actionscript-3 - 内存使用量较少的位图数据替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19964322/