如何在iPhone上的OpenGL ES绘图应用程序中实现撤销?

时间:2010-08-13 05:55:13

标签: iphone opengl-es

我正在使用Apple的示例应用程序GLPaint作为OpenGL ES绘图应用程序的基础,但我无法弄清楚如何在其中实现撤消功能。

我不想拍摄每一笔画并存储它们。有没有办法使用不同的帧缓冲对象来实现撤销?对于更好的方法,您有其他建议吗?

4 个答案:

答案 0 :(得分:10)

使用顶点缓冲区对象(VBO)渲染内容。在每个新笔划上,将最后一个VBO复制到最近最少使用(LRU)列表。如果您的LRU已满,请删除最近最少使用的VBO。要恢复(撤消)最后一个笔划,只需使用最近使用的LRU的VBO并进行渲染。

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

答案 1 :(得分:6)

我建议使用NSUndoManager来存储用户进行的实际绘图操作的列表(使用此画笔从此处绘制线到此处等)。如果存储为矢量绘图的x,y坐标列表,以及重新创建绘图部分所需的所有其他元数据,则不会在存储图像,顶点缓冲区对象或帧缓冲区对象的任何内存附近使用

事实上,如果将这些绘图步骤存储在Core Data数据库中,您几乎可以免费获取撤消/重做。请参阅我的回答here了解更多信息。

答案 2 :(得分:1)

要在图形应用程序中撤消,可以使用coreData。

here is a detailed blogpostread this one

答案 3 :(得分:-1)

您可以使用iOS提供的NSUndoManager类

或者您可以通过以下方式保存屏幕区域的当前状态:

CGContextRef current = UIGraphicsGetCurrentContext();

您可以将一个数组作为屏幕图像对象的堆栈,并且在撤消操作中,您可以从堆栈中弹出值,并将每个更改推送值放入堆栈中。