2010-08-13 13 views
9

Ich benutze Apples Beispielanwendung GLPaint als Basis für eine OpenGL ES-Malanwendung, aber ich kann nicht herausfinden, wie man die Undo-Funktionalität darin implementiert.Wie würde ich das Rückgängigmachen in einer OpenGL ES-Malanwendung auf dem iPhone implementieren?

Ich möchte nicht von jedem Schlag Bilder machen und sie speichern. Gibt es eine Möglichkeit, verschiedene Frame-Puffer-Objekte zu verwenden, um rückgängig zu machen? Haben Sie andere Vorschläge für bessere Möglichkeiten?

Antwort

9

Verwenden Sie Vertex-Pufferobjekte (VBO), um Ihren Inhalt zu rendern. Kopieren Sie bei jedem neuen Strich den letzten VBO in die Liste der zuletzt verwendeten Listen (LRU). Wenn Ihr LRU voll ist, löschen Sie den zuletzt verwendeten VBO. Um den letzten Strich wiederherzustellen (rückgängig zu machen), verwenden Sie einfach den zuletzt verwendeten VBO des LRU und rendern Sie ihn.

VBO: http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/TechniquesforWorkingwithVertexData/TechniquesforWorkingwithVertexData.html

LRU: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used

+0

Könnten Sie bitte einen Beispielcode zur Implementierung bereitstellen? – antalkerekes

+1

Shake zum Rückgängigmachen: Funktioniert das für Sie? https://github.com/larsxschneider/Undo-in-OpenGL-ES –

+0

Funktioniert perfekt, vielen Dank! Ich werde in Kontakt sein, um Ihnen zu zeigen, was ich damit gemacht habe. Kopfgeld gut verdient. – antalkerekes

6

Ich empfehle NSUndoManager wäre eine Liste der aktuellen Zeichnung Aktionen durch den Benutzer vorgenommen speichern (ziehen Linie von hier nach hier, um diesen Pinsel, etc. .). Wenn sie als Liste von x, y-Koordinaten für das Vektorzeichnen zusammen mit allen anderen Metadaten gespeichert werden, die zum erneuten Erstellen dieses Teils der Zeichnung erforderlich sind, verwenden Sie nicht annähernd so viel Speicher wie Bilder, Vertexpufferobjekte oder Framebufferobjekte .

In der Tat, wenn Sie diese Zeichnungsschritte in einer Core Data-Datenbank speichern, können Sie fast kostenlos rückgängig machen/wiederholen. Siehe meine Antwort here für mehr.

+1

Alle Schritte speichern und dann neu zeichnen -letzter Schritt (rückgängig machen) kann sehr langsam werden, wenn Sie viele Schritte zum Neuzeichnen haben, fehlt mir etwas? –

+0

Ich würde vorschlagen, ein rohes Bild alle 10 oder so überprüfen Punkte, so dass Sie nicht die letzten 100 Schritte oder etwas verrückt neu zu ziehen – jjxtra

-1

Sie können entweder von iOS bereitgestellt NSUndoManager, Klasse verwenden

Oder Sie von aktuellen Stand der Siebfläche speichern:

CGContextRef current = UIGraphicsGetCurrentContext(); 

können Sie haben ein Array als Stack mit Bildschirm Bildobjekten und auf Undo Aktion Sie können den Wert aus dem Stapel und bei jeder Änderung drücken Wert in den Stapel.

+0

Der Fragesteller ist auf der Suche nach einer Lösung mit OpenGL ES und Grafikzustände, wie Sie beschreiben nur arbeiten für Kerngrafiken Sie würden hier nicht gelten. –

Verwandte Themen