面向对象vs面向数据

http://blog.csdn.net/xoyojank/article/details/8739957


要点摘录:

  • SIMD, Cache friendly
    • 其实大多数做引擎的人都有考虑, 好多人都会说"SSE我很熟"
    • 我去, 看看他们写的代码, 连数据结构内存都没对齐, 还好意思说"SSE我很熟"......
    • 另外, 尽量把相同类型的数据存放在连续的内存空间里, 并且进行顺序访问
    • 如果有需要, 甚至可以使用prefetch指令把数据加载到Cache中去
    • 吐槽一句: 喜欢用if-else的程序员都不是好程序员
  • SOA vs AOS
    • 很多时候SOA(struct of array)比AOS(array of struct)是快的, 因为多数情况下我们遍历一个结构体数组, 只是访问其中的一个字段而已
    • SOA与AOS的区别, 就是面向对象与面向数据程序设计的区别之一
  • class vs struct
    • 这才是面向对象与面向数据在语言层面的差异
    • 最早认识到class性能会出问题的, 是从N3的代码里. floh有说为什么自己的引擎平台抽象层没有使用抽象类, 是因为虚函数对于主机平面的硬件架构性能很差. 本质上来说, 还是cache miss的问题
    • 刚入行时看到有人说, 一开始写程序用struct, 后来用class, 最后还是用struct. 想想这也是从入门->改善设计->改善性能的一个过程吧
  • parallel
    • 现在CPU核越来越多, 甚至手机都4核8核了, 我们游戏已经把双核定义为入门配置了
    • 打开任务管理器, 看看CPU占用率, 除一个核跑满, 其它都是闲置的-_-
    • 所以, 从引擎架构上, 性能优化必需要做的一步就是并行化
    • 一般来说, 可以有两种方式
      • 模块划分: IO一个线程, 渲染一个线程, 物理一个线程, 逻辑一个线程等
      • 任务划分: 动画计算, 场景剔除, AI寻路计算, 粒子计算等可以拆分成一个个的小任务, 扔到任务系统(本质上是一个线程池, PS3可以是SPU)里进行计算
    • 很多顿卡问题其实就是某些API调用时间过长引起的, 可以放入后台线程调用. 如磁盘IO, Shader编译, DirectX API调用等
  • memory, bandwidth
    • 另一个优化方向, 其实就是尽量减少内存占用
    • 一是从数量上减少, 这样数据处理次数就减少了
    • 一是从单位占用上, 可以提高内存访问效率
    • 再就是内存对齐了, 参考SIMD
    • 带宽的考虑, 更多的是GPU端. 如Vertex, Texture的缩小, FrameBuffer的UpSampling, PixelFormat的压缩, UV的运算(影响Cache), Overdraw的减少(Fillrate优化), Shader branch的减少(影响Cache)
    • 从ForwardShading到DeferredShading是算法复杂度上的考虑, 从DeferredShading到DeferredLighting就是带宽和灵活性上的考虑了. 现在又出来个TileBasedRendering, 都是因为硬件的变化带来算法/架构上的变化

你可能感兴趣的:(面向对象vs面向数据)