嘿,我正在用Godot 4构建一个3D MOBA/RTS-ish原型,但已经遇到了一个性能墙。单位基本上是LOL式的僵尸,逻辑故意简单:- 移动沿着一条路线- aggro最近的敌人在攻击范围内- 攻击当前目标- 如果正在攻击一个敌方建筑并且一个敌方单位进入aggro范围,切换到单位- 返回移动状态,一旦没有有效目标每个基地最多可以有12个激活波。早期波包含2个单位,而晚期波可以扩展到6个。性能在MacBook Pro M2 Pro上大致如下:- 游戏开始时约100 FPS- 约170个活动演员:40–60 FPS- 约220个演员:大约30 FPS- 在总共约250个演员中添加仅20-30个演员,FPS就会下降到5-10个FPS最后这个下降我不理解。从220个演员到250个演员的增加仅为14%,但帧时间似乎会增加几倍。FPS基本上与摄像机所看的内容无关。看一个空白的地图区域给我提供了几乎相同的FPS,就像直接看单位一样,所以我假设主要瓶颈是CPU侧逻辑,物理或引擎侧处理而不是渲染。已经检查了内置的调试器。寻路和视觉/FOV检查似乎有非常小的开销。我还简化了单位逻辑到可以接受的程度,但性能下降仍然存在。热量调节似乎不是问题。结果一致,机器没有过热。物理追赶行为是否可以解释这种锐利的下降?例如,如果渲染FPS为30,是否已经处理了大约每个渲染帧的两个物理tick,情况随着帧率下降而越来越糟糕?要确定实际来源的最佳方法是什么?特别是哪些指标将观察到这种类型的问题?- 物理时间与空闲时间- 3D碰撞对数- 导航处理时间- 每个渲染帧的物理tick数此外,在Godot脚本调试器无法指向明显昂贵函数的情况下,如何在macOS上-profile引擎侧工作?我不期望250个完全模拟的单位是免费的,但突然从30 FPS到5-10 FPS的下降让我觉得我正在击中一个特定的反馈环或阈值而不是正常的每单位缩放。任何关于如何隔离这个问题的指针都将不胜感激。
Godot:从220个简单MOBA样单位切换到250个单位时,FPS从约30下降到5-10
评论 (0)