把日志导入Excel进行分析即可。感谢李宗波提供了回答。
精彩回答3:
我们分了两块:1、特效释放对于整体性能的影响部分,这个是针对结论性的统计,在真机上统计释放之后的帧率波动,目前的版本只做了往场景里扔来记录帧率的功能,主要评定特效对于游戏最终的影响;2、特效的Draw Call、面数和Overdraw影响。这块的统计数据的获取我们目前只能在PC上获取,所以有一个工具在单机版本里逐个播放技能特效,统计对于上述三个指标的评价,找出超标的部分每周周会上给出报告列举出来。个人感觉资源的检查一定有工具定期来做,持续监控才是最有效的优化方式。感谢贾伟昊提供了回答。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/5a3b96e934968145049616fe
6、Graphics API的选择
大家现在在工程里还是选择只使用 OpenGL ES 2.0吗?我记得以前大家都是这么做的,现在这个做法过时了吗?iOS 是否该加上 Metal?
精彩回答1:
我们目前都是用的Auto,主要有两个原因:Metal测试下来CPU Overhead会比GLES低很多GLES3能够有tex2Dlod支持 兼容性上来说只有实在老的机器和模拟器会fallback到GLES2,可能效果上会略差一些不过我们测试下来都可以接受。感谢钱康来提供了以上回答
精彩回答2:
我们现在快要上线的项目选的是ES3.0,iOS和Android都是选的这个,iOS选Metal的时候遇到模型显示不正常的问题,但是能力有限加上没时间没定位到原因,就统一成ES3.0了。选ES3.0还有一个原因,就是发现AssetBundle打出来的资源会比选Auto小很多。 还有就是目前我们的游戏偏重度,不指望用老手机的玩家会付费,所以放弃显卡太老的机型了。感谢李先生提供了以上回答
此问答来自于UWA 问答社区:如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/594ddec949dc1fb06ce0685f
7、多维度材质对效率的影响
在目前的Unity版本中,使用多维材质是否会对效率产生影响,用多维材质和把模型分块哪个更好?
制作美术资源时,应该尽量避免使用多维材质。先举例说明多维材质的一个优点是拆分模型做不到的: 一块大石头有石头和草地两个材质,做成一个整体的模型,使用多维材质,作为一个物件进行烘焙,在Lightmap上的UV分布是一个整体,不会出现拆分为两个模型烘焙产生的接缝问题。
除了上面这种情况,其他情况下推荐将模型拆分成多个模型赋予不同的材质。优点是:1、多个模型会作为多个MeshObject参与到裁剪、静态批次等优化中;2、拆分的模型和贴图可以进行材质合并,程序才能进行下一步的优化,如果本身是多维材质,就无法进行合并DrawCall的优化;第一个优点就能带来很大的收益。制作上应该按照一个模型对应一个贴图的做法进行,如果模型是一个整体,比如房子由底座、墙体、屋顶组成,建议将他们多选导出成一个FBX。
另外,不同材质的模型建议做成多个模型,再多选导出成一个FBX,仍然是一个模型对应一个贴图的规范进行制作。
该问题来自UWA问答社区,感谢文雅提供了回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/59e890dbe02a95cc6d0c4987
8、AssetBundle粒度规划
关于AssetBundle(下称“AB”)拆分粒度问题。在我的项目中,我是基于逻辑以及最终的打包大小来分的,比如尽量不让压缩后的AB包超过1MB, 这是UWA之前的推荐,同时也是因为当前版本Android包的SerializedFile占用大小(https://blog.uwa4d.com/archives/TechSharing_56.html)所考虑。经过这样的规划之后,我打包这块的代码基本是写死的, 包括手动把公共包拆成多个(公共包略大,不拆的话压缩后会有6、7MB), 还有每个AB包的内容也是人为拆成多个。 这样虽然最后功能实现了,但个人依旧觉得不够自动化。每次新添加资源的时候, 都得走一遍这种手动流程。也研究了别人写的开源方案(https://github.com/tangzx/ABSystem),全自动分析依赖关系,但问题是最后包打得实在太细了,不太符合科学(但还是推荐大家学习)。所以就想问下各位的公司项目是如何解决这个AB 粒度划分问题的?
精彩回答1:
这是一个相当开放的问题,仁者见仁,智者见智。UWA目前无法总结出一个统一的方式来建议如何进行打包,首先需要说明我们看到的两点情况:1)没有最好的打包方式,只有最适合项目需求的打包方式;2)无论是粗粒度打包还是细粒度打包,现在都有成功的项目在采用,这说明只要符合需求,两种打包方式都是很好的。接下来,我们就粒度问题给出一些我们的看法:1)AB粒度建议不宜过细,特别是一个资源一个AB粒度过细,一方面会导致加载IO次数过多,从而增大了硬件设备耗能和发热的压力;另一方面,在我们测试过的Unity 5.3 ~ 5.5 版本中,Android平台上在不Unload的情况下,每个AB的加载,其每个文件的SerializedFile内存占用均为512KB(远高于其他平台),所以当内存中贮存了大量AB时,其SerializedFile的内存占用将会非常巨大。同时,需要进一步说明的是,该问题已在Unity5.6中进行完善。2) 在Unity 5.3版本之后,对于AB文件的文件大小其实不必再限定于1MB之内之前UWA有这一限定是出于两方面的考虑:一是New WWW在Unity 5.3之前是使用最为频繁的AB加载方式(虽然现在也是),在5.3版本之前,New WWW加载会形成一个比较大的WebStream,一般来说是压缩AB的4~5倍,会占用比较高的内存;另一方面,当AB较大(比如大于5MB)时,其加载开销会很大,由于是子线程中运行,所以真正反映到Profiler中时,大家会看到的一个“诡异”的CPU高开销——Graphics.PresentAndSync,具体原因可以看这里( 扒一扒Profiler中这几个“占坑鬼” )。所以,我们对此做了一些实验,发现将AB压在1MB以下是一个加载比较可以接受的情况。以上是我们之前为什么会提出1MB的主要原因。但Unity5.3之后,随着LZ4的引入,很多情况已经变化了,基于其Chunk的加载特点,AB加载很快,且内存占用要比之前小很多。所以LZ4的AB其实可以考虑更加粗粒度一些。但是,这里仍然有以下三点注意:1)对于需要热更新的AB,也如问答中其他朋友的所言,要考虑实际情况控制AB的大小;2)即便是LZ4的AB,其加载方式不同,加载效率也可能完全不一致。以下是我们在UWA DAY 2017的分享,我们在两个不同的AB(LZ4格式)中都加载同一个资源,唯一不同的是一个AB包含10个Asset,而另一个AB包含30个资源,以下是三种不同方式从加载AB到AB.Load的耗时对比。可以看出,New WWW加载出现了明显的时间差异。因此,在Unity5.3之后,尽可能建议通过LoadFromFile(Async)来对AB进行加载。
3)对于AB的打包,尽可能把逻辑上同时出现(一个Prefab中非Share的Asset)、小而细碎的资源(Shader、Material、粒子系统等)尽可能打包在一起,并通过LoadAll来进行加载,因为这样会带来更好的加载效率。下图为LoadAll和Load One By One的性能对比。在我们做过的实验中,LoadAll确实会带来更好的性能开销。
上述是我们建议研发团队在AB打包时的一些注意点,希望对大家的项目优化有所帮助。
此问答来自于UWA 问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/58e5bd96e042a5c92c3484ec
9、优化数据表的加载
安卓客户端存在大量的模板数据需要配置,其中一些模板表甚至可能达到万级的数据条目,那么怎么对这些数据模板表进行打包和加载,可以兼顾加载速度和热更新表结构?目前的方案是采用Protobuf代替ScriptableObject进行序列化,可以实现热更新模板表结构,但是加载速度相对ScriptableObject有较大的差距,目前数据模板加载较慢便导致了玩家进入世界的时间比较久。因此想了解大家有什么好的建议呢?
精彩回答1:
本地读取数据表是个老话题了。我不能完全解答这个问题,只能提供一下我过去项目的浅显的经验。用ScriptableObject或者BinaryFormatter二进制存储然后反序列化成保存数据结构的对象,这两种方法应该是加载速度最快的。我们实际没有采取这个方案,也使用的是Protobuf,是出于以下考虑:一份二进制数据,客户端和服务器可以通用。从服务器推数据很方便;策划习惯使用Excel编辑,有脚本可以把表格内容导出成Protobuf的二进制数据,另外,还有.cs/.go表结构描述文件需要重点考虑。也就是说,策划修改表结构、增减表,服务器和客户端的结构描述文件可以自动生成好;实际用下来,确实会有一些差距。如何选择还是要看表格的体量了。感谢WangLiang 提供了以上回答。
精彩回答2:
我先把问题拆分一下,题主遇到的问题如下:第一个问题:配置表存储格式现在主流的数据存储基本分为三大类,各有优劣,需要根据实际情况选择:1、ProtoBuf或类似序列化库,这种方式兼容性高,但是加载速度一般;2、自己实现二进制数据存储,兼容性差,需要精心设计达到较高的数据表达能力;3、采用Lua热更新方案的游戏,普遍直接把数据存储为Lua表。第二个问题:配置表数据与代码兼容一般不建议大量修改数据结构,比如增删字段,如果实在无法避免,需要代码连同数据一起发布进行热更,做好版本管理即可。第三个问题:配置读取速度优化1)先从数据量上约减,减小数据冗余重复,数据存储设计优化,多次引用的字段多引用等等;2)采用多线程加载,避免使用Unity提供的API,在游戏启动时,并行加载配置表,充分利用多核优势;3)就我们自己项目而言,没有使用Lua的更新方案,但是我们依然采用Lua作为了数据存储,经过优化后加载速度也不错,可以参考 LuaTableOptimizer。感谢Lujian提供了以上回答。
如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/5981c5c5c08748f866b5ebe2
10、Unreal 4 Shadow Map Cache
我想问下Unreal 4的 Movable光源的Shadow Map Cache问题,它的具体更新策略是什么样的呢?如何处理动态物体与静态物体的关系?需不需要对Shadow Map进行Cascade?
我同时也参考了Cry Engine的文档:http://docs.cryengine.com/display/SDKDOC2/Cached+Shadows
同时如果想移植到Unity,可行吗?或者我想解决大面积实时阴影的问题(光源方向会变化,大部分物体是动态物体 但是频率都不高)有什么解决方案吗?我可以在光源Space下预烘焙数据来达到光源方向变化,用一张Shadow Map的可能性吗?类似 Directional Light Map那种建立空间的?
精彩回答1:
Unreal 4的这个Movable Light的Shadow Map Cache只能给Static、Stationary物体用,因此我觉得其实是想给Movable光照下的Static物体阴影计算做个优化。但是Mobile端没必要用Movable,Stationary就好,Static物体的阴影是预计算的。Unreal 4的动态物体在计算阴影的时候会计算两次,一次是从静态场景投射到动态物体,一次是动态物体投射到静态场景。在计算静态场景投射到动态物体阴影时,引擎会缓存一张静态场景的Shadow Map,用于计算投射到动态物体上的阴影。因此,对于动态物体也能接收到来自静态场景的精确阴影遮挡,但是这个方式比较耗时,而且mobile也不支持。Unreal 4也提供了类似Unity的对静态场景投射到动态物体阴影近似解决方案,也是将shadow的预计算结果存储到带有间接光信息(也是SH)的点云(在Unity中就是light probe)中,然后根据动态物体的位置从点云插值出阴影遮挡,但是这种方式只能得到物体整体明暗度的变化,无法计算精确阴影。Unreal 4是推荐mobile上使用后面一种方法的。需要补充一下的是,Unity解决动态物体接受静态物体烘焙阴影也是采用Light Probe的。题主说是动态光源,动态物体,最好还是实时阴影计算。如果是采用Shadow Map Cache的方案做优化,可能得看具体场景和需求。预计算烘焙多个Shadow Map的方案可能需要考虑两个因素,一是光源变化,二是动态物体变化。如果动态物体和光源变化频率都不高,那么可以尝试对它们采样预计算好Shadow Map。但是这样带来的Shadow Map占用空间和内存开销我们也不清楚,可能得尝试一下才知道。以上回答由UWA提供。
精彩回答2:
关于Unreal 4的实现,楼上已经说得很详细了,可以参考Unreal 4源码ShadowSetup.cpp/ShadowDepthRendering.cpp,搜索SDCM_StaticPrimitivesOnly相关的代码即可,我补充一下其他问题:1)针对动静物体怎么处理 在手机上比较难完美,可以针对静物渲染一张SM,动态物件用planar shadow解决2)Shadow Map Cascade 缓存的话,Shadow Map不能随时更新,如果镜头频繁大距离移动,cascade不能跟随镜头随时更新,过度可能会不自然,这需要根据项目特性权衡3)能不能光源动,Shadow Map用同一张 看你怎么动,如果是模拟日光,轻微转角,那你只能放弃精确阴影计算,在判断某个空间点是否在阴影区时增加偏转角,相当于把阴影做平行四边形变形 如果想360度转,目前我也没有很好的思路能兼顾cache和平滑转动时的过度,毕竟物体的四面都长得不一样,不可能用一张shadow map做平行四边形变形而不穿帮。感谢招文勇提供了回答。
该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。https://answer.uwa4d.com/question/5a0e6dc2e8a3d9357ce1946d