0

我在玩 ECS。我想知道是否有可能将许多具有刚体的立方体实例化为实体,以便获得更多?

我想要场景中的数万个(如果不是更多)简单(Mesh + Collider + Rigidbody)对象只是为了被动地与场景交互。

4

1 回答 1

0

ECS 是一种架构模式,代表实体-组件-系统。回答你的问题;是的。如果您以这种方式设计代码以适应此技术要求,则可能有许多简单的网格-刚体-碰撞实体实例。这个答案的其余部分正在推进您所指的设计自己的游戏引擎的假设(因为问题缺乏细节)

根据我的经验(我设计了 2 个物理引擎和 3 个自定义游戏引擎),主要瓶颈如下:

  1. 图形实现——无论您使用的是 OpenGL 还是 DirectX,缺乏经验或过时的图形实现都是自定义引擎瓶颈的重要来源。为了解决这个问题,我建议使用现代 OpenGL 教程,特别是在延迟渲染等方面。在 DirectX 中,实现可能会变得相当复杂,因为可免费在线学习的资源较少(部分原因是在 Directx 中不同版本的实现细节差异很大)。我从最新的 Directx 版本中听到的重大新事物是一种称为网格着色器的东西,它似乎“简化”了这个过程。研究将是你这一步的朋友

  2. 物理 - 这可以降低帧速率,尤其是在有很多碰撞的情况下。除非你想成为一名物理程序员,否则我建议使用可用的开源实现,例如Bullet Physics,一个出色的 C++ 物理引擎。PhysX 是一种替代方案,但实现可能令人生畏,而且这两个库都存在低标准或简洁的文档。这些库可以轻松集成(从设计角度)到标准 ECS 框架中。如果您坚持自己设计,我建议您阅读Erin Catto、Erwin Coumins、Gino Van den Bergen、Dirk Gregorius 等人的 GDC 演示文稿。

至于“数以万计”,我几乎可以保证,如果它们不是球体,数以万计的被动对撞机绝对会通过自定义物理实现减慢您的引擎。您可以在两个领域使用迭代求解器轻松地对自定义物理引擎进行多线程处理;内部碰撞器几何更新(包括它们的包围体和世界几何)以及碰撞检测的窄阶段。如果您的广泛阶段碰撞检测输出独特的潜在碰撞对,如果您的几何在此阶段之前更新,您可以轻松地并行化实际碰撞测试,因为碰撞检测可能被视为只读任务。最后一个简单的物理优化是使用碰撞岛(参见优化下的页面底部),它本质上将碰撞分成独立的组,即两个 janga 塔将由两个碰撞岛表示,并且由于数据依赖性和迭代求解器的性质,每个都可以在单独的线程中求解。

对于数以万计的用户,您甚至可以考虑尝试使用计算着色器,因为它们非常适合被动模拟大量对象。提供的链接实际上包含了学习如何使用这些着色器的简单碰撞。

于 2019-05-23T18:47:09.903 回答