我正在开发类似总和war(总结)类型的即时战略游戏,每个“单位”是 ~40 男人。每个男人必须定期:

  • 测量本身周围每个男人之间的距离(用于疏散机制)。
  • 检查其高度的土壤。
  • 被渲染和动画。

我的尝试:

  • 网格单元系统,使得只有附近细胞内的男人才进行距离测量,而不是所有人。
  • 渲染和高度检测距离仅发生3次/每秒。
  • 当男人远离摄像头时将其绘制为广告牌,并停止动画。
  • 将男人从被动行为转换为单位脚本的纯数据。因此,每个单位现在具有pos[40 】, vel[40 】, lastAttackT[40 ]等所有男性数组的特性。
  • 将动画编译成静态网格mesh like一个flipbook,因此单位脚本可以通过DrawMesh()进行绘制。
  • 每个人的动画状态和当前帧都被单独跟踪,并执行:
    每个mans动画状态和当前帧都被单独跟踪,并执行:
  • for(i=0; i<allMen; i++)
  • 使用DrawMesh(flipbook[mesh], Matrix4x4.TRS(pos[i], rot[i], scale), material,mpb)绘制 mesh。
  • 最近一次尝试:将 Unit TRS 转换为字典群组,根据动画和帧。因此,所有来自同一帧的同一动画的男人都可以在单一绘制调用下使用 DrawMeshInstanced() 绘制。它没有工作,我认为这会降低每秒帧数。

经过所有这些处理,每秒帧率仍然小于20个单位(大约1200名字),目标是具有 30+单位 (~1200男人)的图形。这些帧数太低了,人们似乎在做一些非常严重的事情。游戏中的类似的战争都有数千名士兵,通常都在彼此之间进行距离测量,并在60fps下执行数千个绘制调用。