技术分享连载(九十四)
- 作者:admin
- /
- 时间:2018年01月09日
- /
- 浏览:4306 次
- /
- 分类:厚积薄发
本期聚集了这些话题:ShaderLab内存优化、Static Batch使用注意事项、foreach的堆内存分配问题修复、Unity 2017场景光照烘焙信息过大......
我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。
UWA QQ群:793972859
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群:793972859(仅限技术交流)