2345技术员联盟

Unity技术分享(94)-内存优化、堆内存、烘焙

  • 来源:未知 原创
  • 时间:2018-05-26
  • 阅读:
  • 本文标签:

    我们将从日常技术交流中精选若干个开发相关的问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。UWA QQ群:465082844UWA 问答社区: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并不是全都打到包里去的,但里面所保存的必要信息,打进包里后,具体有多大确实不好评估。一般来说,不开启PrecomputedGI的话,应该是不大的。“把这个东西删掉索引”再打包的话,理论上Lightmap是会丢失的,得自己来动态加载和设置的。该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。


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


    ShaderLab是项目在编译Shader时产生的解析Buffer,其内存增长的特点就是Key words越多、变体越多,其内存占用越大。目前,还没有看到有不减少变体的情况下,可以减少该内存占用的有效方法。如后续有找到,我们也会来及时更新这块的内容。至于Objects,建议搜索题库,来查找之前相应的回答,比如这https://answer.uwa4d.com/search/objects,该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。


   动画,Q3:我们导入anim后缀的文件进行精度处理后某些信息丢失,如下图所示:修改的代码如下:AnimationClip theAnimation = AssetDatabase.LoadAssetAtPath(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问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。


    资源管理,Q4:场景使用StaticBatch似乎会将所有用到的模型合并成一个大的网格并保存成文件,导致场景的AssetBundle很大,而且会导致场景的模型文件和场景文件资源似乎有重复。如果场景不标记StaticBatch,而是加载完成之后动态去设置Static Batch,尺寸会减少吗?是的,标记Static Batch会生成额外的CombinedMesh数据,这个往往占据较大的包体和内存。不标记Static Batch,加载之后通过StaticBatchingUtility API来动态设置也是一个很好的选择,唯一的不同是拿场景加载的时间来换空间。


   该问题来自UWA问答社区,如您对该问题仍有疑问,可以转至社区进行进一步交流。资源管理,Q5:请问在Unity 5.6.4中解决了foreach导致的堆内存分配问题了吗?在Unity 5.6中,foreach确实不产生堆内存分配了,另外感谢王亮的补充,在Unity 5.5.5p1中也已经修复了该问题。


本文来自电脑技术网www.it892.com),转载本文请注明来源.
本文链接:http://www.it892.com/content/maintenance/ram/20180526/96888.html

推荐阅读
无觅相关文章插件,快速提升流量