数据导向设计:从对象到数据的思维转变

Introduction to Data-Oriented Design [pdf]

在高性能计算领域,传统的面向对象设计(OOD)往往因内存访问模式不佳而拖慢性能。本文深入剖析数据导向设计(DOD)的核心理念:不再关注对象如何封装行为,而是聚焦数据如何被读取和写入。通过对比 Bot 类在 OOD 和 DOD 下的内存访问差异,文章展示了 DOD 如何通过线性数组和循环优化,将内存延迟从数千周期降至几十周期。这种“从后往前”的设计思路,不仅提升了 CPU 缓存命中率,还让多线程和 GPU 加速变得更容易实现。

数据导向设计的核心在于将关注点从代码逻辑转移到数据的读写方式上。
  1. dustbunny

    这种世界观真正的核心支柱,是在设计算法时将数据置于首位。

    所以,如果你正在开发物理引擎并优化碰撞检测,你会将“输入数据”到“输出数据”这一解决问题的过程,作为决定代码如何编写的主要驱动力。

    你先定义数据,然后在此基础上构建。

    不同类型的应用程序拥有不同形态的数据,因此其最优代码的形态也各不相同。例如,物理引擎会使用某种空间哈希结构,其优化方式取决于运行时是否允许添加或移除对象。3D 渲染器则操作着巨大的矩阵和顶点数据缓冲区。而游戏通常由一些长生命周期对象和大量短生命周期对象组成。

    Mike Acton 演讲中的核心信息是:

    “如果你的数据不同,那么你的问题就不同。”

    虽然 ECS 系统并非能完美解决所有问题的万能灵药,但它们通常比面向对象的层级结构更具可塑性。这意味着在 ECS 框架中编写“接近最优”的代码,通常比在成熟的面向对象代码库中更为可行。

    但关键信息并非“使用 X 框架”,而是“从定义数据开始”。

  2. HexDecOctBin

    Mike Acton(本次演讲的作者)发布了一个关于数据导向编程的 LLM 技能:https://github.com/macton/nagent/blob/main/context/data-orie...

  3. ghosty141

    我个人非常喜欢 DoD 这个理念,但根据我的经验,它在实践中往往效果不佳,因为理解问题的一个关键假设通常无法满足——新的需求层出不穷,且不断变化。

    在公司里,我们正在从头重写和重构系统,这简直疯狂,因为旧系统的限制已经消失,我们收到了最离谱的功能需求,甚至连团队负责人等人都接受了。这使得采用这种方案变得不可能,因为在我看来,DoD 恰恰与灵活设计背道而驰。

    我很好奇,是否真有人在大型长期商业项目中真正遵循过这一理念?

  4. PessimalDecimal

    这似乎只是对缓存感知数据结构和算法的一种特定包装。还有更多内容吗?

  5. inigyou

    认真提问。在实践中,DOD 是否意味着比数组编程更多的东西?

同日更多故事

2026-07-26