王者荣耀和同步策略

王者荣耀和同步策略

  • 参数

    • GC Alloc:每帧 1k左右,最好控制在200b
    • unity版本:4.6
    • 服务器同步帧频:15fps
    • buffer缓存:0
    • 不支持代码热更
  • 状态同步和帧同步:

    • 状态同步游戏: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 自带工具分析: InstrumentsgAllocationsFrame 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(新版本编辑器中已有此功能)
    • overheadaccounted :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等
  • 多线程的管理模块年底将开放接口,方便游戏逻辑统一调度。

你可能感兴趣的:(网络游戏服务器开发)