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核心的场景之间的衔接,和线程安全性的处理,场景查询如此,物理模拟更如此。

在查询情况中,可以考虑一些其他做法,来加速处理速度,比如部分可以通过高度图来进行常数级查询。

Scroll Up