我正在玩ECS。我想知道是否有可能将很多具有刚体实例化为实体的立方体以得到更多的立方体?
我希望场景中成千上万个(如果不是更多的话)简单(Mesh + Collider + Rigidbody)对象只是与场景进行被动交互。
答案 0 :(得分:0)
ECS is an architecture pattern 代表实体组件系统。回答您的问题;是。如果您以适应这种技术要求的方式来设计代码,则可能有许多简单的网格-刚体-碰撞器实体实例。答案的其余部分以您所指的是设计自己的游戏引擎的假设为前提(由于问题缺乏细节)而向前发展
根据我的经验(我设计了2个物理引擎和3个自定义游戏引擎),主要瓶颈如下:
图形实现-无论您使用的是OpenGL还是DirectX,经验不足或过时的图形实现都是自定义引擎瓶颈的巨大来源。为了解决这个问题,我建议使用modern OpenGL tutorials,尤其是在延迟渲染之类的东西上。在DirectX中,实现的过程可能会变得非常复杂,因为免费提供的在线学习资源较少(部分原因是,实现细节在DirectX中的版本之间存在很大差异)。我从最新的Directx版本中听到的一个重大新变化是mesh shaders,它似乎可以“简化”流程。研究将是您完成此步骤的朋友
物理-这会降低帧速率,尤其是在发生很多冲突的情况下。除非您想成为物理学程序员,否则建议您使用可用的开源实现,例如Bullet physics,这是一个出色的C ++物理引擎。 PhysX是一种替代方法,但是实现起来可能会令人望而生畏,而且两个库的文档都不够完善或简洁。这些库可以轻松地(从设计的角度)集成到标准ECS框架中。如果您坚持自己设计,建议您阅读Erin Catto, Erwin Coumins, Gino Van den Bergen,Dirk Gregorius等人的GDC演示文稿。
对于“成千上万个”,我几乎可以保证,如果它们不是球体,成千上万个被动对撞机将通过自定义物理实现绝对降低您的引擎速度。您可以在两个区域中使用迭代求解器轻松对自定义物理引擎进行多线程处理。内部对撞机几何体更新(包括边界体积和世界几何体)以及碰撞检测的狭窄阶段。如果您的广相碰撞检测输出独特的潜在碰撞对,那么如果在此阶段之前更新了几何图形,则可以轻松地并行进行实际碰撞测试,因为碰撞检测可能被视为只读任务。 对物理学的最后一个简单优化是对use collision islands (see bottom of page under optimizations)进行优化,这实际上将冲突分为独立的组,即,两个janga塔将由两个碰撞岛表示,并且由于数据依赖性,每个都可以在单独的线程中求解。以及迭代求解器的性质。
对于成千上万的用户,您甚至可以考虑尝试compute shaders,因为它们非常适合于被动模拟大量对象。在学习如何使用这些着色器时,所提供的链接实际上包含了简单的冲突。