浅谈PBR在手游开发中的适用性

浅谈PBR在手游开发中的适用性

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

UWA 问答社区:answer.uwa4d.com
UWA QQ群:465082844(仅限技术交流)


渲染

Q1:我们是MMO游戏,现在想给主角(包括其它玩家)使用PBR材质(Untiy自带的Standard),其它角色和场景不使用。不知这种情况下性能是否能抗住,同时我也想了解下目前手游中对于PBR材质的使用情况。

UWA:目前手游中使用PBR材质的项目明显增多,特别是MMO、RPG等项目中,主要的角色、NPC和大Boss等都开始往PBR方面走了。

如果PBR仅是在以上情况下使用时,Unity引擎自带的PBR是没有太大性能问题的,因为一般角色占据的屏幕面积都会比较小,而过剧情时,虽然屏幕面积占据较大,但时间一般都很短,所以给总体性能造成的压力不大。

但是UWA暂时还不建议大家在地形等常常在屏幕中占据较大面积区域的物体上使用PBR(尤其是中低端设备),因为它确实会造成较高的GPU压力,我们在UWA Day 2018上也对此进行了定量分析(类似下图),这点需要研发团队在使用时注意。但是,一切应该以自身项目测试为主,具体查看项目在自己设定的低配机器上到底性能如何。
请输入图片描述
最后,在使用Standard Shader时,除了关注性能外,还要关注下它对于内存的影响,可以参考这篇文章:【求知探新】Unity中ShaderLab内存优化

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5ae2f40132493548fbd32bbc


渲染

Q2:UWA DAY 2018大会中说有25种造成DrawCall增长的原因,我想知道是哪25种呢?

导致批处理失败的原因如下:
1、Additional Vertex Streams — 对象使用MeshRenderer.additionalVertexStreams设定了额外的顶点信息流。

2、Deferred Objects on Different Lighting Layers — 该物件位于另一不同的光照层中。

3、Deferred Objects Split by Shadow Distance — 两个物体中有一个在阴影距离范围内而另一个不是。

4、Different Combined Meshes — 该对象属于另一个已合并的静态网格。

5、Different Custom Properties — 该对象设定了不同的MaterialProperyBlock。

6、Different Lights — 该物件受不同的前向光照(Forward Light)影响。

7、Different Materials — 该对象使用不同的材质。

8、Different Reflection Probes — 该对象受不同的反射探头(Reflection Probe)影响。

9、Different Shadow Caster Hash — 该对象使用其他的阴影投射着色器,或是设定了不同的着色器参数/关键词,而这些参数/关键词会影响阴影投射Pass的输出。

10、Different Shadow Receiving Settings — 该对象设定了不同的“Receive Shadows”参数,或是一些对象在阴影距离内,而另一些在距离之外。

11、Different Static Batching Flags — 该对象使用不同的静态批处理设定。

12、Dynamic Batching Disabled to Avoid Z-Fighting — Player Settings中关闭了动态批处理,或在当前环境中为避免深度冲突而被临时关闭。

13、Instancing Different Geometries — 使用GPU Instancing渲染不同的网格或子网格。

14、Lightmapped Objects — 对象使用了不同的光照贴图,或在相同的光照贴图中有不同的光照贴图UV转换关系。

15、Lightprobe Affected Objects — 对象受其他光照探头(Light Probe)影响。

16、Mixed Sided Mode Shadow Casters — 对象的“Cast Shadows”设定不同。

17、Multipass — 对象使用了带多个Pass的着色器。

18、Multiple Forward Lights — 该物件受多个前向光渲染影响。

19、Non-instanceable Property Set — 为instanced着色器设定来non-instanced属性。

20、Odd Negative Scaling — 该对象的缩放为很奇怪的负值,例如(1,-1,1)。

21、Shader Disables Batching — 着色器使用“DisableBatching”标签显式关闭了批处理。

22、Too Many Indices in Dynamic Batch — 动态批处理索引过多(超过32k)。

23、Too Many Indices in Static Batch — 静态批处理中的组合网格索引过多。对于OpenGL ES来说是48k,OSX是32k,其他平台是64k。

24、Too Many Vertex Attributes for Dynamic Batching — 欲进行动态批处理的子网格拥有超过900个顶点属性。

25、Too Many Vertices for Dynamic Batching — 欲进行动态批处理的子网格顶点数量超过300个。

感谢果果爸@UWA问答社区提供了回答,欢迎大家转至社区进行进一步交流:

https://answer.uwa4d.com/question/5ae1eef932493548fbd32ba1


GPU

Q3:我在国产安卓机上发现不少据说支持ES 3.0、但是实际上却不支持GPU Instancing功能的情况。那么现在大家都是如何判断硬件支持GPU Instancing的?

UWA:建议使用SystemInfo.supportsInstancing,链接:
https://docs.unity3d.com/ScriptReference/SystemInfo-supportsInstancing.html

该回答由UWA提供,欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5ae714b00956834900752685


渲染

Q4:接我们上期的问答《如何设计项目中的渲染等级》推出后,又有两位行业大咖分享了他们的灼见:

王亮:我们的项目还在开发中,也经历了同样的过程,最后也形成了类似的文档。这个过程中我的体会是,虽然感觉最后形成的是一个表,会根据这个表提供机型的预设配置。但是实际上针对自己的项目,高中低主力机型,FPS的目标,渲染效果的要求不同,结果可能会大不一样。

抛砖引玉分享一下我的思路:

1、首先是确定测试用例
我们分别选取主城镇、不同战斗类型的最高面数场景作为场景用例
请输入图片描述
2、角色方面选择不同战斗类型的最高面数角色
请输入图片描述
3、接下来配置测试关卡,编写采样脚本
本次测试数据采用脚本记录帧数功能
测试方法集成到了Cheat上,用于测试指定时间的帧数范围和平均帧数粗略地描述性能
满怪渲染:主角绕着小怪 把测试的所有小怪聚拢 保持同屏全部渲染
满怪释放技能:尽量保证打中尽可能多的小怪 验证粒子压力

4、请测试同学跑测试组合用例,并且采样数据
我选取第2次测试报告作展示如下:
其实中间经过了几次迭代。表格里的最后一列是针对帧数目标,经过反复调整配置形成的数据。
请输入图片描述
请输入图片描述
请输入图片描述
5、最后根据测试数据,调整分级表的配置
最终形成的这次配置如下,红色是本次测试,调整和新增的内容:
请输入图片描述
以及本次测试用发现的问题:
请输入图片描述

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

文雅:正好我也整理过项目的LOD规则,可能不限于题主描述的渲染等级。一套好的LOD系统需要美术在资源上做大量的资源分级工作,需要程序搭建完善的LOD框架和辅助工具,每增加一个功能模块都需要把LOD考虑进来。

一、如何确定项目的LOD分档和性能标准
LOD(Level of Detail),这里的D代表Detail而不是Distance,也就是说,所有游戏画面和游戏功能的细节都可以进行分级,不必受限于距离。

1、如何制定性能标准?
在分级之前,需要确定目标(省电、正常的游戏体验、噱头),我们要在哪一种机型上面运行哪些表现效果和功能,达到怎样的性能目标(帧数FPS、内存占用、Drawcall、同屏三角面数等)。

◆ 经验总结:
1)画质的表现力与性能开销是相互矛盾的
2)需要持续维护,相关功能系统的设计都需要考虑到不同画质
3)极简画质牺牲了可玩性,同时会增加LOD框架的复杂性,使用最简单暴力的方式去处理

◆ 兼容性问题:
1)低配画质需要考虑的适配问题
• 可能不支持Shader定义8张以上的贴图纹理
• 可能不支持ETC2格式的贴图纹理
• 可能不支持OpenGL ES3.0

2)高配画质需要考虑的问题
• 支持PBR、线性空间
• 奇怪的Bugs

3)需要解决各个画质下的兼容性问题,建立黑名单和白名单。

2、如何找出可以进行分级的细节?

◆ 优先找出开销大的点
• 后处理效果Bloom、HDR、ToneMapping、MotionBlur、DOF等
• 实时光照和阴影、水面实时反射
• PBR物理光照
• Ragdoll、DydamicBones等物理系统
• 日夜循环、特效天气系统

◆ 细节模块的LOD功能考虑
• 场景 / 角色 / 特效 / 摄像机相关 / 其他系统模块

二、LOD模块细分

1、场景相关
请输入图片描述
◆ Shader LOD
• shader.globalMaximumLOD来指定不同画质的LOD值
• Shader内部定义多个SubShader,逐个降低计算和纹理采样
使用Shader LOD存在一个问题,在Properties中定义的贴图,在低级别的SubShader中虽然不被采样和计算,但是仍会有内存占用。建议和角色一样,设计LOD框架时考虑两份prefab,支持场景转一份低配场景文件给低配使用。

◆ 制作时合理使用高低模

◆场景物件分级Level_1、Level_2、Level_3
• 含场景特效、场景动画物件等,在不同的级别显示/隐藏
最早期我们采用距离来控制场景特效的显示。

缺点:
1、实时监控距离的开销
2、每个场景需要单独配置合理的距离值
使用层级来控制更为直接,在制作LOD时最优先考虑最简单暴力的方式,这样美术规范也不会太复杂,后期也不需要过多的维护。

◆ 场景光照切换
• Light/Light_High 涉及实时灯光对角色、场景阴影绘制的控制
• 场景光照图切换

◆ 物件的Layer层决定阴影
• 场景文件中配置的Cast Shadows和Receive Shadows设置给烘焙使用,不方便存储下来
• 设计不同的Layer来决定物件是否产生阴影和接受阴影

◆ 角色产生阴影
• 高配时玩家和Npc角色的Layer修改为Shadow,低配时修改为Player/Npc
• 中配时玩家自身和Boss角色的Layer修改为Shadow,其他玩家为Player
• Shadow层绘制实时阴影,Player/Npc会使用圆片来绘制脚底阴影

◆ 角色接收阴影
• 仅在高配画质开启接收阴影

◆ 裁剪距离、雾效距离
• 设计裁剪距离与雾效距离按照百分比减小的算法,防止数值异常

◆ 后期处理效果
• 全局后期处理
通过全局后期处理管理后期的开启、关闭,控制自定义的选项。
• 场景后期处理
场景配置高、低两种后期处理方案,低配时只使用ColorGrading
• UI和剧情动画中的后期处理只在高配时开启
比如:UI中使用的Bloom、剧情中使用的RadialBlur运动模糊等

◆ 单个场景的特效等级
通过配置表定义场景的类型和同屏可显示的特效数量和等级

2、角色相关
请输入图片描述
◆ 角色材质、shader、贴图
• 通过配置表,在不同画质调用不同的prefab
• A.prefab和A_Low.prefab使用A.mat和A_Low.mat
• A_Low.mat使用的Shader降低计算和贴图纹理采样
• A_Low.mat使用的_MainTex替换低精度贴图纹理

◆ LODGroup
• 角色的模型面数标准提升后,制作高模、低模两档,通过LODGroup功能按距离降档

◆ SubShader
• 高配和中配的光照模型切换,PBR切换Blinn-Phong

◆ 角色部件
• 部件在配置表中可配置为空,在低配时可以不显示背部挂件

◆ 角色骨骼Skin Count
• Skin支持的最大骨骼数降级2-Bones 1-Bones
• DynamicBone基于物理系统的动态骨骼效果的开关
• Npc死亡动作基于物理系统的表现的开关

◆ 同屏角色数量
• 不同画质设置不同的同屏显示角色上限
• 无逻辑任务的客户端NPC开关

3、特效相关
请输入图片描述
◆ 天气系统
• 制作不同数量级的粒子系统

◆ 脚步特效
• 开启和关闭脚步特效,可对玩家自身和其他玩家分开控制

◆ 掉落特效
• 复杂特效可以制作简化版本
以上三种特效都可以通过简单的配置表功能完成。

◆ 技能特效
• 通过配置表,在不同画质调用不同的Prefab

◆ 技能特效的标准
• 制作阶段控制特效的性能开销
• 工具辅助生成*_Low.Prefab
• 严格控制*_Low.Prefab的性能开销

4、其他模块
请输入图片描述
◆ 渲染分辨率
• 使用不同的渲染分辨率,且限制最高分辨率为1080p

◆ 开放视角
• 视角上下左右旋转和
• 摄像机最远最近距离

◆ 脚本控制
特殊情况下需要制作可以在四种画质下进行切换的配置,通过脚本控制:
• Prefab切换
• Material切换

5、不适合LOD的系统模块

◆ UI
• UI上的图素和特效不适合做显隐和优化
• UI场景不适合做烘焙和实时光的切换
• UI角色可以根据界面的重要程度选择使用高级或低级
• 管理好加载和卸载后,可以考虑替换高低配UI资源

◆ 剧情

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

欢迎大家转至社区进行进一步交流:
https://answer.uwa4d.com/question/5acc208b425802635474fc7d


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

本文封面图来源:
https://www.artstation.com/artwork/nWlL6