2012-04-01 10 views
0

In meiner Galerie-Anwendung lade ich häufig Bilder asynchron, die in den CCTextureCache geladen werden, auf den der Dateiname verweist. Die Sache ist, ich muss meine Texturen maskieren - und diese Maskierung muss wirklich nur einmal gemacht werden, also dachte ich, der beste Platz, um es in den Selektor zu setzen, der addImageAsync ruft. Ich musste CCTexture modifizieren, indem ich eine boolesche Variable hinzufügte, die mir mitteilt, ob die spezifische Textur bereits maskiert wurde oder nicht, und das funktioniert sehr gut.CCTextureCache-Texturdaten aktualisieren

In der Tat funktioniert auch der Maskierungscode selbst (der mit einem CCRenderTexture nach dem Maskierungs-Tutorial von Ray erreicht wird) auch innerhalb des Selektor-Codes. Das Problem, das ich jetzt habe, ist, sobald ich meine Maskenlogik angewendet habe, habe ich die CCRenderTexture.sprite.texture und ich muss meinen CCTextureCache mit dieser aktualisierten, maskierten Textur aktualisieren, damit in Zukunft jeder andere Sprite oder Call das Verweise auf den angegebenen Dateinamen verwenden die vollständig vorbereitete Textur.

Wie kann ich die Texturdaten in CCTextureCache aktualisieren? Oder genauer gesagt, wie kann ich eine vorhandene, zwischengespeicherte Textur durch die in meiner Render-Textur gespeicherte ersetzen?

Ich weiß, dass die Texturen selbst (ihre Daten) tatsächlich in OpenGL und nicht innerhalb der Cocos2D-Klassen gespeichert sind; also würde ich mir etwas vorstellen, wie die OpenGL-Textur mit dem Namen (GLuint) der zwischengespeicherten Textur entfernt wird und dann den Namen der zwischengespeicherten Textur (GLuint) auf den Namen des Sprite.texture der RenderTexture setzt ... aber ich ' Ich habe keine Ahnung, wie ich das tatsächlich bewerkstelligen kann (OpenGL-Code, cocos2d thread safe code, Änderung des cctexturecache-Wörterbuchs usw.).

Oder vielleicht gibt es einen einfacheren Weg, ohne Cocos2D zu ändern (z. B. opengl verwenden, um die Textur Textur Textur durch den Textur-Cache ersetzen Textur, dann lassen Sie die lokale RT-Variable sterben und automatisch bereinigt werden?

Antwort

0

Wie kann ich die Texturdaten in CCTextureCache aktualisieren?

Dies ist, wie Sie eine Textur aus dem Cache entfernen:

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

Sie können dann die Textur in irgendeiner Weise sehen Sie fit erneut hinzufügen, und es wird der Cache die Textur neu zu laden.

+0

Die Sache ist - ich musste in der Lage sein, eine bestehende Textur mit einem prozeduralen zu aktualisieren; Die von der Festplatte geladene Textur war unvollständig und einige Operationen mussten noch ausgeführt werden. Nachdem diese Operationen abgeschlossen waren, musste ich die Änderungen mit dem gleichen/Originalschlüssel in den Textur-Cache zurückgeben. Ich glaube nicht, dass es derzeit eine eingebaute Methode gibt, eine Textur in den Textur-Cache einzufügen (zu aktualisieren), ohne zuerst das Bild in eine Datei zu schreiben und es erneut zu laden.Diese zusätzlichen Schreibverzögerungen hätten mein Programm zerstört. –

0

verbrachte ich ein bisschen mehr Zeit mit diesem stochert. Es ist wirklich ziemlich peinlich ich nicht früher dazu kommen ... ich hoffe, dass diese Antwort andere Menschen mit dem gleichen Problem hilft.

die einfachste, Der sauberste + effizienteste Weg, um die gewünschte Funktionalität zu erreichen, bestand darin, die name_ Eigenschaft von CCTexture2D von readonly zu readwrite zu ändern (Dies ist die Open-GL-Textur-ID).

Dann, anstatt irgendeine ausgefallene Speicherverwaltung zu tun, tauschte ich nur die name_ Werte meiner vorbereiteten Rendertextur und der zwischengespeicherten Textur. Es wurden keine Änderungen an CCTextureCache vorgenommen. Sobald die Rendertextur nicht mehr im Gültigkeitsbereich ist, wird sie automatisch freigegeben (was nun die ursprüngliche, nicht maskierte Textur zerstört) und der beibehaltene Wert ist die modifizierte Textur.