技术分享连载(六十七)-阿里云开发者社区

开发者社区> 开发与运维> 正文

技术分享连载(六十七)

简介:

资源管理

Q1:使用AssetBundle.Unload(true)释放AnimationClip , 但发现AnimationClip在Profiler看到还存在,请问要怎样才释放干净呢?

如果这个AnimaitonClip是从AssetBundle中加载过来的,那么当这个AssetBundle调用unload(true)时,该AnimationClip理论上是会被强行卸载的。如果Profiler中查看还有,那么只有两种情况:

(1)仍然存在的AnimationClip是从其他地方加载来的,而不是来自于该卸载的AssetBundle;
(2)Unity引擎的Bug,这种概率不是没有,但很小。

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


资源管理

Q2:如何处理ETC压缩完图片质量模糊和ARGB32内存占用太大这种关系?

研发团队可以从参考以下几个方法:
1)使用ETC压缩的图片尽量减少过渡,这是美术制作时需要注意的,很多情况下并不需要明显的过渡,只是需要半透明而已;
2)当然,有部分过渡色是必须的,这时候就要把相关小图整合到一张RGBA32的图片上;
3)在资源管理上入手。一般情况下,我们是允许部分资源使用RGBA32,但是要注意,及时卸载掉不使用的资源,以保证内存峰值在可控范围内。

感谢UWA 问答社区的郑骁提供了以上回答。

在我们团队里面有一个意识,品质高和性能好有些时候是一对矛盾,有些情况要无损压缩是很难做到的。我们目前如果ETC压> 缩效果不好的,会使用RGBA32并降一个尺寸规格来压缩,这样虽然图片会模糊点,但是过渡还是平滑的。

感谢UWA 问答社区的邓永健提供了以上回答。

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/593629f27780cfc82fa5f867


资源管理

Q3:如何降低动画文件的浮点数精度?之前UWA给过思路,但具体怎么个执行方法?

动画文件后处理可以做两件事,1)精度压缩,2)scale曲线剔除。比起用工具修改原始fbx文件,这样比较灵活。
实际测试,在开启Optimal压缩的情况下,加上这个后处理,能再节省40%左右。

void OnPostprocessModel(GameObject g) {
    // for skeleton animations.
    
        List<AnimationClip> animationClipList = new List<AnimationClip>(AnimationUtility.GetAnimationClips(g));
        if (animationClipList.Count == 0) {
            AnimationClip[] objectList = UnityEngine.Object.FindObjectsOfType (typeof(AnimationClip)) as AnimationClip[];
            animationClipList.AddRange(objectList);
        }
        
        foreach (AnimationClip theAnimation in animationClipList)
        {

            try 
            {
                //去除scale曲线
                foreach (EditorCurveBinding theCurveBinding in AnimationUtility.GetCurveBindings(theAnimation))
                {
                    string name = theCurveBinding.propertyName.ToLower();
                    if (name.Contains("scale"))
                    {
                        AnimationUtility.SetEditorCurve(theAnimation, theCurveBinding, null);
                    }
                } 

                //浮点数精度压缩到f3
                AnimationClipCurveData[] curves = null;
                curves = AnimationUtility.GetAllCurves(theAnimation);
                Keyframe key;
                Keyframe[] keyFrames;
                for (int ii = 0; ii < curves.Length; ++ii)
                {
                    AnimationClipCurveData curveDate = curves[ii];
                    if (curveDate.curve == null || curveDate.curve.keys == null)
                    {
                        //Debug.LogWarning(string.Format("AnimationClipCurveData {0} don't have curve; Animation name {1} ", curveDate, animationPath));
                        continue;
                    }
                    keyFrames = curveDate.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;
                    }
                    curveDate.curve.keys = keyFrames;
                    theAnimation.SetCurve(curveDate.path, curveDate.type, curveDate.propertyName, curveDate.curve);
                }
            }
            catch (System.Exception e)
            {
                Debug.LogError(string.Format("CompressAnimationClip Failed !!! animationPath : {0} error: {1}", assetPath, e));
            }
        }
        
}

此问答来自于UWA 问答社区:
https://answer.uwa4d.com/question/593955b6c42dc04f4d8f7341
感谢UWA 问答社区的WangLiang提供了以上回答。


内存管理

Q4:请问一下iOS平台打出来的带Profiler的包,在XCode里看内存运行期间涨了近60MB,Profile里面看ReservedTotal只涨了10MB,这个是为什么呢?测了很多次,都是xcode内存涨很多,但是资源看不到太大的变化,最后游戏可能会崩溃,求解?

这说明iOS内存的提升绝大部分并不是由Unity引擎所造成的,一般来说,系统库会占用一定的内存,但如果内存持续上升直至崩溃,那么建议研发团队从所用第三方库(比如Lua、Native插件等)入手,检测其是否存在内存泄露风险。


资源管理

Q5:UWA报告中的资源是否是实时的?我看给的是原始格式,不是压缩后的内存数值。
0.png

ASTC格式并不是所有机型都支持,在Android端只有配有高端Mali芯片的机器才支持,对于不支持的,引擎会将其解压成RGBA32进行处理,所以图片中的内存值过大,很可能是项目在不支持ASTC格式的设备上所看到的结果。







原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章