基于视锥体(平截体)的OpenGL ES性能优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于视锥体(平截体)的OpenGL ES性能优化相关的知识,希望对你有一定的参考价值。

参考技术A

OpenGLES入门教程1-Tutorial01-GLKit
OpenGLES入门教程2-Tutorial02-shader入门
OpenGLES入门教程3-Tutorial03-三维变换
OpenGLES入门教程4-Tutorial04-GLKit进阶
OpenGLES进阶教程1-Tutorial05-地球月亮
OpenGLES进阶教程2-Tutorial06-光线
OpenGLES进阶教程3-Tutorial07-粒子效果
OpenGLES进阶教程4-Tutorial08-帧缓存
OpenGLES进阶教程5-Tutorial09-碰碰车
这一次的是性能优化。

渲染的优化不是仅仅提高渲染的速度,超过60Hz的渲染速度没有任何意义,用户永远看不到这些信息。同时在考虑用电消耗的情况下,30Hz的刷新率能延长电池的使用时间。
以下的渲染优化策略总是管用的:

通过减少渲染的几何对象,在不影响显示效果的前提下,尽可能减少需要绘制的图元。
在一个场景中,很多物体是处于平截体外部,这些物体是用户永远看不到的对象。

计算眼睛到当前测试点的向量,提取这个向量关于平截体X、Y、Z轴的分量,分别进行判断。

测试球体会测试点更复杂,同样是对比X/Y/Z轴分量,在判断的范围加上半径的距离。
但是,考虑下面的情况

如下图,考虑球体被外切情况,得出相应的放大因子。

为什么FPS会在20FPS和30FPS之间摆动?
绘制 和 显示 并不一样。
通过CADisplayLink(hardware generated),绘制的速率可能是60FPS。
如果绘制的时间超过1/60s,理论上帧率最多为30FPS。
想象一条1s的线段,分隔成60小段,每个小段的起点都可以作为绘制的起点。
如果绘制的时间超过1/60s,那么绘制的终点会延伸到第二个小段。
这样,一条1s的线段,最多有30个绘制的时间段。

你能得到FPS,但是它不代表真正的性能,每帧持续时间是一个更佳选择。FPS不能线性评判性能表现。

最后, 即使你自己通过自定义线程(不采用CADisplayLink),把绘制时间的空缺填补,实际上绘制的速率并不会变快

主要讲解的是数学部分的知识,OpenGL ES的部分没有引入新的技术点。
工作原因,以后更新会慢一些。能看到这里,你也是喜欢技术的,谢谢支持。来一波关注和喜欢如何 -> 我会加油更新。
附上 源码

以上是关于基于视锥体(平截体)的OpenGL ES性能优化的主要内容,如果未能解决你的问题,请参考以下文章

级联阴影贴图无法按预期工作

OpenGL ES —— Perspective Projection的推导

OpenGL ES —— Perspective Projection的推导

glfw3 - 这个绘图调用完全不在视锥体中

Mali GPU OpenGL ES 应用性能优化--基本方法

视锥体剔除(Frustum Culling)算法详解-透视投影矩阵直接推导