如何优化多个全屏透明 iPhone OpenGL ES 图层的绘制?

Posted

技术标签:

【中文标题】如何优化多个全屏透明 iPhone OpenGL ES 图层的绘制?【英文标题】:How can I optimize drawing of multiple fullscreen transparent iPhone OpenGL ES layers? 【发布时间】:2009-09-05 21:02:43 【问题描述】:

我正在尝试优化我的 iPhone OpenGL ES 应用程序。这是基于 GLSprite 和 GLPaint 示例应用程序。我已将 EAGLView 分解为一个基类,并将其子类化为 3 个不同的 OpenGL 视图以创建 3 个透明层。 3 个 EAGLView 的显示父级是 UIView,而 UIView 是 UIWindow 的子级。我试图让它尽可能接近 60fps。我在这个网站上听到其他人说 iPhone 能够以 60fps 的速度绘制 50 个透明层,这令人鼓舞……

我正在做的是:

1) 使用与 GLPaint (renderLineFromPoint:toPoint:) 中相同的基于点精灵的函数绘制多达 9 条纹理线到图层 #1。用于此的纹理是 64x64,中间有一个 40x40 的圆圈,其余部分是透明的。

2) 将具有相同功能和纹理的单线绘制到第 2 层。

3) 将 9 个 128x128 纹理实例(一个 80x80 中心圆,其余部分透明)绘制到第 3 层。这层在最上面。

第 1 层和第 3 层很少更改,并且每次调用 touchesMoved: 时,第 2 层都会更改(擦除全屏,重绘一行)。

最初我尝试在单个 EAGLView 中执行此操作,就像示例一样...基本上按顺序为所有 3 个图层绘制内容。然而,这太慢了。在我添加线条图(第 1 层和第 2 层)之前很好,但不幸的是,每次 touchMoved 绘制 10 条线会将帧速率减半。所以我尝试通过将它们分成层来优化它......仅在必要时绘制每个层一次。 (每个手指移动绘制第 2 层)。这还不够快,我猜是因为有很多透明度(每一层都需要显示出来;每个纹理绘制也需要混合)。

我不认为我画了很多...是 9 个半透明的四边形和几条线吗?

那么,我注定要在这里吗?使用这么多的透明度会扼杀性能?或者有什么我遗漏的......非常感谢任何帮助!

【问题讨论】:

更新:如果我不将 anything 绘制到第 2 层,我将获得 60fps。当我在第 2 层的 drawView 函数中放入一个 glClear(GL_COLOR_BUFFER_BIT) (以及 nothing else)时,帧速率下降到 19-20 fps。这就像您在屏幕上移动手指一样。这是因为系统现在必须混合第 2 层,即使它是空的,而以前不需要? 【参考方案1】:

我通过删除第 1 层解决了这个问题。 现在,第 2 层处理静态和动态线条绘制。回到60fps! :)

我猜 iphone 只是在合成 3 个全屏透明层时表现不佳......

【讨论】:

以上是关于如何优化多个全屏透明 iPhone OpenGL ES 图层的绘制?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES/iPhone 的透明度/混合问题

在 iPhone 上的 openGl 应用程序的背景中播放视频

iPhone - 在 UITableView 上拖动会在后台停止渲染 OpenGL

Jogl:如何在 com.jogamp.opengl.swt.GLCanvas 上制作透明背景?

如何在 OpenGL 3.2 中绘制全屏四边形?

带有透明状态栏的全屏片段(以编程方式)