actionscript-3 - 内存使用量较少的位图数据替代方案?

标签 actionscript-3 flash vector bitmapdata

我使用一个非常大的 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/

相关文章:

actionscript-3 - ActionScript 可以判断 SWF 的发布时间吗?

javascript - 哪些脚本语言与 ECMA 类似?

apache-flex - 如何在ActionScript 3 Sprite中绘制文本?

javascript - 如何公开嵌入式 Flash 对象的 JavaScript 接口(interface)?

actionscript-3 - SEO , Flash 和来自外部文件的数据

apache-flex - 数字步进小数的奇怪行为

html - 使用 flash-player 在 HTML 中嵌入 MP4

c++ - 我应该如何格式化我的 .dat 文件以便制作 3D vector 图?

c++ - 如何保持在 vector 范围内?

c++ - 构建一个 vector 作为另一个 vector 的子集而不复制