游戏物理引擎比较:架构、特性、性能、集成

This tech note is for game engine programmers and technical directors evaluating real-time/networked game physics. I use GPT-5.6 sol-xhigh to assist in the writing of this note. To be specific, this note compares eight 3D-capable physics systems: Jolt Physics Box3D NVIDIA PhysX 4.1 Havok Physics Chaos Physics in Unreal Engine Bullet 3 / the Bullet Physics SDK Valve’s Ragnarok / Rubikon lineage Rapier as the additional modern comparison The focus is real-time game development: rigid-body dynamics, collision queries, characters, vehicles, ragdolls, destruction/deformables, large worlds, networking, authoring/debugging, deployment, and predictable frame cost. Robotics-only accuracy, differentiability, offline finite-element analysis, and film-only solvers are outside scope except where an engine deliberately spans those uses. ...

分析 Go 垃圾回收机制在游戏服务器中的真实影响

本文源自实际项目实践。服务端基于 Go 1.21、监控基于 Prometheus client_golang v1.9.0,讨论重负载游戏服务器的 GC 停顿、Mark Assist、监控口径与优化,并与 .NET 10 做横向比较。 ...

任天堂哲学

下面是重读《任天堂哲学》时一些书摘,按话题相似度做了分组。 反对性能竞赛 N64的处理能力是PS的4倍以上。面对这种全新的硬件,以往的游戏软件开发方法完全不适用了,致使游戏软件开发的作业量、周期、投资和风险都成倍增长。……这款优秀的游戏机硬件为众多游戏软件开发上设了一个很高的门槛,甚至可以说是壁垒。……就连任天堂自己的开发人员也无法承受。 ...

GDC2026见闻与思考

三月出差去了在旧金山一年一度的 GDC2026,感触很大。成千上万的来自全世界的游戏开发者聚集在这里,仿佛形成了一个巨大的游戏场,给每一个游戏开发者能量。另外旧金山也是一座美丽的城市,依山傍海。这里的人们大多友好而自信,希望以后还有机会去。 ...

Quaternion.FromToRotation的细节

这篇记录实际项目中对Quaternion.FromToRotation(fromVector, toVector) 的实现思路,重点讨论当 fromVector 与 toVector 夹角为 180°(反向)时的稳健处理。主要参考 Stan Melax 的“最短弧四元数”(Shortest Arc Quaternion)思路。 ...

奇妙的Pairing Function

在实际项目里,我们经常需要把二维坐标 (x, y)、或两个整型键合成一个“唯一”的整型键,方便做哈希表/数组索引;又希望能在需要时还原回原来的两个键。这样一个反直觉的需求真的有解决方案吗?“配对函数”(Pairing Function)隆重登场。 ...

WebGL平台的性能限制和解决方案(以微信小游戏为例)

前几日参加了Unite上海2024,受益颇多。本篇先就相对感兴趣的小游戏平台WebGL技术方案为引子,引出一些关于WebAssembly, IL2CPP, 以及.NET 8对Web平台支持等话题。 ...

带物理交互的CharacterController设计与实现

本文也是PhysX物理引擎系列的番外篇。介绍了笔者基于CharacterController(CCT)设计的一个新的角色控制器,在修补Unity/PhysX的CCT的缺陷外,还增添了若干和物理交互相关的有趣特性。代码已经过实际项目验证,这里仅保留和具体业务无关的部分。 背景和需求 前文结尾处提到一些PhysX自带的CCT(Unity也是基于此二次封装出CharacterController组件)在实际游戏开发中的缺点,这里再次总结: CCT不参与碰撞系统的检测。仅当CCT自身移动时会判断是否被其他刚体或CCT阻挡。这就造成一个BUG:CCT自身静止时,其他运动物体会穿过CCT且没有事件触发。官方论坛上有苦主持续8年向Unity反馈这个问题但无法解决,目前已知的唯一绕过方式是每帧给CCT附加一个微小的位移(下文中的SlightMove)。 Unity提供的接口CharacterController.isGrounded效果很不稳定。其内部只是判断CCT上次运动后底部是否触碰物体。即collisionFlags & eCOLLISION_DOWN::eCOLLISION_DOWN。但在上下坡或崎岖地形时,很容易出现侧面触碰或短暂浮空。如果用该接口驱动动画表现甚至跑跳逻辑,效果很差。需要自行基于SceneQuery封装出更加稳定的判定着地的函数。 Unity没有暴露CCT.upVector,角色总是竖直向上的。要实现反重力鞋在任意斜面上行走或像马里奥银河那样在曲面上跑跳穿梭,只能放弃使用CCT但也放弃了其在操作手感上的改善。其实拿到Unity的源码后,只用了十分钟将底层字段暴露到C#层就解决了该问题。 新的角色控制器需要增加的物理交互特性有: ...

PhysX物理引擎(4)Character Controller

本文主要介绍PhysX角色控制器相关的内部机制和使用方法。 PhysX物理引擎系列记录了在实际项目中使用Nvdia PhysX 3.4物理引擎(Code, Doc)的一些经验,有不少对官方资料的补充。 Warm-up Character Controller (a.k.a CCT) is a special physical object handling player movement. In PhysX, CCT is not a Rigidbody, which means it does not integrate seamlessly in collision system. However, there is a kinematic actor underlying in CCT, and you can attach custom data via PxController::getActor()->userData. ...

PhysX物理引擎(3)Rigidbody Dynamics

本文主要介绍PhysX刚体动力学相关的内部机制和使用方法。 PhysX物理引擎系列记录了在实际项目中使用Nvdia PhysX 3.4物理引擎(Code, Doc)的一些经验,有不少对官方资料的补充。 Warm-up Let’s start with some key concepts: Both Kinematic and Dynamic rigidbodies are represented as PxRigidDynamic in PhysX. You can switch between them at runtime using PxRigidBody::setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true). Kinematic and Static actors remain stationary unless explicitly moved in code. Moving Static actors can result in incorrect collision behavior with dynamic actors. When moving Kinematic actors, always use PxRigidDynamic::setKinematicTarget each frame instead of PxRigidActor::setGlobalPose to ensure correct collision detection with dynamic actors. This post focuses on dynamic rigidbody movement, covering topics such as force and torque, gravity, sleeping, and more. ...