2009-04-13 14 views
1

私はUIImageを使用して32x32ブロックからゲームマップをレンダリングしています。コードは次のとおりです。iPhoneでUIImageでさまざまな画像をレンダリングするとパフォーマンスが低下する理由

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回レンダリングすると)、フルフレームレートになります。

私はそれが異なるUIImagesからレンダリングするのは高価だとは思いません。

誰かがああ、私はCGImageCreateWithImageInRectを使用して、より大きなテクスチャページから作成された私のイメージリストを言及するのを忘れてしまった...私が間違ってやっている

を教えてくださいでした。

おかげ リッチ

+0

別々のファイルからロードされた異なるテクスチャ/画像img_list参照して、各インデックスしていますか? – Venesectrix

+0

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

+0

あなたの質問には申し訳ありません、いいえ。 – Rich

答えて

1

クラックオープンインスツルメンツとあなたのコードをプロファイリング。 UIViewはレイヤーバックされているので、drawAtPoint:は画面に表示される前に数回(オフスクリーンバッファーに)イメージを描画する必要があります。

つまり、UIImageは実際にゲーム用に設計されたものではありません。 UIKitの一部としてのオーバーヘッドはかなりあります。あなたは本当にそれらの何百もあることを意味していません。スピードの約のために

(最も遅い最速へ):あなたは罰金アニメーションコントロールが必要な場合(

  • CALayers(あなたはいくつかの大規模なイメージを持っている場合は、通常使用される)か、に約20を持っている

    • UIImage 100タイル/画像)
    • OpelGLテクスチャ(ほとんどのゲームが使用すべきか)
  • +0

    ありがとう、私はopenglにまっすぐ行くつもりだったが、ドキュメントはCGDrawImageが非常にoptmiziedであったことを私に説得し続けた。タイル張りの背景だけが必要なので、十分に良いと思った。 – Rich

    関連する問題