【实机演示】几十万单位同屏乱战!我用 Cocos 做了个《星核防线·无限战场》

【实机演示】几十万单位同屏乱战!我用 Cocos 做了个《星核防线·无限战场》

https://www.bilibili.com/video/BV1nf8v6yEpM/

10_终局漩涡_环阵决战

最近一直在折腾一个比较极端的 Cocos 实验项目——《星核防线·无限战场》

最开始只是想做一个“大规模同屏战斗”,后来越做越上头:

几千 → 几万 → 十万级 → 继续往几十万单位规模压。

最终就变成了现在这种满屏单位、弹幕、敌群同时运动和交战的“无限战场”。


:video_game: 目前主要做了什么

整个项目的核心目标很简单:

尽可能把同屏单位规模做大,同时保持战斗本身是动态的,而不是单纯摆几十万个静态模型。

目前主要包含:

  • 大规模敌人实时移动
  • 海量单位同屏
  • 实时目标搜索与攻击
  • 大量弹幕/子弹飞行
  • 敌群包围与聚集
  • 超大范围战场
  • 玩家自由移动、观察战场
  • 不同单位规模下的性能测试
  • 十万级甚至更高规模的压力测试

下面这些都是实际运行过程中录制的画面。

01_彩色洪流_密集压境
02_黄金环阵_高速展开
03_十万级单位_黑洞围杀
04_蓝色虫群_瞬间爆发
05_青色海啸_全屏铺满


:fire: 我比较想挑战的一件事

很多游戏做到几百、几千个动态对象之后,就已经开始考虑:

DrawCall、节点数量、碰撞、AI、寻路、GC、对象池……

但我这个项目想尝试的是另外一种思路:

如果一开始目标就是十万、几十万甚至更高数量级,还能不能按照传统游戏对象的思路去设计?

所以《星核防线》目前更像一个:

游戏 Demo + 大规模战斗实验场 + Cocos 性能压力测试项目。

我也一直在不断拆掉原来不适合超大规模单位的设计。


:zap: 为什么要做这么多单位?

其实并不是单纯为了跑分。

我比较喜欢那种真正有“战争规模感”的画面。

不是屏幕上十几个敌人围着玩家,而是镜头拉远以后:

整个地平线、战场、包围圈全部都是敌人。

再配合弹幕、攻击轨迹、阵型和大范围运动以后,那种压迫感是普通规模很难做出来的。

06_橙色巨浪_吞没战场
07_蓝橙双阵_正面交锋
08_蓝橙双潮_旋涡碰撞
09_超大规模_青色洪流
10_终局漩涡_环阵决战


:test_tube: 后面还准备继续测试

目前这还不是最终形态。

接下来我比较想继续折腾:

  • 更高单位数量
  • 更复杂的敌群行为
  • 更大的无限战场
  • 更密集的弹幕系统
  • 多玩家 / AI 玩家同时参战
  • 更极端情况下的 CPU / GPU 性能表现
  • 尽量让“单位数量增加”和“性能下降”之间的曲线更平缓

看看最后到底能把 Cocos 推到什么程度。


:thinking: 也想听听大家意见

这里很多朋友都是长期做 Cocos 的,所以也想交流一下。

如果是你们来做这种 十万级 / 几十万级动态单位同屏,最先会考虑优化哪一块?

渲染?AI?碰撞?数据结构?GPU 计算?还是干脆完全不用传统 Node/Component 模型?

后面如果大家感兴趣,我也可以继续整理一些:

实现思路、踩坑记录、性能变化、不同方案对比,以及这种超大规模单位到底应该怎么组织。

项目:《星核防线·无限战场》

作者:Cocos 小有

3赞

各位做性能优化的大佬,有测过这么多单位的极限情况吗?请问都是如何处理这种极限情况的呢?

圆梦:

那么最终同屏极限是多少

电脑在1000万单位,手机端50万单位,60FPS,掉帧50FPS

gpu instance,lod,视距裁剪引擎内置也就这些了,数据查询可能要上ecs那套数据紧密存储的方式

:+1: :+1:很好的思路

nb,期待硬核分享

cocos4.0 对gpu instance有个性能优化提交你可以合并了测试看看 perf: optimize instanced buffer batching by llsansun · Pull Request #269 · cocos/cocos4

1赞

你这都是一个方块吗,那实际上用的模型是不是就少很多了

:smile: 更的很慢的~

对,都是方块,目前只考虑同屏单位数量、锁敌子弹、扇面打击效果


我也提几点思路 :yum:1.用ecs优化数据查询,但是cocos的ts并不像C#一样支持SoA,所以必须选择TypedArray 2.将部分合适的(纯计算无引擎api调用)代码转为Wasm 3.碰撞系统肯定是得手搓了,看gif帧间连续性较强可以用SAP,如果可以的话3d场景也能简化为使用2D的碰撞检测,(碰撞系统就挺适合转成Wasm的)

1赞

感谢大佬提供的思路 :+1:

这里还有一个问题。

需要计算一下pixil per object.
同屏几十万其实可能第五个OBJECT都退化成一个像素了。。

1赞

开源还是store

其实我想说…不如换引擎了(害怕被锤,手动狗头保命) :rofl:

开源吗?????