3

プラットフォーマー ゲームのパス マップとして非常に大きな BitmapData を使用していますが、4294967295 ではなく、特定の 4 つの値にのみピクセルを使用しています。

この Bitmapdata をブール値の 2 つの 2D ベクトルとして変換すると、メモリが節約されますか? もしそうなら、パフォーマンスについてはどうですか?

MapGetPixel(x:int, y:int):int
{
    return MapBoolFirst[x][y] + MapBoolSecond[x][y]*2;
}

bitmapdata クラスの代わりにgetPixel32(x:int, y:int):uint?

要するに、サイズを縮小したり、4 色のビットマップデータを最適化したりする方法を探しています。

編集: 私のブール値メソッドを使用すると、bitmapdata の 2 倍のメモリを消費するようです。ブール値はメモリに1ビット以上かかると思います。そうしないと簡単すぎます。したがって、int をビットシフトすることを考えているため、int に複数のピクセルの値を格納しますが、これについてはよくわかりません…</p>

編集 2: int bitshifts を使用すると、16 ピクセルのデータを単一の int に管理できます。このトリックは、おそらくパフォーマンスが少し低下する場合でも、メモリを節約するために機能するはずです。

4

3 に答える 3

1

ビットシフトは、それを処理する最もメモリ最適化された方法です。パフォーマンスに関しては、フレームごとに多くの問い合わせをポーリングする必要がない限り、それほど大きな問題にはなりません。AS の問題は、ブール値が 4 ビットであることです:(

私が見るように、さまざまなケースでそれを処理できます。

1) ヒット検出用に低解像度のテクスチャを作成します。通常は 4 倍に縮小しても問題ありません (256x256 --> 64x64)。

2)そのデータをある種のストレージに保存する何らかの手法を使用します(boolが最も簡単ですが、それが大きすぎる場合は、別の解決策を見つける必要があります)

3) 整数解を実行します(これまでビットシフトを使用したことがなかったので、これは楽しい挑戦になると思いました。その結果は次のとおりです)。

そして、そのソリューションは、ブール値に使用されるソリューションよりもはるかに小さく、理解するのもはるかに困難です:/

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;
    }
}
于 2013-11-14T03:39:36.980 に答える
0

Here are the results, I was using an imported 8 bit colored .png by the way, not sure if it changes anything when he gets converted into a BitmapData.

Memory usage :

  • BitmapData : 100%
  • Double Boolean vectors : 200%
  • Int Bitshifting : 12%

So int bitshifting win hands down, it works pretty much the same way as hexadecimal color components, however in that case I store 16 components (pixel values in 2 bits) not the 4 ARGB:

var pixels:int = -1;// in binary full of 1
for (var i:int = 0; i < 16; i++)
    trace("pixel " + (i + 1) +" value : " + (pixels >> i * 2 & 3));

outputs as expected : "pixel i value : 3"

于 2013-11-14T14:57:06.257 に答える