iOS:GLPaint无法在大框架上绘制

时间:2012-06-05 06:11:23

标签: ios opengl-es

Apple写意图GLPaint的例子,使用OpenGL ES绘画无法用大画框绘制。我需要画一张大于{2410,1808}的大画布。但是当我试图绘制时,在控制台上收到一条消息说,

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 

在我的代码中,我将框架设置为 -

//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;

我的帧尺寸{1435,1076}得到了不错的结果,并且在像{1600,1200}这样的更大的框架上,画笔像波浪一样消失并开始在屏幕上跳舞。有时我收到内存警告。在这种情况下,等级= 1。

2 个答案:

答案 0 :(得分:3)

对于早于iPad 2的设备,最大纹理尺寸为2048 x 2048,因此您无法绘制到大于此的纹理或帧缓冲对象。你只会看到错误和黑屏。在较新的设备(iPad 2,Retina iPad,iPhone 4S)上,此纹理大小限制已增加到4096 x 4096.

在大画布上绘制的唯一解决方案是在OpenGL ES中创建一个平铺机制,就像CATiledLayer在Core Animation中一样。祝你好运,因为如果你不熟悉OpenGL ES渲染,这将是一项重大的任务。

此外,您将遇到OpenGL ES中非常大的场景的内存问题,特别是在较旧的iOS设备上。对于1600x1200图像,你提到看到警告,每个未压缩的帧本身占用~7.7 MB的内存。如果您有多个图层或纹理,如果您不小心,可以快速添加并耗尽设备上的可用内存。对于2410x1808图像,您现在看起来每帧17.4 MB,因此这是您想要将其平铺为仅适用于当时所需的图块的另一个原因。

答案 1 :(得分:0)

此问题的大小上限与纹理相同。目前上限为1 <&lt; 11(2048)并且您无法创建宽度大于2048像素的缓冲区。我看到实现你想要的效果的唯一方法是创建超过1个视图或更多1帧缓冲区。如果你真的想要/需要经历所有麻烦,请阅读一下FBO(帧缓冲对象)。