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

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

July 28, 2024 · 8 min

带物理交互的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#层就解决了该问题。 新的角色控制器需要增加的物理交互特性有: ...

March 18, 2024 · 8 min

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. ...

December 4, 2023 · 4 min

PhysX物理引擎(3)Rigidbody Dynamics

本文主要介绍PhysX刚体动力学相关的内部机制和使用方法。 PhysX物理引擎系列记录了在实际项目中使用Nvdia PhysX 3.4物理引擎(Code, Doc)的一些经验,有不少对官方资料的补充。 Warm-up We already know that Kinematic and Dynamic rigidbody are both PxRigidDynamic in PhysX. Use PxRigidBody::setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true) to turn a dynamic actor into kinematic at runtime, and vice versa. Kinematic and Static actors always stay in the same location unless you move them in your code. When moving Static actors, their collisions with dynamic actors can be wrong. When moving Kinematic actors, you should always use PxRigidDynamic::setKinematicTarget in each frame rather than PxRigidActor::setGlobalPose to achieve correct collisions with other dynamic actors. In this post we focus on dynamic rigidbody movement, e.g., force and torque, gravity, sleeping and so on. ...

September 4, 2023 · 3 min

PhysX物理引擎(2)Collision

本文主要介绍PhysX碰撞检测的一些内部机制和使用方法。 PhysX物理引擎系列记录了在实际项目中使用Nvdia PhysX 3.4物理引擎(Code, Doc)的一些经验,有不少对官方资料的补充。 Warm-up Static, Kinematic & Dynamic Static colliders are non-movable. In fact, they are not rigidbody, just PxRigidStatic. Kinematic and dynamic rigidbody are both PxRigidDynamic, and can switch to each other at runtime by setRigidBodyFlag(PxRigidBodyFlag::eKINEMATIC, true/false). The biggest difference is that kinematic rigidbody behaves like infinite mass, and will not move by external force. Instead, you call MovePosition on it. Dynamic rigidbody is the only type we can AddForce to, which has mass, center of mass, and inertia tensor to simulate a natural movement with Newton’s laws of motion. classDiagram PxRigidActor <-- PxRigidStatic PxRigidActor <-- PxRigidBody PxRigidBody <-- PxRigidDynamic PxRigidActor *.. PxShape class PxRigidBody { PxRigidBodyFlag } class PxShape { PxShapeFlag } We cannot make a rigidbody without a shape. Shapes are tangible, with a real size. ...

August 11, 2023 · 3 min

深入 LossyScale

本文是PhysX物理引擎系列的番外篇,其实要弄明白一个3D数学问题:如何处理父节点带有非均匀缩放和旋转时,子节点的最终大小和形态。 问题源自笔者在修改物理引擎为其添加scale属性时遇到的一个bug。解决后对WorldScale为什么叫做LossyScale、空间变换和基变换有了更深的理解。 ...

July 19, 2023 · 6 min

PhysX零值Crash

本文是PhysX物理引擎系列的特别篇,记录了影响近一周的物理引擎底层概率性Crash的定位过程和修复方法,具有很高的实践参考价值。“有多高?”“三四层楼那么高啦!” 发现问题 运维同事发现体验服和某区在新版本上线一小段时间后,会出现概率不高但持续出现的进程Crash。这里先简单说明一下:我们会在一台机器上部署多个GameServer实例,每个GameServer实例进程同时进行着多场不同的Match,如果某一场Match出现了业务层Crash,并不会影响其他Match。但如果是C++物理库内出现Crash,则会同时中止其他正常运行的Match,对玩家的影响较大。 ...

June 13, 2023 · 5 min

PhysX物理引擎(1)Scene Query

本文主要介绍PhysX场景查询的一些内部机制和使用方法。 PhysX物理引擎系列记录了在实际项目中使用Nvdia PhysX 3.4物理引擎(Code, Doc)的一些经验,有不少对官方资料的补充。 Warm-up A Scene in PhysX engine is a container of objects in a hierachical manner. --- title: Scene Hierachy --- classDiagram direction LR class world class scene { Flags Gravity ... } class actor { ActorFlags Name GlobalPose ... } class shape { Flags GeometryType LocalPose QueryFilterData SimulationFilterData ... } class geometry { ... } class material { friction restitution damping } world "1"*.. "N"scene scene "1"*.. "N"actor actor "1"*.. "N"shape shape o--geometry shape o--material There are only position and rotation in GlobalPose and LocalPose, no “scale”. Scale only reflects on geometry’s actual size. ...

May 26, 2023 · 3 min