2

私はこの 2d TD ゲームを Android 用に作成しています。このゲームでは私はオフです。モンスター、タワーなどのテクスチャ/グラフィックスが必要です。すべてのユニット攻撃サイクルに含まれるすべての画像を 1 つの画像に保存することにしました。別のユニットの歩行サイクル。

問題は、さまざまなユニットをたくさん持っていることです。これにより、各モンスター テクスチャの解像度を 100x100px にしたい場合、歩行ビットマップは最終的に 7000x15000px の画像になります。これは。アプリケーションがクラッシュしますが、同時にその画像内にあるすべてが必要であり、解像度を下げたくありません。メモリ不足にならずにこれらの画像を使用するにはどうすればよいですか? それとも、別の方法でグラフィックを整理する必要がありますか? もしそうなら、その方法を教えていただければ幸いです。

4

3 に答える 3

3

ちょっとした計算: あなたのビットマップは 7000x15000 ピクセル、つまり 105000000 ピクセルです。ピクセルごとに 3 バイトまたは 4 バイトが必要です (透明度があるかどうかによって異なります)。透明度を使用していると仮定すると、これは 1 ピクセルあたり 4 バイトなので、合計でそれぞれ 420000000 バイトになります。400メガバイト

したがって、セットアップを再編成する必要があります。

于 2012-09-15T14:41:29.297 に答える
1

10000枚すべての画像を使用していますか?ほとんどのゲームの完全なスプライトシートは、通常、数百から数千の範囲です。640x480の画面では、重複せずに24の異なる文字しか配置できません。単一の画面でそのサイズの異なる文字が多すぎると、混乱しすぎる可能性があります。

スプライトシートのサイズを小さくするためにできることのいくつかは、スプライトのフレームレートを小さくして、同じスプライト画像を使用して複数の連続するゲームフレームがレンダリングされるようにすることです。古いゲームの多くは、実行サイクルに6〜8フレームを使用しており、見栄えがします。より単純なクリープはさらにカットすることができ、3〜4枚の画像しか使用しません。

もう1つできることは、よりスマートなキャラクターとレベルデザインで、実際にすべてのキャラクターを同時に必要としないようにすることです。それぞれの異なる文字を独自のファイルに入れ、特定のレベルに必要なものに応じてそれらをロードできます。異なる色のスプライトを再利用して、別のスプライトのより強力なバージョンを示すこともできます。色が変更されたスプライトは、実際には別の文字としてスプライトシートに存在せず、実行時に作成されます。キャラクターに目に見える装備がある場合は、すべての組み合わせにスプライトを用意する必要はありません。代わりに、実行時に装備のスプライトをキャラクター画像に構成します。

スプライトの色深度を減らすこともできます。ほとんどの携帯電話はRGB565ピクセル形式のレンダリングをサポートしており、多くの場合、フルRGB888を使用すると実際に必要な色よりも多くなります。

また、DPIの低い受話器(一般的に電力も低い)には、低解像度の画像を使用する必要があります。それらの受話器では、100x100のスプライトは非常に特大に見えます。

また、すべてのオブジェクトに100x100ピクセルサイズのスプライトはおそらく必要ありません。多くのオブジェクトはおそらくそれよりはるかに小さいでしょう、そしてあなたはそれらのために小さいサイズのスプライトセルサイズを使うことができます。

于 2012-09-15T16:56:59.643 に答える
1

Lie が示唆しているように、一度にすべてのリソースを使用する必要がないように、ゲームを適切に構成する必要があります。現在のメモリ要件が多すぎます。ビットマップに RGB565 構成を使用するか、画像をサブサンプリングできます。現在、各フレームのメモリ要件が非常に大きいため、フレーム レートを下げるだけではうまくいきません。
画像リソースのサブサンプリングには、次のコード サンプルを使用できます。

        BitmapFactory.Options boundsOp = new BitmapFactory.Options();
        boundsOp.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(pathToFile, boundsOp);
        if(boundsOp.outWidth == -1) 
        {
            Log.i("Error", "error");   
        }

        int width = boundsOp.outWidth;
        int height = boundsOp.outHeight;
        int inSampleSize = 1;

        int temp = Math.max(width, height);
        while(temp > MAX_WIDTH)
        {
            inSampleSize *= 2;
            temp /= 2;
        }

        BitmapFactory.Options resample = new BitmapFactory.Options();
        // RGB 565 configuration
        resample.inPreferredConfig = Config.RGB_565;
        resample.inSampleSize = inSampleSize;

        //bmp = BitmapFactory.decodeFile(pathToFile, resample);
        bmp = BitmapFactory.decodeFile(pathToFile);
        bmp = Bitmap.createScaledBitmap(bmp, MAX_WIDTH, MAX_HEIGHT, true);
  • これらすべてに加えて、使用していないビットマップをリサイクルする必要もあります。
于 2012-09-15T17:34:39.223 に答える