在iPhone上使用OpenGL渲染UIImage / PNG的最简单,最快捷的方法?

时间:2010-09-26 02:44:36

标签: iphone opengl-es bitmap uiimage

我编写了一个iPhone应用程序,它从用户那里获取输入并根据输入更新位图上下文。更新后,它会更新UIView的显示。我通过在UIView子类中实现drawRect来实现这一点。

目前我正在使用Quartz 2D。鉴于更新每秒发生多次,我注意到虽然app在模拟器中表现良好,但实际设备上的速度要慢得多(尽管不可用)。我想重写drawRect来改用OpenGL(因为我听说这个性能要高得多)。如果你有其他想法,我会全力以赴。

我浏览过网络上有关如何使用OpenGL简单显示PNG的示例/教程,但大多数都对我需要的东西有点过分。我正在寻找一个简短而甜蜜的样本,用于快速获取PNG文件或UIImage,然后使用OpenGL在UIView内渲染(可以实现?这在概念上甚至是否有意义?) - 或指向文档的指针以加速图像渲染使用现有的Quartz API。

在您决定回复RTFM回复之前 - 请不要浪费我的时间或您的时间。我不是在寻找捷径,我不介意做功课。我只是在寻找一个符合我需求的简单解决方案/指导,而且很难找到。我相信精通OpenGL的人可能会解释需要做什么,并在5分钟内完成这个代码。如果那就是你,那将是我的一天:)。

任何帮助,指导等总是受到赞赏。感谢。

2 个答案:

答案 0 :(得分:3)

使用您自己分配的内存创建位图上下文

void* data = malloc(width*height*4);

CGContextRef ctx = CGBitmapContextCreate( . . . );

并将您想要的内容渲染到该位图上下文中。接下来从数据

创建纹理
glGenTextures(1, &texref);
glBindTexture(GL_TEXTURE_2D, texref);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);

现在只需按照任何有关使用GL渲染此纹理的教程,使用Apple的示例代码了解如何将GL渲染为UIView。请注意在位图上下文中使用RGBA字节顺序(或将GL调用交换到ARGB)。另外,请记住GL只喜欢尺寸为2 ^ n x 2 ^ n的纹理。

借助iPhone的共享内存架构,每个周期都不会向显卡发送数据,因此不会对性能造成太大影响。

答案 1 :(得分:1)

显示更新位图的更快方法可能是将位图上下文分配给UIView的CALayer(如果需要,可以调整大小和/或转换为所需目标矩形的子视图)。不需要drawRect或OpenGL框架渲染。