我需要做出如何处理需要在图像纹理上渲染少量3D对象的应用程序的设计决策。 结果需要呈现并保存为UIImage。 图形设计(客户端)期望标准UIKit控件操纵3D世界。
OpenGL视图(CAEAGLLayer层)需要位于UIScrollView内部,以实现便宜且自然的滚动和缩放实现。 只有很少的额外控制来操纵旋转比例和几个3D对象的过渡。 预期的三角形数量不多(最多100-200个)和2-3个纹理(1个模板)。它甚至不必经常刷新,只是在某些变换和缩放发生变化时。 CAEAGLLayer不需要是不透明的。
我会使用Core Animation解决方案,但不支持将3D转换后的CALayers渲染为CGContextRef(也不支持屏蔽)。
将CAEAGLLayer放入UIScrollView并将其与少量UIKit视图混合时,实际性能成本是多少? 我可以期望以平滑的帧速率(每秒30fps)呈现每秒多少三角形,这样我就可以做出最佳决策?
我知道已经存在类似的问题,但没有一个答案提供具体数字,这有助于估算预期的渲染结果。
答案 0 :(得分:8)
Per Allan Schaffer,他为WWDC和WWDC提供OpenGL演讲,OpenGL本身并不是一个特殊情况 - 任何改变都将导致其上的所有内容被重新组合。我特意谈到了一个在实时更新的OpenGL视图下面有一个实时更新视频视图的应用程序,他说那种事情是病态最坏的情况。在顶部抛出一些非常静态的视图通常并不昂贵,例如使用UILabel
来显示OpenGL游戏的当前分数。
在你的情况下,我认为你可以在很大程度上避免这个问题。不要将GL视图放在滚动视图中,而是使滚动视图不透明并将GL视图放在其后面。捕获scrollViewDidScroll:
(以及相应的缩放消息)并进行相关的OpenGL调整。我可以从经验中说出来,并说我已经在iPad 1上做到了这一点而没有性能问题。特别是对于你所谈论的那种模型我不会想象一个问题。