1

UIImage を使用して、32x32 ブロックからゲーム マップをレンダリングしています。コードは次のとおりです。

for( int x = 0; x < rwidth; ++x)
{
    for(int y = 0; y < rheight; ++y)
    {
        int bindex = [current_map GetTileIndex:x :y];
        CGPoint p;
        p.x = x * tile_size_x;
        p.y = y * tile_size_x;
        [img_list[bindex] drawAtPoint:p];
    }
}

これにより、約 150 個のタイルがレンダリングされます。私の問題は、このコードを実行すると、レンダリング時間が 1 秒あたり 2 ~ 3 フレームになることです。

iPhone はフィル バウンドだと思っていましたが、強制的に bindex = 1 にすると (つまり、同じブロックを 150 回レンダリングすると)、フル フレームレートになります。

異なる UIImage からレンダリングするのにそれほどコストがかかるとは信じられません。

誰かが私が間違っていることを教えてください...

ああ、CGImageCreateWithImageInRect を使用してより大きなテクスチャ ページから作成したイメージ リストについて言及するのを忘れていました。

ありがとうリッチ

4

1 に答える 1

1

Instrumentsをクラックして開き、コードのプロファイルを作成します。UIViewに描画しているように見えますが、実際にはゲーム用に最適化されていません。UIViewはレイヤーバックであるため、drawAtPoint:画像を画面に表示する前に(オフスクリーンバッファーに)数回描画する必要があります。

そうは言っても、UIImageは実際にはゲーム用に設計されていません。UIKitの一部であるということに関しては、多くのオーバーヘッドがあります。あなたは本当に何百ものそれらを持っていることを意味していません。

速度のおよその順序(最も遅いものから最も速いものへ):

  • UIImage(通常、大きな画像がいくつかある場合に使用されます)
  • CALayers(細かいアニメーション制御が必要な場合、または約20〜100個のタイル/画像がある場合)
  • OpelGLテクスチャ(ほとんどのゲームで使用する必要があるもの)
于 2009-04-13T18:09:45.103 に答える