StickEngine-架构2-物理地图-服务端篇
整体概述是 http://dreamyouxi.com:7129/blog/1203
物理应用中,消耗大头主要是2大类,模拟和查询。
大地图意味着计算压力会更为突出
例:子弹飞行速度中,用CCD的思想去做模拟的话,一发子弹,开销就会特别大,一般人的高度是1.8米,碰撞盒0.5米,因此 场景查询步长0.5米,基本是可接受的最小值了,子弹飞行1秒400米 就要迭代800次,这个开销是很巨大的,单CPU测试 1秒只能迭代120W次 CPU就饱和了

在这个典型的场景中 ,查询1W次的的消耗是9MS

CreateTestcast([=](Room*room) { auto pre = PrefabsCache::GetInstance()->GetTestPrefab(TestPrefab::PlayerTmp); PrefabsCache::GetInstance()->GetPrefabs(100)->CreateGameObject(room); pre->transform.position.Set(3.0f, 10.0f, 0.0f); auto obj = pre->CreateGameObject(room); auto now = std::chrono::system_clock::now(); for (int i = 0; i < 1200000; i++) { room->GetPhysicsScene()->Raycast(Vector3f(357.0f, 75.0f, 487.0f), Vector3f::down(), 30.0f, LayerMask::MaskAll); } auto cost = chrono::duration_cast<chrono::milliseconds> (chrono::system_clock::now() - now).count(); cout << "cost time ms=" << cost << endl; });
如果64人战斗的话,只支持一帧 一个玩家进行156次查询 射速一帧运动20米,按照刚刚的模型 那么只能支持模拟约4发子弹,这个代价是很大的。
普通AK步枪 射速都是1秒10发,这个是性能上限。
要强行运算的话 意味着单核会受限,因此需要引入多核心支持。基本思想是分治,把大地图拆分为N个小地图,
基本算法原型和八叉树思想基本一致,从而达到及时完成计算任务。
需要做的额外难点的工作是不同CPU核心的场景之间的衔接,和线程安全性的处理,场景查询如此,物理模拟更如此。
在查询情况中,可以考虑一些其他做法,来加速处理速度,比如部分可以通过高度图来进行常数级查询。