技术分享连载(九十三)

技术分享连载(九十三)

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

UWA QQ群:465082844
UWA 问答社区:answer.uwa4d.com


内存管理

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来进行加载的。

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


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