前不久,深圳小爱灵动基于 Cocos Creator 推出元宇宙项目「灵动元境」刷爆了很多人的朋友圈,该项目发力品牌元宇宙生态基础设施建设。

a3f3085e4c0efe1377ed14c972d0bece.jpeg

孙晨阳

深圳沙龙上,小爱灵动游戏内容业务负责人孙晨阳分享了如何使用 Cocos Creator 快速搭建一个多人游戏并进行调优,从材质优化、角色优化、场景优化、性能优化、插件配合等方面聊了聊自己的经验与心得。以下为分享内容。


922e6aa3963ce5494d9423908a70e3ff.gif

137069c8f0932ae6ba42320af5481a47.gif

Demo 演示效果

体验地址:

https://cdn.aigamify.cn/AI-GAME/CocosClub/

材质优化

Demo 中所有材质都使用了定制化,分别基于 Cocos Creator 的 Unlit、PBR 和 Toon 材质做了精简和优化。

0ad471fc0a9d8ba4ff90174725c7bd29.png

以 Unlit 材质为例,在 FS 部分去除了 MainColor,假如需要用到 Color,后续可以通过宏开关控制。

dd91fc80b23ffbd2433c2331f92e8404.png

同时在 VS 里,把 TilingOffset 去除了 Offset 部分,只使用 Tiling 就可以了(大部分情况下 offset 用不到),同时也增加了宏开关。

1c819894e60c0eed6228d5288020ce46.png

PBR 材质是一个通用材质,需要针对各个建模软件做适配的一些参数,所以做了很多兼容性处理,比如 albedoScale、emissiveScale 等精度参数都可以通过宏开关或者注释的方法去掉。

如果不需要使用 occlusion 或者 specularIntensity,还可以对 PBR 材质做进一步的优化。同时 PBR 中的 Lightmap 部分也有很大的优化空间,这块的优化可以根据项目去决定。

角色优化

角色渲染

角色整体的的定位与渲染偏卡通风格,这里采用了 Cocos Creator 默认的 Toon 材质进行优化与精简,减少了卡通渲染的色阶。去除二阶着色的同时,也减少了一阶着色的参数。

Cocos 默认的 Toon 材质是三阶着色,分别是 BaseColor 基础着色 + Shade1 + Shade2,这里去除了 Shade2,把 Shade1 称为一阶着色,BaseColor 称为基础着色。

eb23bf60914deac937ac6c8d2199b9af.png

此外,对一阶着色设置了宏开关进行控制。

6be5b5d6af377763d2204ca180703438.png

我们可以在材质里通过拖动条(slider)更方便地拖动一阶着色。

81f776d5a4871bf7c94551abd6e1b888.png

高光部分则增加了宏开关,只有眼镜、头发等部分使用了高光,进一步减少渲染的开销。

皮肤、头发和衣服使用了边缘光,考虑到角色的颜色可能会改变,对边缘光的颜色也做了简化,改变肤色的时候边缘光可以随之改变。

7855ce94551af20eba7ccddf9fb52780.png

为了减少材质数量和网格开销,角色的丝袜使用了细节贴图实现。这里同样做了宏开关的配置。

cbe7618f2a041b29552015febea5c27f.png

30a1acda6e1ab3b8ae1e0ef3749363ca.png

2c125af9bebbfb5b9b390bb05f58a347.png

动画优化

由于实时骨骼系统下 uniform vec 有数量限制,因此目前在资源导入期会根据骨骼数量做拆分,而这会对其他系统也产生影响,常会出现多个材质存在,影响了后续的合批处理。

如果确定不会使用实时计算模式(对应 SkeletalAnimation 组件的 useBakedAnimation 选项未勾选时),可以勾选此项以提升性能。但注意改变此选项会影响生成的 prefab 内容,需要对应更新场景中的引用。后续重构会移除此流程。

这里删除手指的数量,同时还可以优化动画的体积大小。

66229e73738359170dc8004ac931f444.png

性能优化

角色的贴图增加了 Multi_Texture 和对应的宏开关,方便进行 instancing 合批。

18159db757e92f050bf9245802be64cd.png

f50664a886e846d062483ac8ba5ba8b6.png

925155def274483aa0c7a4d52d520de4.png

同理,角色的细节贴图也可以设置,Multi_Detail_Texture,并增加对应的宏开关,通过宏减少设置的属性。

702d976e8ade7df169a770533e56c05c.png

40f851f7831b77f40f5ab0a759e7e3dd.png

考虑到角色皮肤、五官和头发颜色都需要改变,为了不打断烘焙动画的合批,在更换颜色时候也使用了。

f2b0cae99053f8e01d163df8e53b614b.png

51d0f617f6b5329f898eef1efe886dbe.png

a7dadca41641d79dbb3fc6d77acb2bec.png

随机颜色 DrawCall 并没有被打断

其他设置

角色的身体和脸部都设置的 Blendshapes,方便支持 Morph,Morph 可以同时支持实时动画和烘焙动画。

155bc5b6f5db5181fd38f5162544c925.png

4e81ae7dcee5e0b6ff97cbc898d5c798.png

4ad985d28b82030db53b43def4348bec.png

因为脸部的物件比较多,所以为了减少骨骼和蒙皮压力,把面部以 socket 物件的形式绑定在了骨骼的头部节点。

66edd2b4b324ef92bd624b378b3d1a61.png

5eac919a7c3e48422611537f93288430.png

自己控制的角色实用了实时动画,这样可以使用动态骨骼和 Crossfade 动画过渡,近距离观看更加细腻。

7a5aa425dffafaad472e58a74ba8f463.png

场景内其他角色使用了烘焙动画,方便 GPU INSTANCING,这样性能更好,但缺点是导出的动画体积会增加。

8b5e8bcb718372f851b8f6a370074324.png

通过以上设置,人物单节点 DrawCall 可以控制在7-8,多人人物不同颜色不同头发和衣服的 DrawCall 也可以通过 instancing 合批控制在10次 DrawCall 以内。

场景优化

将场景素材包导入到 Cocos Creator 后,将整个场景的子节点导出 Json,重复的物件都可以使用一个预制体来复用,再使用单一预制体+Json 配置还原原始场景。

如果使用导出的整个场景,同样的物件会是不同的 Mesh, 这样体积不仅会变大,也不能进行 Instancing 合批。

c1aa9ed88893a0c12f13b7457fc2e562.png

28bc17d60cf1622880e6e561bbc3d3da.png

预制体生成

光照优化

整个场景使用了1个平行光和20个 Sphere Light。环境材质使用了 Cocos 自带的 PBR,进行了光照烘焙,并对光照烘焙进行了精简。

338844394098d26f4feb9fd2dfb9ab0a.png

目前 Sphere Light 烘焙出的效果较弱,我们通过脚本,把整体的亮度和范围都提高了80%。

67ea831325bb4fa274a8019f96c1387e.png

材质 Tiling

使用大量材质 Tiling,把零散的砖块合并成一个面片,并在材质中设置 Tilling,减少加载时间(前文提到过,这里没有使用 offset)。

85b45ad3f6894b117e2577b5b86ca066.png

b37cda1f998f38f4c6121cdb6bce6bb7.png

材质 Instancing

大量相同的物件使用同一个预制体,同一个 Mesh,做 instancing 合批。

20bc7e232d218bb03173c9a912dae826.png

5ce86fea0d6cd9bf2cc8bd54c5982371.png

场景特效

使用 UV 动画+帧动画增加场景细节,优化动线。部分材质使用了 Emissive Map 的 UV 动画+细节贴图的叠加。

7cdd630f9bd64fb0e1e1b671ff2c9277.png

819728b39d407fd3bc8c79a95d69faa1.png

0231a5d74d9f462e2d0172dbf503d8f1.png

遮挡剔除

为了保证视野完整,增加了摄像机的遮挡剔除,使用射线检测或者碰撞体的 Trigger 检测,检测到固定范围内的碰撞体,通过设置 setInstancedAttribute 改变材质透明度,保证不会打断合批。

386b1869db80db63fc84a5ee8820dbe2.png

bd851484b6f8c596e9f72d497ff0b726.png

c9f14f17e223a063205188399c00a0ee.png

碰撞优化

只有复杂的物件使用了 Mesh Collider,其他物件都是用1-2个 Box Collider 或者 Cylinder Collider 节点,减少刚体运算量。比如斜坡可以使用 Box 改变欧拉角度,几个地毯可以使用一个 Box Collider 做碰撞合并等。

e60dda6b3768f446a2053481923cd202.png

场景加载

场景粗略地分成了碰撞层、地表层、物件层和细节层,按照这个顺序去做分帧加载,减少加载与实例化时候的卡顿。除了碰撞层外,每个层级有自己的 Json 配置文件,预制体根据配置生成层级。

20b5c93b0fcd3420174d81ea7cc28da0.png

9bde2526254b4b10766495d46a95fe9a.png

性能优化

机型检测

可以从引擎的 piplelineSceneData 中获取 GPU 型号,通过 GPU 型号和开源的 BenchMark 信息做对比,获取手机档次。

bc0db367eee77db514e138c8c3b5a455.png

d533f0f3a7a69dcd30a83d921d999568.png

a64d751ed0225d971d4cc6c403343a8b.png

如果没有获取到 GPU 型号,或者查询到改 GPU 的配置,可以通过手机的分辨率做备选方案,获取手机的机型配置。

骨骼优化

模型做了骨骼优化,删减了手指和脚趾,这部分会占接近50%的骨骼数量,增加体积的同时,也会增加性能开销。

8b425390f41fa468356d7edda0f40e57.png

2a3e95ae17f65d32ac3d8b5434cd92c7.png

状态同步

状态同步框架使用了 TSRPC 进行了状态同步和房间匹配,通过使用 tween 对人物的位置和四元素做插值处理。

4d6ebab35257c32a870a01544c4928cd.png

插件配合

2b9f39abf480d09f11558e053b4079e9.png

Akeytsu,一款动画制作软件,目前可以免费下载社区或者教育版。支持一键射出多余骨骼和空骨骼节点,并一键蒙皮多个手指,方便做骨骼删减和进行 Mixamo 的动作绑定。

地址:https://www.nukeygara.com/

4b27f8773fd3320b39e65f9502522e76.gif

664bb76b39e8056e0dde43ac76bbbc4e.gif

3D 动态骨骼插件,开箱即用,可以很方便快速地绑定动态骨骼,并可以实现动态骨骼碰撞。

地址:https://store.cocos.com/app/detail/3782

ceeaf375ae48e7f62e211e9d10892696.png

KylinsPostEffects,麒麟子写的一套不依赖 prefab、不污染场景节点树、简单调用几个参数就能使用的后期效果解决方案。支持多种后效,配置简单。

地址:https://store.cocos.com/app/detail/3333

49b234346dee3eb20fb537b17e80293e.png

BenchMark,支持高中低手机性能检测与手机性能适配,可以为高中低档机型提供兼顾质量与流畅的运行方案。

地址:https://store.cocos.com/app/detail/3662

3778019ab930a8ef72de9e17e62625fb.png

b167f26116833f076c61c3207590a51c.png

相机截图,支持 3D/2D 或混合截图,操作简单。

地址:https://store.cocos.com/app/detail/3812

4b3be11ae35cce62f5ccbaacf2e313bb.png

TSRPC,一个专为 TypeScript 设计的开源 RPC 框架,功能和使用可以点击查看文章《多人实时对战如何实现神同步?》《如何实现十万人在线的房间和匹配系统》。

地址:https://store.cocos.com/app/detail/3766

deeefd458c67dc824be270deaab45d91.gif

e543d7076bb659d61f65d9b3b7525d72.gif

Cinestation,一个可视化智能相机系统。方便简单,支持虚拟相机和相机运镜。

地址:https://store.cocos.com/app/detail/3422


本次分享就到这里,有对品牌元宇宙合作、游戏化营销感兴趣的小伙伴,欢迎联系我们!

往期精彩

e9c24bde0d1856842199568ea6fb19bc.png

a6c93820b46fdfeb8d4ba5990c16dfe5.png

5e11bc07513979d3abbe25b57fc68b2b.png

ad194f03c96960deb235d243cd180319.gif

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐