我正在使用Apple的示例应用程序GLPaint作为OpenGL ES绘图应用程序的基础,但我无法弄清楚如何在其中实现撤消功能。
我不想拍摄每一笔画并存储它们。有没有办法使用不同的帧缓冲对象来实现撤销?对于更好的方法,您有其他建议吗?
答案 0 :(得分:10)
使用顶点缓冲区对象(VBO)渲染内容。在每个新笔划上,将最后一个VBO复制到最近最少使用(LRU)列表。如果您的LRU已满,请删除最近最少使用的VBO。要恢复(撤消)最后一个笔划,只需使用最近使用的LRU的VBO并进行渲染。
LRU: http://en.wikipedia.org/wiki/Cache_algorithms#Least_Recently_Used
答案 1 :(得分:6)
我建议使用NSUndoManager来存储用户进行的实际绘图操作的列表(使用此画笔从此处绘制线到此处等)。如果存储为矢量绘图的x,y坐标列表,以及重新创建绘图部分所需的所有其他元数据,则不会在存储图像,顶点缓冲区对象或帧缓冲区对象的任何内存附近使用
事实上,如果将这些绘图步骤存储在Core Data数据库中,您几乎可以免费获取撤消/重做。请参阅我的回答here了解更多信息。
答案 2 :(得分:1)
要在图形应用程序中撤消,可以使用coreData。
答案 3 :(得分:-1)
您可以使用iOS提供的NSUndoManager类
或者您可以通过以下方式保存屏幕区域的当前状态:
CGContextRef current = UIGraphicsGetCurrentContext();
您可以将一个数组作为屏幕图像对象的堆栈,并且在撤消操作中,您可以从堆栈中弹出值,并将每个更改推送值放入堆栈中。