面向对象vs面向数据
最近看了OGRE2.0的一个PPT, 触动挺大的其实OGRE一直以来所为人诟病的性能问题, 何偿不也是我们引擎存在的问题虽然很多时候我们都拿OGRE和GameBryo的效率当反面教材, 但是自己也没有做到极致相对于GPU的性能优化来说, CPU的性能优化难得多就好比游戏开发的书籍, 讲API/渲染的多, 讲架构&逻辑的少可能很多人以为, 做引擎开发就是做图形开发, 对于国内的游戏来说好像没错但是如果真正做下来, 资源管理, 场景管理, 动画, 物理, AI, UI, 音效, 脚本, 甚至技能系统等都是非常有深度的这也就是导致了, 很多自研引擎能够把GPU的性能优化得很好, 玩起来却仍然不流畅究其原因, 大多数是对数据的处理存在瓶颈
最早让人觉得"毁三观"的是Battlefield3的一个PPT, 打破了传统基于树/图的场景管理模式15000+的物体, 并行Bruce force的一个线性数组做Culling, 比基于树形结构的管理方式快了3倍, 代码量只有1/5为什么呢? 是因为当前的硬件架构决定了, 大多数的瓶颈是在数据访问上面CPU与内存之间有速度非常快的Cache, 如果数据可以在Cache中直接找到, 会比从内存中Load过来快很多具体快多少呢? 我只能说不是一个数量级的之所以说是"毁三观", 是因为这跟学校教的完全不一样大学里的"数据结构", "算法导论", 拿到当前领域&当前硬件体系结构上, 无疑是有一定误导性的各种所谓的O(n)算法, 都是"brach heavy"的, 会引起非常多的"cache miss"举个例子, 在某些情况下, 二分查找还不如线性遍历来得快再加上各种面向对象理论的洗脑, 完全就走上了一条邪路当然, Battlefield3里还利用了parallel(并行)的思想, 并不仅仅是"cache frieldly"就可以把效率提上去的说了这么多, 其实就是想阐明一句话(OGRE2.0 PPT里的):SIMD, parallel, cache-friendly algorithms are the industry standard today!
当VTune的热点函数看不出什么来, 当GPA的GPU柱状图都很平均, 但是性能仍然不够好, 是不是有些抓狂?想想上面这句话, 也就有了优化的方向!SIMD, Cache friendly
- 2楼miztook1小时前
- 很有价值的文章,很多时候cpu的瓶颈被忽视,认为是客户端逻辑的问题,导致后期效率不高无从下手。
- 1楼hmxp8昨天 21:32
- 好文,优化真是个无底洞。。。n交了几个Server端的朋友,n对他们长期对每一个Bit压榨的经验很是受用,n他们就是一致推崇原始的线型数组,让一切在预计的范围内n(感觉与主机上的优化相像,一个优化的目标环境设定非常重要,这也是咱们客户端的一个难处)nFrostbite作为一线团队长期积累的结晶,看来没准也是触类旁通,突破思维,Ogre作为一个设计过度的典型, n对比真的很强烈了~
- Re: xoyojank8小时前
- 回复hmxp8nC语言里的位域是个好东西