0

大きなテクスチャの TON を使用する必要がある iOS opengl es 2.0 アプリがあります。理想的には 4096x4096 です。テクスチャに関するすべての情報を含む構造体配列があり、それぞれを使用する必要があるため、glGenTextures で新しいテクスチャ ID を作成し、そこにイメージをロードし、uiimage を解放します。すべてうまくいきます。

私のアプリでは、UI や画像処理などに大量のテクスチャを使用しています。15 個のうち 4 ~ 5 個が 4k x 4k です。残りは小さいです。そして、必要に応じてロードされるこれらのテクスチャも 4k です。

それらの約 4 ~ 5 番目をロードすると、アプリがハードにクラッシュします。コンソールやデバッグはありません。次のテクスチャを読み込もうとしている途中で踏み台に戻るだけです。

メモリ リークはありません。計測器を実行しました。ARCを使用しています。オーガナイザーからクラッシュ レポートを投稿できますが、あまり情報がありません。私のアプリのrpagesが170504だったというだけです。

画像読み込みコードを投稿することもできますが、これはすべてのアプリで何年も使用してきたものと同じコードです。新しいことは、システムをハードにプッシュし、多くの大きなテクスチャをロードしようとすることです。

Q1: 大量の大きなテクスチャを使用した経験がある人はいますか?

そこで、1024x1024 でプレビュー解像度を作成し、次に 4096 で最終解像度を作成する必要があるという事実に解決しました。4k 画像はすべて一度に 1 つずつ同じテクスチャに読み込まれ、使用されてから次の画像に進みます。

画像ローダーにプレビュー パラメータを書き込み、設定すると、読み込み中に画像が 1024 に収まるように縮小されます。これで、4 日または 5 日にクラッシュする代わりに、「終日」テクスチャを追加できます。私の推測では、以前の 16 倍の回数を実行できると思います。でも、一度に20~30個くらいは必要です。(のみ!) これまでのところ、メモリ警告やクラッシュなしで 20 を試しました。

ただし、アプリが実行され続けると、テクスチャが一意のテクスチャ ID で読み込まれるため、ある時点で、次のものを読み込むために不要になったものをアンロードする必要がある場所にヒットします。これはおそらく非常に単純ですが....

Q2: 不要になったテクスチャ ID のテクスチャを解放するにはどうすればよいですか?

Q3: 開いている gl テクスチャを解放する必要があるというメモリ警告が表示されますか?

Q4: テクスチャは PVR チップにロードされませんか? 彼らは携帯電話のメモリを占有していますか?

ありがとう!

4

1 に答える 1

2

テクスチャの削除: メイン スレッドからこの GL 呼び出しを使用する必要があります。

glDeleteTextures(1, &_texture);

メモリ警告は、アプリケーションへの一般的な呼び出しです。特定の情報を提供するものではありません。不要なテクスチャが不要になった場合は、メモリから削除することをお勧めします。例: 通常、ユーザーがゲーム内画面に移動すると、メニューで使用されるテクスチャが削除されます。ユーザーが戻ると、テクスチャは再度リロードされます。これは、システムがメモリ警告を呼び出すのを待つよりも、メモリを管理するのがはるかに簡単です。

PNG 画像をロードすると、データは圧縮解除され、ピクセルごとの色の配列としてそのまま保存されます。1K テクスチャは、画像のコンテンツ/色に関係なく 4 mb を使用します。PVR は、画像が GPU によって使用されるときにリアルタイムで解凍するハードウェア解凍チップです。表示される画像ファイルのサイズは、使用するメモリです。

于 2013-08-20T05:56:10.107 に答える