关于遮挡剔除的几个算法尝试
2016-10-31 23:09
253 查看
之前在公司使用DX9做端游引擎,优化性能中涉及到一个算法,就是遮挡剔除。最经典的算法就是使用API中的遮挡查询接口,GPU
Gem上面有一篇文章专门讲这个。实话说,这个算法看过好几次,直到今天都没有彻底明白。后来看到有的人评价说这个算法不一定能改进性能,甚至还会导致更低。看到这个我有点底气彻底放弃了,是的,我一直有个观点,就是越简单越好,一旦某个东西很复杂,我就会警惕起来,就会怀疑设计有问题。当然听说DX11下面这个遮挡剔除的接口很好用,有机会可以试一下。
后来让一个同事去研究了下CE3里面的遮挡剔除算法。CE3里面使用了软件光栅化的方法,大致流程就是,在编辑器中放置一些正交的长方体作为遮挡体,在渲染时,每帧都在CPU上面光栅化这些遮挡体(当然是在分辨率比较小的渲染目标上进行),然后对远处物体进行查询。不过这个同事在我们自己的引擎上实验过后得出的结论是,反而会拉低帧率。我的判断是他没有使用好SSE指令,<
4000
/span>CE3这种引擎绝不会做没有名头的事。
既然这个不能用(肯定是我们自己的原因),那就自己创新算法吧。受CE3算法的启发,我就想,何不将光栅化的操作放到GPU上呢。要知道,GPU干这种“粗活”比CPU好上千百倍。我就想到有一个东西可以直接拿来用,都不增加额外的开销,那就是Pre-Z的结果。具体做法就是将上一帧的Pre-Z结果在GPU里面降采样,然后拷贝到CPU,使用这个结果进行查询。
当然,原理很简单,实际中遇到的技术细节还真不少。首先,由于是使用的上一帧的深度值,那么在镜头快速旋转时,该出现的物体没有出现。还有个问题,物体的包围盒在屏幕上占有一定面积,如果每个像素都检查就太耗性能了,检查几个关键点就行了,可问题又出现了,位于移动物体后面的物体会有时出现有时消失。经过不断改进,总算都解决了。在很多场景中,尤其是主城内,这个算法极大提升了速度。
在实现中,算法细节还有不少。不过只要方向对了,剩下的就是用时间来磨细节了。
Gem上面有一篇文章专门讲这个。实话说,这个算法看过好几次,直到今天都没有彻底明白。后来看到有的人评价说这个算法不一定能改进性能,甚至还会导致更低。看到这个我有点底气彻底放弃了,是的,我一直有个观点,就是越简单越好,一旦某个东西很复杂,我就会警惕起来,就会怀疑设计有问题。当然听说DX11下面这个遮挡剔除的接口很好用,有机会可以试一下。
后来让一个同事去研究了下CE3里面的遮挡剔除算法。CE3里面使用了软件光栅化的方法,大致流程就是,在编辑器中放置一些正交的长方体作为遮挡体,在渲染时,每帧都在CPU上面光栅化这些遮挡体(当然是在分辨率比较小的渲染目标上进行),然后对远处物体进行查询。不过这个同事在我们自己的引擎上实验过后得出的结论是,反而会拉低帧率。我的判断是他没有使用好SSE指令,<
4000
/span>CE3这种引擎绝不会做没有名头的事。
既然这个不能用(肯定是我们自己的原因),那就自己创新算法吧。受CE3算法的启发,我就想,何不将光栅化的操作放到GPU上呢。要知道,GPU干这种“粗活”比CPU好上千百倍。我就想到有一个东西可以直接拿来用,都不增加额外的开销,那就是Pre-Z的结果。具体做法就是将上一帧的Pre-Z结果在GPU里面降采样,然后拷贝到CPU,使用这个结果进行查询。
当然,原理很简单,实际中遇到的技术细节还真不少。首先,由于是使用的上一帧的深度值,那么在镜头快速旋转时,该出现的物体没有出现。还有个问题,物体的包围盒在屏幕上占有一定面积,如果每个像素都检查就太耗性能了,检查几个关键点就行了,可问题又出现了,位于移动物体后面的物体会有时出现有时消失。经过不断改进,总算都解决了。在很多场景中,尤其是主城内,这个算法极大提升了速度。
在实现中,算法细节还有不少。不过只要方向对了,剩下的就是用时间来磨细节了。
相关文章推荐
- 基础的东西,关于二叉树的几个算法 C#的
- 关于递归的几个算法实现
- unity中关于游戏场景的优化——遮挡剔除
- 关于结构体指针以及.和->区别的几个尝试
- Myclipse关于不能同时发布项目到几个服务器的尝试
- 关于链表的几个常见的算法
- 关于字符串的几个算法
- 几个有用的网站/博客 关于JAVA 算法。
- 关于人像美容之祛痘祛斑算法的一些尝试。
- 关于JVM的几个垃圾收集算法思想
- 关于图像离散区域剔除算法的 优化问题-待发送的回复和图片
- 关于图的几个算法
- 关于序列的几个算法
- 积跬步至千里——算法强化训练(5)关于类的几个操作
- 几个关于串的小算法题:最小K个数、连续子数组的最大和、字符串全排列求法、数组循环移位
- 关于网站抽奖活动算法的尝试
- 关于动态规划的几个算法
- 关于用户行为统计算法尝试(java)
- C++11新特性应用--介绍几个新增的便利算法(关于最大值和最小值的算法)
- 关于数值统计的几个算法