王者荣耀和同步策略
-
参数
- GC Alloc:每帧
1k
左右,最好控制在200b
- unity版本:
4.6
- 服务器同步帧频:
15fps
- buffer缓存:
0
- 不支持代码热更
- GC Alloc:每帧
-
状态同步和帧同步:
- 状态同步游戏:dota2,LoL, Fps游戏
- 帧同步游戏:dota,王者荣耀, 星际争霸
- 无帧同步buffer机制。buffer大小直接影响延迟和卡顿。
- tcp换成udp(分发顺序,丢包。
一次发送两帧频的数据
)重联不上的设备回到tcp
。 - 卡顿处理:逻辑和显示分离,
客户端动态插值
。 - 去浮点数(cpu架构导致计算结果不同),分子和分母表示。
- 相同的逻辑和输入,服务器只广播玩家输入。
- 随机数,相同的随机种子(无法用unity自带,不能受帧频影响)。
- 同步帧频,逻辑帧频(稳定)。
- 变量初始化(不同平台初始化值可能不同)。
- 本地数据,子弹飞行轨迹等处理一致。
- 技能判定等,客户端自己计算,服务器验证。对于延迟等情况,服务器也会采样其它客户端上传的数据去验证。
- 遍历排序:
dictionary->sortedDictionary
(raycast 返回结果等)、table(pairs->ipairs)
-
外挂
- 属性hash值校验
- 参考多个客户端仲裁
- 关键数据加密(透视挂)
GPU Instancing 2.0
使用一个drawcall绘制多个Geometry,相关介绍看一下 GPU Instancing
-
2.0将解决问题(预计今年年底):
- shader编译速度很慢(上百倍的慢,跟数组长度有关)
- 添加多个instancing属性时,需要考虑constant buff的大小
- maxcount:大小固定,很难做到性能最优化
- penGL的maxcount 只有其他平台的1/4
- instancing 不支持全局光照
- cpu 端支持多线程
-
BatchRenderAsset(说是有牛逼人来搞,但是时间没定)
- 用于大规模instancing渲染:森林,草地等取代地形的制备系统。
- 最小化renderloop开销
- 支持culling、LOD、streaming等
-
Animation Instancing
- 支持骨骼动画
- T-pose下的顶点数据,骨骼索引和权重
- 骨骼动画数据、世界矩阵、动画索引
- AnimationTexture (开发中)
- 优点:避免骨骼动画的计算开销、在gpu计算蒙皮、降低gpu和cpu的数据传输
- 缺点:不支持
ik
等,精确性
不高(由四元数转为矩阵,顶点信息都是插值计算的。通过增加关键帧来解决)。
调试工具
- 图形bug调试:shader渲染时间,overdraw,drawcall,渲染管线各阶段。
FrameDebugger
unity内嵌RednerDoc
vsGraphic
Analyzer
盛大分享
- 控制带动画物体的顶点
- 控制角色骨骼
- 特效分节点关闭(基础效果+锦上添花效果),特效上挂脚本,动态适配。
- 非主要角色不需要每帧更新(
2帧更新一次
) - Unity默认的ETC编码器,效果比较差,有源码的话,替换一下(ETC2应该没问题)。
- 避免alphaTest
- 削减PS指令数,部分计算转移到VS
- 注意不透明物体的渲染顺序
- 主动隐藏不在镜头内的动画对象
- 渲染管线
- 移动平台不建议延迟渲染(70%的设备能跑)
- 如果要用,手机限制分辨率在
720p
,vr限制在1080p
- 为低配机器单独写一条前向渲染管线
- 尝试使用
Behavior Tree
实现复杂怪物AI系统(服务器?) - VR的经验:
- 避免屏幕固定UI
- 引导ui不消失
- vr手臂大多数处理方案,使用手套来表现人物的手
- 真实打击反馈 使用Ragdoll系统,很难调整好物理和动作的表现,最后使用
多角度、多幅度的预设动作
,结合动作碰撞检测
实现。 - 移动:不同玩家眩晕感受差异大。pc稳定在
90fps
,移动60fps
。动作尽量慢点。避免全屏都在移动,远景相对静止。 - 移动vr性能指标: 100k面、drawcall 100、简单shader、避免复杂后处理、避免实时阴影。
祖龙分享
- 2D场景+3D角色,
两个相机
分别渲染。 - 2D转3D坐标缩放系数:经验值
1/72
- 美术规范:
- 主角面数
3500-4000
- 骨骼
40
3
个material(头、身体、 武器)- 贴图
256*256
- 主角面数
- GUI: 部分界面真彩色、使用UIPanel合并DrawCall
- 贴图:使用QualitySettings.masterTextureLimit降低精度。
- 特效
- 分类做总量控制
- 组件做LOD,实时更改LOD级别
- 网络消息流:AOI根据玩家密度调整。
缓存服务器消息
,逐步执行,缓解客户端压力(主要是为了让玩家第一时间看到场景,Loading
的时候)。 - 区分高中低设备的方法:
读取显卡型号
,根据显存来判定。(主要是国内很多手机cpu很好但是显卡很差,例如vivo)
vulkan
- 新的图形api,主要是android平台,占有率90%以上。
- 相对opengl性能提高20%以上,特别是手机发热降低主频的问题有很好的改善。
- unity使用vulkan文档 ArmGuideForUnity
优化与分析
- 程序载入流程
- Loading codes: ios 64位限制60M,32位限制60m,两者都有限制80M(可以用bitcode分离)。
- Running the unity engine
- Prebuild the assets: 预置的shader,resource文件下的所有文件,建立结构树,还有内存问题,尽量减少resource下的资源。
- Loading the first scene: 第一帧结束后才开始渲染,所以不要在第一个脚本的awake和start添加太多的逻辑。
- AssetBundle
- TypeTree 可以去掉,如果保证升级大版本的时候重新打资源。
- 最好把所有shader放到一个bundle中,然后统一warm。
- DynamicBatch是否需要。
- 避免空函数调用
sealed class
- NetWork 开销,直接影响电池和发热:
2k/s
很高、4k/s
非常高 - xcoede 自带工具分析:
Instrumentsg
、Allocations
和Frame Debugger
- 静态脚本分析工具
- Unity Engine Analyzer
- 一组Roslyn分析器,查找c#代码中的常见问题。
- Visual Studio 和 Command Line
- 可生成HTML报告
- Analyzer
- 可定制Analyzer
可编程渲染管线
- c++ core 和 开放的c# Api
- Common Buffer的扩展
- 自定义渲染管线,可以绕过一些不必要的过程
- 估计得明年能上吧
ugui优化
- ReBatch(canvase)
- 任何网格发生变化的时候
- 网格排序: 深度和覆盖关系
- 从上往下batch
- 多线程处理
-
ReBuild(graphics)
- Layout: 位置、大小发生变化;优先计算靠近root节点;根据层级深度排序。
- Graphic: 重建mesh、material变化
- PerformUpdate: CanvasUpdateRegistry<-WillRenderCanvases(Dirty Layout, Clipping components)
-
Profiler
- Canvas.BuildBatch : 计算batch
- Canvas.SendWillRenderCanvases: C#调用消耗;dirty UI component; LayoutRebuilder; Graphic.Rebuild(字体outline和shadow)
-
Canvas
- 避免中间层
- 动静分离
SubCanvas
的应用:如果动态变化的元素很多,就继续细分canvas。重建不跨越cavans
。- RayCast Target:尽量避免,如果要开层级越浅越好。复杂控件尽量在根节点开启。
overridesorting
会打断射线,可以降低层级遍历成本。 - 隐藏ui的时候可以考虑disable
canvas component
,这样可以避免整体active的rebuild等。
-
字体
- 避免字体打断批处理
- 动态字体和字体集: 避免字体集满了导致重建的情况(使用当前font图集大小,并且只包含有效text的自形,如果不能装下扩张较小分辨率。此图集只增加不减小。)
RequestCharatersInTexture
备用字体,但是再重建的时候,备用过的将无效。- keep all fonts listed in Font Names:所以要对字体库进行裁剪,去掉不必要的字体。
- best fit and performance: 自适应到最大的整数字体大小;会导致字形重复;
-
其它
- Assign Event Camera:每个canvas指定一个camera,否则会遍历所有camera。
RectMask2D
提高ScrollView性能,没有显示的组件不被绘制。SetPass
/DrawCall数量
eagleEye
- unity的web自助分析工具,未来上线。
- 目前sdk下载,嵌入的形式
- 依托profiler,每个tag的详细说明
- 个性化数据分析
GapID
android
AssetBundle Graph & AssetBundle Browser
- AssetBundle Graph打包图形化,可以清晰看到所有资源的走向,可以保存和载入几套打包方案。
- AssetBundle Browser查看assetbundle的内容。
- 个人测试这个玩意暂时不适合资源复杂的项目,造成严重的编辑器卡顿。
- 源码
NavMesh
- 运行时创建与更新
navmeshbuild
- 多实例对象,同时使用多个navmesh
- 可控制生命周期
常见问题总结
-
声音相关
- 格式:
ios mp3;android vorbis
- 单声道
- 采样率
20k-40k
- 预加载音效
CompressInMemory
- 格式:
-
WarmupAllShaders
防止第一次使用shader卡顿 -
弃用
onGui
-
resource
的资源加载方式,弃用 -
profiler
- 数据的保存和加载
Profiler.AddFramesFromFile
(新版本编辑器中已有此功能) overhead
和accounted
:deep profiler的时候较多,一般是统计是unity统计不到的开销,包括profiler自身的开销。Objects
为所有继承自object的unity对象的内存。OnTransfromChanged
ui复杂度相关,ui层级。str.memorycpy
结构体复制(变量较少的结构体)导致的。putGeometryJob
粒子系统或者飘带系统
- 数据的保存和加载
-
更新节奏
- 每周补丁,每月小版本。版本号例如 5.6.0p1, 5.6.0p2, 5.6.0p3, 5.6.0p4, 5.6.1f1
- 每四个补丁增加一个小版本号,所以小版本号并没有太大的修改,主要是改bug。
c# job system
- unity的多线程部分:粒子、布料、skinmesh等
- 多线程的管理模块年底将开放接口,方便游戏逻辑统一调度。