技术分享连载(九十四)

技术分享连载(九十四)

我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:465082844
UWA 问答社区:answer.uwa4d.com


渲染

Q1:我们的版本是Unity 2017,我们的美术烘焙出来的场景光照贴图中,还带了一个Lighting Data Asset这样的文件,查询相关资料显示是包含了贴图采样信息等内容,按理说应该不会很大,可是现在项目里,这个文件达到了90MB一个场景很不正常。有人建议是把这个东西删掉索引,不要打包。但是不知道这样场景里的灯光贴图还可以正常加载么?

建议题主可以看下文档(https://docs.unity3d.com/Manual/LightmapSnapshot.html)里的两条描述:

The asset is an Editor only construct so far, so you can’t access it in the player.
Currently, this file is a bit bloated as it contains data for multiple platforms - we will fix this. Also we are considering adding some compression for this data.

所以这90MB并不是全都打到包里去的,但里面所保存的必要信息,打进包里后,具体有多大确实不好评估。一般来说,不开启Precomputed GI的话,应该是不大的。“把这个东西删掉索引”再打包的话,理论上Lightmap是会丢失的,得自己来动态加载和设置的。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a4f4367e041ef3c50c9ce64


内存管理

Q2:真机测试环境下,在Profiler里查看内存使用情况,发现ShaderLab一项占用内存很大,里面主要是什么?减少了Shader的变体后这部分内存有所下降,没有使用Unity内置的Standard Shader。能否在不减少变体的情况下,减少这一部分占用的内存?
请输入图片描述
另外,也发现同一项下的Objects占用也很大,这是为什么呢?
请输入图片描述

ShaderLab是项目在编译Shader时产生的解析Buffer,其内存增长的特点就是Key words越多、变体越多,其内存占用越大。目前,还没有看到有不减少变体的情况下,可以减少该内存占用的有效方法。如后续有找到,我们也会来及时更新这块的内容。

至于Objects,建议搜索题库,来查找之前相应的回答,比如这里:
https://answer.uwa4d.com/search/objects

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a4d8df42b7c402cc97294a3


动画

Q3:我们导入anim后缀的文件进行精度处理后某些信息丢失,如下图所示:
请输入图片描述
修改的代码如下:

AnimationClip theAnimation = AssetDatabase.LoadAssetAtPath<AnimationClip> (path);
Keyframe key;
Keyframe[] keyFrames;
foreach (EditorCurveBinding binding in (AnimationUtility.GetCurveBindings(theAnimation)))
{
AnimationCurve curve = AnimationUtility.GetEditorCurve(theAnimation, binding);
if (curve == null || curve.keys == null)
{
continue;
}
keyFrames = curve.keys;
for (int i = 0; i < keyFrames.Length; i++)
{
key = keyFrames[i];
key.value = float.Parse(key.value.ToString(“f3”));
key.inTangent = float.Parse(key.inTangent.ToString(“f3”));
key.outTangent = float.Parse(key.outTangent.ToString(“f3”));
keyFrames[i] = key;
}
curve.keys = keyFrames;
theAnimation.SetCurve(binding.path, binding.type, binding.propertyName, curve);

修改前后的例子已经上传到UWA问答社区。

丢失的信息是mEditorcurves, 该字段只对anim在Editor中的内存占用产生影响,对其在真机运行时的动画效果与内存占用并无影响。因此该字段列表为空与否不会影响其在真机中的表现,可以用提问中的方式对其进行精度处理。如果想保留该字段(虽然对真机内存无影响),可以通过文本处理的方法对anim文件进行精度处理,处理时跳过mEdtorcurves字段。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a4254efebf015c04f5ed54e


资源管理

Q4:场景使用Static Batch似乎会将所有用到的模型合并成一个大的网格并保存成文件,导致场景的AssetBundle很大,而且会导致场景的模型文件和场景文件资源似乎有重复。
如果场景不标记Static Batch,而是加载完成之后动态去设置Static Batch,尺寸会减少吗?

是的,标记Static Batch会生成额外的Combined Mesh数据,这个往往占据较大的包体和内存。不标记Static Batch,加载之后通过StaticBatchingUtility API来动态设置也是一个很好的选择,唯一的不同是拿场景加载的时间来换空间。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a40eafdb319bedd3bec6d91


资源管理

Q5:请问在Unity 5.6.4中解决了foreach导致的堆内存分配问题了吗?

在Unity 5.6中,foreach确实不产生堆内存分配了,另外感谢王亮的补充,在Unity 5.5.5p1中也已经修复了该问题。

该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a4c575c2adbd673cb602a33


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