苹果手绘示例GLPaint , 使用 OpenGL ES 绘制不能用大框架绘制。我需要在大 Canvas 上绘制超过 {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
On my code I have set the frame as-
//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})上得到了很好的结果,画笔像波浪一样消失并开始在屏幕上跳舞。有时我会收到 Received memory 警告。在这种情况下,Level=1。
最佳答案
对于 iPad 2 之前的设备,最大纹理大小为 2048 x 2048,因此您不能绘制大于该大小的纹理或帧缓冲区对象。您只会看到错误和黑屏。在较新的设备(iPad 2、Retina iPad、iPhone 4S)上,此纹理大小限制已增加到 4096 x 4096。
在更大的 Canvas 上绘图的唯一解决方案是在 OpenGL ES 中创建平铺机制,就像 CATiledLayer 在 Core Animation 中所做的那样。不过,祝您好运,因为如果您对 OpenGL ES 渲染不太熟悉,这将是一项重大任务。
此外,您将在 OpenGL ES 中遇到非常大的场景的内存问题,尤其是在较旧的 iOS 设备上。对于您提到看到警告的 1600x1200 图像,每个未压缩的帧本身占用约 7.7 MB 的内存。如果您有多个图层或纹理,如果您不小心,可能会很快加起来并耗尽设备上的可用内存。对于 2410x1808 图像,您现在看到的是每帧 17.4 MB,因此这是您希望平铺它以仅使用您当时需要的平铺的另一个原因。
关于iOS:GLPaint 无法在大框架上绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10892455/