2010-08-13 13 views
9

Używam przykładowej aplikacji Apple GLPaint jako podstawy dla aplikacji do malowania OpenGL ES, ale nie mogę wymyślić, jak zaimplementować w niej funkcjonalność cofania.Jak zaimplementować cofanie w aplikacji do malowania OpenGL ES na telefonie iPhone?

Nie chcę robić zdjęć każdego uderzenia i przechowywać je. Czy istnieje sposób użycia różnych obiektów bufora ramki do implementacji cofania? Czy masz inne sugestie dotyczące lepszych sposobów na zrobienie tego?

Odpowiedz

9

Użyj obiektów bufora wierzchołków (VBO) do renderowania zawartości. Przy każdym nowym skoku skopiuj ostatnią VBO do jakiejś ostatnio używanej listy (LRU). Jeśli twój LRU jest pełny, usuń najmniej ostatnio używany VBO. Aby przywrócić (cofnąć) ostatni skok, użyj ostatnio używanego VBO LRU i wyrenderuj go.

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

Proszę podać przykładowy kod, jak to wdrożyć? – antalkerekes

+1

Shake to cofnąć :-) Czy to działa dla Ciebie? https://github.com/larsxschneider/Undo-in-OpenGL-ES –

+0

Działa doskonale, dziękuję bardzo! Będę w kontakcie, aby pokazać ci, co z nim zrobiłem. Bounty dobrze zasłużone. – antalkerekes

6

Polecam przy użyciu NSUndoManager do przechowywania listy rzeczywistych działań rysunkowych podejmowanych przez użytkownika (narysować linię stąd tutaj używając ten pędzel, etc .). Jeśli jest przechowywany jako lista współrzędnych x, y dla rysunku wektorowego, wraz ze wszystkimi innymi metadanymi wymaganymi do odtworzenia tej części rysunku, nie będzie używany w pobliżu tak dużej ilości pamięci, jak przechowywanie obrazów, obiektów bufora wierzchołków lub obiektów bufora ramki .

W rzeczywistości, jeśli przechowuje się te etapy rysowania w bazie danych podstawowych, prawie można cofnąć/przywrócić za darmo. Zobacz moją odpowiedź here, aby uzyskać więcej informacji.

+1

Zapisywanie wszystkich kroków, a następnie przerysowywanie ich - wielka krok (cofanie) może być bardzo powolny, gdy masz wiele kroków do przerysowania, czy coś mi brakuje? –

+0

Proponuję przechowywanie nieprzetworzonego obrazu co 10 lub więcej punktów kontrolnych, aby nie musieć przerysowywać ostatnich 100 kroków lub czegoś szalonego – jjxtra

-1

Albo można użyć NSUndoManager, klasę świadczonych przez iOS

lub zapisać aktualny stan powierzchni ekranu przez:

CGContextRef current = UIGraphicsGetCurrentContext(); 

Możesz mieć jedną tablicę jako stos z obiektów obrazu na ekranie i na cofania Akcja pozwala wyskalować wartość ze stosu i na każdej zmianie wartości wypychanej na stos.

+0

Pytający szuka rozwiązania z udziałem OpenGL ES, a stany graficzne, jak opisujesz tylko pracę dla Podstawowa grafika. Nie mają tu zastosowania. –