粒子特效美术标准

粒子特效美术标准

1)粒子特效美术标准
2)RenderTexture内存大小
3)Batches和SnapdragonProfiler抓出来的DrawCall差距比较大
4)VideoPlayer在移动设备上的卡顿问题
5)特效在切换成iOS工程后丢失部分相关关联


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

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


Particle System

Q:非重度RPG游戏,粒子特效有没有一些标准?类似最大粒子数不超过多少。一个技能的特效,一般给美术设定的规范是多少?就是这些最大粒子数,粒子系统使用数量,最大DrawCall、Overdraw、三角形等数据。

我们以前没设置规范,这几天写了个工具跑了下,发现有些特效最大粒子能达到400多个。现在就是想让美术改一波,但是不知道定个什么值好。

A1:400个不管怎么看都是太多了。之前的项目最多的特效有5~60个粒子发射器,已经属于做法不对导致发射器过多的状态。
感谢deviljz@UWA问答社区提供了回答

A2:影响粒子系统性能的很大部分可能就是DrawCall,如果处理的好,400个也无可厚非,但是粒子系统Update的开销和粒子数量的大小也还是有一定关系的。个人觉得测试数据是最好的说明,在不影响视觉效果或者只是略微减弱的情况下,减少粒子数量是不错的选择,既提升了FPS,又减少了内存。
感谢李星@UWA问答社区提供了回答

A3:很早以前对粒子数量、DrawCall、FPS有较严格的要求。标准是,大概一个技能特效的粒子数不超过50,DrawCall不超过10,手机上按时间释放多次给一个参考FPS。不过很难严格统一到每一个效果上。后来增加了Overdraw的检查,对特效来说,对性能影响最大的还是看Overdraw的情况,有时候一两个面积超大的粒子几乎占满了整个屏幕,这种情况下应该尽量避免无效的半透明区域和减少粒子出现时间。如果粒子大小非常小,数量的限制就能放宽一点了。

有条件,建议跑出一份数据,然后修改各个标准Top排名在前的特效。
感谢文雅@UWA问答社区提供了回答

A4:粒子特效的问题主要还是需要从CPU和GPU两方面入手。

在CPU方面,其粒子数的数量相较于粒子系统数量的影响可以说是非常小,正常情况下,需要关注的函数是PartilcleSystem.Update和PartilcleSystem.ScheduleGeometryJobs,对此,我们在GOT Online报告中都有将其作为重点参数指出,如下图所示。

在中低端设备上,我们建议Active粒子系统的数量<50,一般来说,也确实用不到,或者用到的地方很少,而对于高端设备上,则直接查看上述两个函数的CPU走势即可,如果过高,则case by case地进行排查分析就好。

在GPU方面,如文雅所说,Overdraw是粒子系统最大的杀手,技能特效的Overdraw还好,因为大部分是瞬发的,UI、场景中持续的粒子特效Overdraw如果处理不好,那么很可能比技能特效所带来的GPU压力还要大。此处不能单从数量上来判断,其覆盖面积一样是需要考虑的,所以我们在线上测评报告中是以平均填充倍数来进行分析的,一般整体大于>3(如果没有Unity自带天空盒,可以是4)或者单帧>5,都需要引起大家重视,如下图《极无双-Overdraw分析》例子中的效果,计算页面的粒子系统层数较高,且覆盖范围较大,导致当前帧的平均填充倍数达到12x之高,这对于那一时段的GPU压力是较为巨大的。


对于每个粒子系统的最大粒子数,你可以将其设置为10、20、60设置更多,但这里需要说明的是,最终对于GPU的压力还是需要以真机测试为准,因为有可能单帧中某个粒子特效叠加在一起,导致层数很多,但其本身覆盖的面积很小,如下图所示,粒子特效叠层为90,但整体填充率仅为2,这个对于GPU压力来说也没啥问题。所以,可以对于粒子特效进行静态分析,但最终还是要以真机运行时为主要判断依据。


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


RenderTexture

Q:RenderTexture内存大小在华为荣耀9/红米Note2手机上用UWA GOT测试游戏Android包,发现有一个1920 * 1080的RT格式ARGB32没有开启抗锯齿,内存占用15.8MB。

查看代码中创建RT的代码:

_targetRT = RenderTexture.GetTemporary(width, height, 24);

以我的理解内存大小应该是1920 * 1080 * (4 + 3) / 1024 / 1024 = 13.84 MB;

实际测试下来是 1920 * 1080 * (4 + 4) / 1024 / 1024 = 15.82 MB。

所以DepthBuffer为24的时候,为什么每个像素内存占用32个字节?

A:Depth Buffer bits (0, 16 or 24). Note that only 24 bit depth has stencil buffer. 24位模式下,还有8位的Stencil Buffer。

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


DrawCall

Q:请问Unity的stats窗口上显示的Batches和SnapdragonProfiler抓出来的DrawCall差距比较大是因为什么?

A:这个Batches的数量其实并不代表DrawCall的数量,它和Render面板Total Batches的数量才是匹配的。你如果要看DrawCall的数量,那么可以查看Render面板上面的DrawCall统计,这个统计应该和你SnapdragonProfiler抓出来的差不多。然后再贴一下Rendering面板上几个参数代表啥意思,仅供参考。这是我本机PC的截图。

Render界面各个参数说明:
SetPass Calls:Shader状态切换次数。
Draw Calls:绘制调用次数。
Tatal Batches:总合批的数量=由静态合批+动态合批+实例合批;这个数一定是比Draw Calls的数量小,小得越多说明合并的物体越多。
动态合批:Batched Draw Calls:表示合批过的Mesh数,比如上面显示的60个Mesh合批。
动态合批:Batches:表示合批的次数,上面截图数据说明60个Mesh通过47次合批才完成。其实如果情况好的时候可能几次合批就能够合并掉60个Mesh,可惜可能是很多属性不符合动态合并要求。

静态合批和实例化与上面动态合批的解释相同。

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


Video

Q:项目使用VideoPlayer播放WebM视频。在Editor和大部分手机上没有问题,但是在部分机型(比如魅蓝E2)上播放一顿一顿的。

基本可以排除视频大小和码率的问题(VP8、720P、帧率30、码率8000多K、长度6秒、大小6MB)。

真机Profile看(不开GPU的Profiler),发现播放的时候CPU呈锯齿状,波峰时候Gfx.waitforPresent很高。推测是卡在了GPU渲染上。

但是如果Profile的时候,查看GPU的Profiler,播放就不卡了。CPU很平稳,GPU上出现了锯齿。

Profiler里面的红色锯齿是Other项:

问题1:开启了GPU Profiler竟然能影响真机的流水线,请问具体的原理是什么。

问题2:没有开垂直同步,播放代码是官方的先Prepare再Play,没有额外操作。使用的模式是渲染到RT上。想问这种情况下,如何能做到“开启GPU Profiler”之后的效果?

A:搜了一些信息,不知道题主有没有尝试过。
比如:http://gad.qq.com/question/detail/228511

说可能跟锁帧有关,设置Application.targetFrameRate = -1,播放之后设置回来,按理说不太应该,但代价很小可以试试,另外也说了EaseMV等其它的视频播放插件,不知道效果如何。

另外看到一个相关的issue:https://issuetracker.unity3d.com/issues/android-videoplayer-stuttering-and-dropping-frames

“Issue cause: Multithreaded Rendering, with Multithreaded Rendering disabled video plays smoothly.”

所以也可以尝试开关多线程渲染,不过这个貌似没办法运行时更改。可以使用“Unity VideoPlayer Stutter”关键词进行搜索。

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


Editor

Q:特效在PC工程和Android工程表现正常,但是转换成iOS工程以后,会出现丢失相关关联引用的问题,如材质球、Mesh、贴图等。

备注:本次升级过Unity版本(2017.4.27_f1)

A1:找到具体某个丢资源的地方,看看GUID和应该引用的资源的GUID是否一样。如果不一样,再对比安卓工程下的这个文件看看。
感谢deviljz@UWA问答社区提供了回答

A2:不确定升级之前版本是什么。
我们在4.3.6升级到5.6.5,及5.6.5升级至2017.4的时候都出现过这个问题。
前者只需要将Cache Server清空重新导入资源即可。后者需要转换相关系统才行,使用脚本遍历所有预设查找GUID变化。

感谢洋葱小同学@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5d2ef1bdfbb5b1259d93e649

封面图来源:GPU Particles Unity
用于Unity的GPU粒子系统。


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

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