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

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

技术分享连载(九十三)

简介:

内存管理

Q1:我们用的是Unity 5.5.2,下图是红米2上测试的加载8个特效资源,峰值是46MB,然后就下落到22.6MB,这个内存波动是什么引起的,是因为Rendering Batches吗?

请输入图片描述
请输入图片描述

按照题主提供的例子,UWA进行了测试,在Unity 5.5.2版本中的Android真机上确实复现出了这个问题。 加载4个粒子特效,红米2设备上,加载前内存:
请输入图片描述
加载时内存:
请输入图片描述
加载后内存,确实出现了Unity内存快速升高而又回落的“抖动”现象:
请输入图片描述
对此,我们又在Unity 5.6.2版本上进行了真机测试,同样是红米2:
加载前内存:
请输入图片描述
加载时内存:
请输入图片描述
加载后内存,虽然内存同样存在小幅抖动,但其抖动范围已经明显降低。
请输入图片描述
因此,建议研发团队尝试控制同一帧中Resources.Load的加载次数或者升级到更高Unity版本。

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


UGUI

Q2:我们使用UGUI的Input Field,在手机上面如果用户输入系统自带的emoji表情,会导致一些问题,导致Input Field输入框显示异常,比如会出现一个问号的字符一直没法删除之类的,请问有什么办法可以过滤掉玩家输入的emoji表情?或者把emoji表情匹配成其他的字符?我现在是用正则来匹配emoji表情的unicode编码,但这样还是会出现覆盖不全的情况。

我们现在的处理方案,在inputfield上挂一个组件,采用类似代码来过滤表情符号,不过还没测试过能够完全符号所有表情符号,虽然不能过滤到所有的表情符号,但也不会报错。

    public char ValidateInput(string text, int charIndex, char addedChar)
    {
    // Emoji表情
    if (char.GetUnicodeCategory(addedChar) == UnicodeCategory.Surrogate)
    {
    return ‘\0’;
    }
    }

感谢 rubbyzhang提供了以上回答。

UWA试下来在Unity 5.5.5p2上也重现了该问题。但在Unity 5.6.2上没有这个问题。升级确实可能会带来风险,所以建议一种方法是用正则来匹配,网上一般也都用的这个方法。
第二种是建议可以试一试的,就是对比下Unity 5.5.5p2和Unity 5.6.2的UGUI的代码改动(主要是InputField的),尝试自己对照着修修看,然后自行编译UnityEngine.UI.dll。

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


动画

Q3:Unity 4.x Animator 能否在编辑器下进行采样呢?比方说一个技能动作30帧,想知道每一帧下模型各个节点的坐标旋转缩放,该怎么办呢?

1)可以在Animation窗口中直接看。
请输入图片描述
2)利用API: AnimationUtility.GetAllCurves 或 (AnimationUtility.GetEditorCurve)获取各节点的各属性AnimationCurve,然后取各AnimationCurve.keys中各(keyframe的value)。

之前UWA Blog里有两篇博客涉及到动画采样,GPU Skinning和动画文件降低精度,里面都有涉及采样部分的代码,建议题主可以去看看。

该问题来自UWA问答社区,感谢招文勇提供了回答,如您对该问题仍有疑问,可以转至社区进行进一步交流。
https://answer.uwa4d.com/question/5a44ff2c997cacca2128b1e1


资源管理

Q4:不同项目的AssetBundle能够相互读取吗?有什么加密方式吗?不同的Unity版本对AssetBundle的兼容性如何?

1)AssetBundle是可以互相读取的,只要Unity版本是对应的。
2)加密是跟一般的文件加密一样,但需要通过LoadFromMemory来进行加载,具体的方法网上有很多,建议题主可以Google一下。
3)在Unity 5.x版本中,高版本的项目是支持读取低版本的AssetBundle的,只要AssetBundle上开启TypeTree(默认开启)理论上就没问题。

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


资源管理

Q5:关于加载资源的CreatefromMemory这个API,我看到UWA不推荐使用,因为其效率很低,但是我们需要做dll的更新,我们dll是用这个加载策略的,想问下有没有什么别的方法,大家都不用这个API吗?或者有没有什么特殊情况下可以用呢?如何使得这个API的耗时降到最低?求建议,感谢!

如果这个API仅是用来热更新代码的,那么使用它无可厚非,这个也确实是必要的,否则就是使用类似Lua的方式来进行代码热更。

UWA不推荐频繁地使用Create/LoadFromMemory这个API是指不推荐将其频繁地用在资源的加载上。如果是重要的配置文件或者dll代码,是完全可以使用这个API来进行加载的。






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

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

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

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

其他文章