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

如何在iPhone上的OpenGL ES绘画应用程序中实现撤销?,iphone,opengl-es,Iphone,Opengl Es,我正在使用苹果的示例应用程序GLPaint作为OpenGL ES绘制应用程序的基础,但我不知道如何在其中实现撤销功能 我不想拍摄每一次中风的图像并保存它们。有没有办法使用不同的帧缓冲区对象来实现撤消?对于更好的方法,您还有其他建议吗?使用顶点缓冲区对象(VBO)渲染内容。在每个新笔划上,将最后一个VBO复制到某个最近使用最少的(LRU)列表。如果LRU已满,请删除最近使用最少的VBO。要恢复(撤消)最后一个笔划,只需使用LRU最近使用的VBO并进行渲染 VBO: LRU: 我建议使用NSUnd

我正在使用苹果的示例应用程序GLPaint作为OpenGL ES绘制应用程序的基础,但我不知道如何在其中实现撤销功能

我不想拍摄每一次中风的图像并保存它们。有没有办法使用不同的帧缓冲区对象来实现撤消?对于更好的方法,您还有其他建议吗?

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

VBO:

LRU:

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


事实上,如果将这些绘图步骤存储在核心数据数据库中,几乎可以免费获得undo/redo。更多信息,请参见我的答案。

您可以使用iOS提供的NSUndoManager类

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

CGContextRef current = UIGraphicsGetCurrentContext();

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

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


还有。

您能提供一些示例代码来说明如何实现此功能吗?摇动以撤消:-)这对您有用吗?非常好用,非常感谢!我会和你联系,告诉你我用它做了什么。赏金是当之无愧的。@antalkerekes我很感兴趣,也很期待:-)你不需要渲染所有以前的顶点缓冲区对象才能使它看起来正确吗?询问者正在寻找一种涉及OpenGL ES的解决方案,以及你描述的仅适用于核心图形的图形状态。它们在这里不适用。保存所有步骤,然后重新绘制它们-最后一步(撤消)可能会变得非常缓慢,当您有许多步骤要重新绘制时,我是否遗漏了什么?我建议每10个左右的检查点存储一个原始图像,这样您就不必重新绘制最后100个步骤或其他疯狂的步骤