Я использую пример приложения Apple GLPaint в качестве основы для приложения рисования OpenGL ES, но я не могу понять, как реализовать в нем функцию отмены.
Я не хочу делать снимки каждого удара и хранить их. Есть ли способ использовать разные объекты буфера кадра для реализации отмены? Есть ли у вас другие предложения по улучшению способов сделать это?
Используйте объекты буфера вершин (VBO) для рендеринга вашего контента. При каждом новом штрихе копируйте последний VBO в список наименее недавно использованных (LRU). Если ваш LRU заполнен, удалите последний использованный VBO. Чтобы восстановить (отменить) последний штрих, просто используйте последний использованный VBO LRU и визуализируйте его.
LRU: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
Я бы порекомендовал использовать NSUndoManager для хранения списка фактических действий рисования, предпринятых пользователем (проведите линию отсюда сюда с помощью этой кисти и т. Д.). При хранении в виде списка координат x, y для векторного рисования вместе со всеми другими метаданными, необходимыми для воссоздания этой части рисунка, вы не будете использовать столько памяти, сколько для хранения изображений, объектов буфера вершин или объектов буфера кадра. .
Фактически, если вы сохраните эти шаги рисования в базе данных Core Data, вы можете почти бесплатно отменить / повторить действие. Подробнее см. Мой ответ здесь .