MMORPG手游合理的性能参数

MMORPG手游合理的性能参数

1)MMORPG手游合理的性能参数
​2)使用ScriptableBuildPipeline打包的疑问
3)如何获取到Animation修改材质球颜色后的颜色值
4)嵌套预设AssetBundle打包的疑问
5)LWRP渲染下,Profiler中函数开销高


这是第219篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)

Performance

Q:想请教一下大家,一款MMORPG游戏上线时的性能参数是如何制定的?有没有可参考的性能参数可以指导一下?

A1:制定指标要根据多方维度来综合考虑,包括产品定位、团队水平、成本预算和时间预算等等,很难一概而论,以下是我们针对新项目立项要指定美术指标时一贯的做法,可以参考:

  1. 拿对标美术表现的竞品来看他们各项性能指标如何,用RenderDoc或者NSight能够得到比较准确的数据,也可以抽出他们资源来做下一步操作。
  2. 制作效果Demo,尝试技术上还原竞品的效果,这时尽量做到表现上和性能上都能还原。
  3. 有了效果Demo后,基本指标已经有了,不过还是得自己团队从美术到技术再到策划完整地把流程跑通,而且可能还要对表现的要求进行提高以提升产品竞争力,这时候尽可能根据上线时间推断合适的目标机型,稍微超前地指定渲染能力指标。

感谢邓永健@UWA问答社区提供了回答

A2:可以参考UWA的蓝皮书《Unity手游性能蓝皮书》

感谢jessica@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f48979c9424416784ef1ff1


Build

Q:我使用ScriptableBuildPipeline打包AssetBundle比原始Build Pipeline慢,有人使用ScriptableBuildPipeline打包获得更快的打包速度了吗?想弄清楚是我自己某些做法不对,还是本身ScriptableBuildPipeline就是打包更慢。

经过测试得到以下数据:
全量打包 增量打包(资源无变化)
原生 560s 7s
SBP 610s 480s

A:测试的数据(AssetBundle的数量大概在3200个左右, 统计耗时:ms)


所以个人觉得SBP + CacheServer, 能够在一定程度上提升打包速度。

感谢杨宇杰@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f35f08f9424416784ef1c2b


Rendering

Q:如果用Animation动态更新_Color后,材质球上的_Color颜色获取不到,GetColor获取到的颜色始终是Animation运行前的颜色,求教怎么获取动画更新后材质球的颜色?

复现步骤:
1. 新建材质球A,随便使用Shader带Color属性的,(我这里使用Shader: Legacy Shaders/Diffuse),_Color默认白色;
2. 新建物体Cube,将材质球A拖到Cube上;
3. 创建Animation,修改Cube上A的_Color颜色,给蓝色或者非白色;
4. 创建一个脚本在Update中打印_Color的颜色(mat.GetColor("_Color"));
5. 运行后颜色值使用时初始值白色,不是动画Animation修改后的颜色。

A1:实测使用MaterialPropertyBlock是可以获取到的。代码如下:

    void Start()
    {
        render = GetComponent<MeshRenderer>();

        mpb = new MaterialPropertyBlock();        
    }

    void Update()
    {
        render.GetPropertyBlock(mpb);
        Color color= mpb.GetColor("_Color"); ;
        Debug.Log(color);
    }

感谢Xuan@UWA问答社区提供了回答

A2:最后发现是美术在Animation里把_Color指定一个固定值,没有勾选刷新,所以一直不对。

感谢题主王@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f5a31429424416784ef21d3


AssetBundle

Q:嵌套预设AssetBundle打包存在两份资源冗余,目前解决方法有预设b的材质球和Mesh单独打成AssetBundle,但是这样会导致AssetBundle打得太散。求问有什么解决方法?

目前解决方法如下:
1. 空工程,预设b带了贴图tex_b和tex_c.使用嵌套预设把b嵌套在预设a里面(Unity版本2018.4.24)。
2. 预设a和b都单独打成AssetBundle。
3. 打包AssetBundle后,使用AssetStudio后查看预设a的AssetBundle,包含了预设b的贴图和Mesh。

A:设计使然:在运行时不存在预制体的概念。预制体在构建过程中是被 “烘焙”好的,因此每个预制体(无论嵌套与否)都是完整且彼此独立的。

https://issuetracker.unity3d.com/issues/nestedprefabs-when-building-assetbundles-with-nested-prefab-assets-are-duplicated-in-parent-prefab-assetbundle

可以将子预制体依赖的资源显式地与子预制体打包在一起(如果能区分出哪个是子预制体)。

感谢Welkin_Totoro@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f56f1db9424416784ef2184


Rendering

Q:升级工程到了Unity 2019.3,并且使用LWRP轻量渲染管线,PostLateUpdate.FinishFrameRendering的耗时高达54ms。真机Profiler如下图:

A:出现了著名的API Gfx.WaitForPresent,说明你们是GPU Bound。同时,可以看到DoRenderLoop 22ms,确实GPU比较重度,CPU这边丢Command Buffer都丢了22ms。

所以,建议优化GPU,大概率用了不少后效?用了重度Shader?绘制了不少东西?可以让渲染负责人看看。

感谢王烁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5f56fca19424416784ef218a

封面图来源于网络


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:793972859(原群已满员)