0

私のギャラリー アプリでは、頻繁に画像を非同期で読み込みます。画像は、ファイル名で参照される CCTextureCache にダンプされます。addImageAsync問題は、テクスチャをマスクする必要があるということです。このマスキングは、実際には 1 回だけ行う必要があるため、理想的には、呼び出すセレクターに配置するのが最適な場所であると考えました。特定のテクスチャが既にマスクされているかどうかを通知するブール変数を追加して、CCTexture を変更する必要がありましたが、これは非常にうまく機能します。

実際、マスキング コード自体 (Ray のマスキング チュートリアルに従って CCRenderTexture を使用して実行されます) も、セレクター コード内で適切に機能します。私が今抱えている問題は、マスク ロジックを適用すると、CCRenderTexture.sprite.texture があり、この更新されたマスクされたテクスチャで CCTextureCache を更新する必要があるため、将来、他のスプライトまたはそれを呼び出すことができます。指定されたファイル名を参照すると、完全に準備されたテクスチャが使用されます。

CCTextureCache のテクスチャ データを更新するにはどうすればよいですか? より具体的には、既存のキャッシュされたテクスチャをレンダー テクスチャに保存されているテクスチャに置き換えるにはどうすればよいですか?

テクスチャ自体 (それらのデータ) は実際には OpenGL に格納されており、Cocos2D クラス内には格納されていません。したがって、キャッシュされたテクスチャの名前 (GLuint) を持つ OpenGL テクスチャを削除し、キャッシュされたテクスチャの名前 (GLuint) を RenderTexture の sprite.texture の名前に設定するという行に沿って何かを想像します... しかし、私は '実際にそれを達成する方法について途方に暮れています (opengl コード、cocos2d スレッドセーフ コード、cctexturecache の辞書の変更など)。

または、Cocos2D を変更せずにそれを実行する簡単な方法があるかもしれません (たとえば、opengl を使用して、テクスチャ キャッシュによって参照されるテクスチャをレンダー テクスチャのテクスチャに置き換え、ローカル RT 変数を停止させて自動的にクリーンアップしますか?

4

2 に答える 2

0

CCTextureCache のテクスチャ データを更新するにはどうすればよいですか?

これは、キャッシュからテクスチャを削除する方法です。

CCTextureCache* cache = [CCTextureCache sharedTextureCache];
[cache removeTexture:tex];
// or:
[cache removeTextureForKey:@"someimage.png"];

その後、適切と思われる方法でテクスチャを再追加できます。これにより、キャッシュが強制的にテクスチャをリロードします。

于 2012-04-02T13:03:30.180 に答える
0

私はこれをいじるのにもう少し時間を費やしました。これをすぐに思いつかなかったのは本当に恥ずかしいです...この回答が同じ問題を抱えている他の人に役立つことを願っています.

目的の機能を実現するための最も簡単でクリーンかつ最も効率的な方法はname_、CCTexture2D のプロパティをから に変更することでしreadonlyreadwrite(これはオープン gl テクスチャ ID です)。

次に、高度なメモリ管理を行う代わりにname_、準備したレンダリング テクスチャとキャッシュされたテクスチャの値を交換しました。CCTextureCache は変更されていません。rendertexture が範囲外になると、自動解放され (マスクされていない元のテクスチャが破棄されます)、保持される値は変更されたテクスチャです。

于 2012-04-01T16:37:32.333 に答える