iOS:GLPaint can';不要在大框架上画画

iOS:GLPaint can';不要在大框架上画画,ios,opengl-es,Ios,Opengl Es,苹果写意画的例子,使用OpenGL ES绘制不能用大框架绘制。我需要在一张大画布上画大约{24101808}。但当我尝试画画时,控制台上会显示一条信息,说 2012-06-05 14:29:40.780 GLPaint[3390:707] Frame of drawingView: {{-827.222, -567.004}, {2410, 1808}} 2012-06-05 14:29:40.884 GLPaint[3390:707] failed to make complete frame

苹果写意画的例子,使用OpenGL ES绘制不能用大框架绘制。我需要在一张大画布上画大约{24101808}。但当我尝试画画时,控制台上会显示一条信息,说

2012-06-05 14:29:40.780 GLPaint[3390:707] Frame of drawingView: {{-827.222, -567.004}, {2410, 1808}} 2012-06-05 14:29:40.884 GLPaint[3390:707] failed to make complete framebuffer object 8cd6
我的画框尺寸为{14351076}得到了很好的效果,在像{16001200}这样稍大的画框上,画笔像波浪一样在屏幕上起舞。有时我会收到记忆警告。在这种情况下,级别=1

此问题的大小上限与纹理相同。对于比iPad2旧的设备,当前限制为1,最大纹理大小为2048 x 2048,因此不能绘制到大于该大小的纹理或帧缓冲区对象中。您只会看到错误和黑屏。在较新的设备(iPad2、iPad、iPhone4S)上,此纹理大小限制已增加到4096 x 4096

在更大画布上绘制的唯一解决方案是在OpenGL ES中创建平铺机制,就像CATiledLayer在核心动画中所做的那样。不过,祝您好运,因为如果您对OpenGL ES渲染不太熟悉,这将是一项重要的任务


此外,在OpenGL ES中,特别是在较旧的iOS设备上,非常大的场景会遇到内存问题。对于您提到的看到警告的1600x1200图像,每个未压缩帧本身都会占用约7.7 MB的内存。如果您有多个图层或纹理,如果您不小心,这些图层或纹理会很快累积起来并耗尽设备上的可用内存。对于2410x1808图像,您现在看到的是每帧17.4 MB,因此这是您希望平铺该图像以仅处理您当时需要的平铺的另一个原因。

Brad,既然您似乎对此非常了解,您对该方法有何看法:您可以创建9个帧缓冲区,并将纹理1024x1024附加到每个帧缓冲区。在3x3网格中定位它们,只需调用glOrtho,将值作为网格中的相对位置(左上角为:left-6/6 right-2/6 up 6/6 down 2/6,考虑到整个帧缓冲区为[-1,1]),现在要在这个屏幕上绘制元素,您需要绑定单个帧缓冲区,调用其正交并绘制所有元素,然后对所有其他缓冲区执行相同的操作。最后,只需绑定纹理并将其绘制到主帧缓冲区。您的主帧缓冲区需要小于最大纹理大小(对于屏幕大小的视图来说这是合理的,但不可能将其放置在滚动视图中)。一个问题可能是设备上允许的最大同时绑定纹理数。如果我没记错的话,旧的设备有8个纹理单元,所以你不能一次绑定超过这个数量的纹理进行绘制。覆盖不同区域的四边形可能需要多个绘制过程。为了滚动或缩放,你必须管理移入和移出平铺纹理。我一直在为一个图像处理框架做类似的工作,这样我就可以在旧设备上处理大照片,而且实现起来有点棘手。这是可行的,但对于刚开始使用OpenGL ES的人来说并非如此;然后就不能画右边了。在这种情况下,会发生什么?谢谢
//PaintingViewGL performing the freehand drawing of OpenGL ES
//drawingView is a UIView with dynamic frame size

paintingViewGL = [[PaintingViewGL alloc] initWithFrame:drawingView.frame];
paintingViewGL.backgroundColor = [UIColor clearColor];

[drawingView addSubview:paintingViewGL];
paintingViewGL.center = drawingView.center;
paintingViewGL.hidden = NO;