在iPhone上使用OpenGL的分层2D应用程序最有效的“架构”?

时间:2010-01-10 20:53:50

标签: iphone uikit opengl-es

我正在开发一个iPhone OS应用程序,其主视图是一个2-D OpenGL视图(这是Apple的EAGLView类的子类,基本上是设置正交投影的2D环境),用户可以直接与之交互。 / p>

有时候(并非在任何时候)我都想在这个基线GL视图之上渲染一些控件 - 就像一个单挑显示器。请注意,下面的基线视图可能是滚动/动画,而控件应该看起来固定在上面的屏幕上。

我对Cocoa的观点一般都很好,而且我对CoreGraphics非常好,但我对Open GL很绿,而且EAGLView的操作(以及它与CALayers的关系)对我来说是相当不透明的。我不确定如何最有效地混合其他元素(阅读:最佳性能,最少麻烦等)。我知道,在紧要关头,我可以为所有其他控件创建和保持几何体,并在每次绘制/交换时在基线几何体上渲染它们,从而保持用户在一个视图上看到的所有内容。但我不太确定其他技术,比如在顶部有另一个视图(UIKit / CG或GL?)或以某种方式在我的单个视图中创建其他图层等。

如果人们如果他们之前已经走过这些道路,或者至少指出我在这个问题上的文件或现有讨论,那么他们会非常友好地写一些简短的观察,我会非常感激。

感谢。

1 个答案:

答案 0 :(得分:3)

正常创建动画视图。将其渲染为渲染目标。这是什么意思?好吧,通常情况下,当你将多边形“绘制”到屏幕上时,你实际上是在正常表面(主表面)上进行,这恰好是最终进入屏幕的那个。您可以渲染到任何旧表面,而不是渲染到屏幕表面。

现在,你的HUD。这是完全一样的还是会改变?它只会改变一些吗?

如果所有这些都发生了变化,您需要将所有HUD几何体和纹理保留在内存中,并且必须像往常一样将它们渲染到“滚动”曲面上。您可以将这个最终的复合渲染应用到屏幕上。我不会太担心这里的麻烦和表现 - HUD很难像背景那样复杂。你最多会有一些纹理四边形?

如果所有hud都是静态的,那么您可以在应用程序启动时将其渲染到单独的表面,然后每个帧从该表面渲染到您绘制每个帧的动画表面。这样您就可以在开始时卸载所有HUD geom和纹理。当然,表面可能会占用更多内存 - 这取决于您的应用最需要的资源。

如果你有一半的变化,一半不变,那么从技术上讲,你可以预先渲染静态部分,然后在你进行时渲染其他部分,但这比其他两个选项更麻烦。

您的两个主要选项取决于HUD的动态性。如果它移动,你需要每帧重绘到你的场景。它很糟糕,但我很难想象几何形状与其他部分相比是复杂的。如果它是静态的,您可以在发送到屏幕之前预渲染并将一个表面混合到另一个表面。

正如我所说,这完全取决于您的应用将有多余的资源。