2012-01-25 27 views
3

PNG 32ビットフォーマットで約30個のテクスチャが与えられました。すべてのテクスチャのサイズは同じです(iPad画面よりも広い)。サイズは正方形ではなく、高さでも幅でも2の累乗ではありません。同じテクスチャはiPhone版のゲームで使用するためのものです。OpenGL ES/Cocos2dのテクスチャを最適化するためのレシピ

ゲームでは、これらのテクスチャはアニメーションに使用されるものとみなされます(各テクスチャはアニメーションのフレームです)。もちろん、それぞれ4MBを使用する30個のテクスチャは、アニメーション化するのが非常に高速ではなく、メモリ消費量は許容できるレベルに近くありません。

OpenGL ESとCocos2dの初心者で、私はレシピを探していますどのようにこれらのテクスチャとテクスチャを一般的に最適化できるのですか

私は対処すべきテクスチャに関する追加情報:すべてのテクスチャは、同じグラデーションの背景(海の表面)と異なる(波の)領域を持ちます。それぞれの波はややユニークで、波はほぼすべてのテクスチャを占めています。テクスチャはFlashから書き出されます(最初はベクトル画像です)。

答えて

6

最初のアドバイス:デザインを変更してください。それがあなたのものでない場合は、必要に応じて鈍器を使用してください。これは合理的にうまくいくことはほとんどありません。

アニメーション中にテクスチャを頻繁に読み込んだりアンロードしたりして、メモリ消費量をチェックする必要があります。これにより、アニメーションの達成可能なフレームレートが制限されます。 iPadや4世代のデバイスでは最高30-40 fpsになると思われます.1〜3世代のデバイスではおそらく非常に遅いでしょう。

最適な最適化は、Flashでエクスポートされたフルスクリーンテクスチャを使用しないことです。基本的に、Flashはあなたのためにすべてをアニメーション化し、各アニメーションフレームのフルスクリーンイメージを出力します。 これは、モバイルデバイス用のアニメーション用の最悪の解決策です。

代わりに、cocos2d内のすべてのアニメーションを個々のイメージとcocos2dアクションを使用して再作成して、同じアニメーションまたは十分に近いアニメーションを作成します。それはより多くのコーディング作業ですが、それはより良く機能します。 LevelHelperのようなツールがありますが、アニメーションのリアルタイムプレビューを表示できるかどうかはわかりません。 tool that can import Flash timeline animationsもありますが、どれくらいうまく動作しているか、まったく動作しているかどうかはわかりません。

Texture Packerを使用すると、個々のイメージからテクスチャアトラスを作成し、メモリを節約し、特にCCSpriteBatchNodeと組み合わせてレンダリングをさらに高速化できます。 Plus Texture Packerを使用すると、さまざまなテクスチャ形式を試すことができ、非Retinaデバイスをサポートしたい場合はSD解像度イメージを書き出すことができます。

もう1つの最適な最適化は、可能な限り色のビット深度を減らすことです。 32ビットから16ビット(RGBA4444またはRGBA5551または必要な透明度に応じてRGB565)にすると、すでにメモリ消費量を半分に減らすことができ、レンダリング速度も少し向上します。

可能であれば、PVR圧縮形式のうちの1つを使用してください。特に、移動するスプライトで劣化した画質がほとんど目立たないため、常に移動しているスプライトについては、

しかし、グラデーションについて言及しているので、色のビット深度が減ることで最も影響を受けます。単純なグラデーションの場合は、グラデーションの背景をCCLayerGradientに置き換えて背景画像のメモリを節約できます。

最後に、小さな画像を使用して拡大縮小することができます。特に透明な画像の場合、画像を拡大してぼかして表示するという事実は、実際には有益なことがあります。

  • はフラッシュ(本当に悪いアイデア)によってエクスポートされたフルスクリーンテクスチャを使用していない、非常に少なくとも、cocos2d
  • 用のFlashのタイムラインアニメーションのインポートツールを試すアニメーション個々の画像を使用します。要約すると

    cocos2dの機能を使用して

  • テクスチャのアトラス(とスプライトのバッチ処理)を使用してメモリ消費量を減らし、速度を上げます。
  • 色のビット深度をできるだけ減らしてもう少しメモリを増やします
  • 高速/常に動画用の非可逆圧縮フォーマットPVRの実験
  • 小さい画像を使用して、
+0

貴重なアドバイスをいただきありがとうございます。上記のことはすべて意味があります。現在、エクスポートされたテクスチャから離れ、アニメーションパーツのサイズとビット深度を最適化することを決めました。 – Bobrovsky

6

1それらをスケールアップ)を使用PVRテクスチャの代わりにPNG画像。 PVRは、PNGよりも読み込み速度が速く、さまざまな形式と品質を提供します。圧縮されたバリアントでは、メモリ使用量も少なくなります。

2)可能であれば、アニメーションフレームを1つのスプライトシートに結合します。これは効率的です。 Cocosにはスプライトシートのサポートが組み込まれています(Texture Atlasesと呼ばれています)。これは、フルスクリーンのフレームでは機能しませんが、アトラスの最大サイズは約1024x1024です。

3)あなたの人生を楽にするには、スプライトシートを自動的に作成し、テクスチャをPVRに変換できるスプライトシート生成ツールを使用してください。 TexturePackerZwoptexはどちらも良い選択肢です。

可能であればアニメーションを別々の部分にリファクタリングするLearnCocos2Dのアドバイスは良いアイデアです。

時間や技術的な理由でこれを行うことができない場合は、OpenGL PVRフレームベースのビデオプレーヤを作成しました。このビデオプレーヤは、このようなフルスクリーンイメージのシーケンスをメモリ1にストリーミングすることで非常に効率的に再生できます一度に1フレーム。これはCocos2Dを使用せず、単体のUIViewであるため、Cocosディレクタービューを読み込む前にアプリが読み込まれたときに、独自のView Controllerに表示することができます。

ここで入手できます:https://github.com/nicklockwood/GLView - ドキュメントと例が含まれています。心に留めておくべき主な点は、PVRに変換する前に、イメージフレームのサイズを2のべき乗にする必要があることです。しかし、心配する必要はありません。あなたがそれらを演奏するとき、あなたはいつも元の割合に戻すことができますので、目立たないでしょう。

+0

あなたの答えとリンクをありがとう。残念ながら、私は答えとして2つの答えを受け入れることはできません:-) – Bobrovsky

関連する問題