1)UseContentHash选项能否在打包AssetBundle时计算可靠的Hash
2)如何清理Native Reserved部分的内存
3)Addressables资源完整性校验
4)通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别
这是第368篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
AssetBundle
Q:看到Unity 2022.3新增了一个BuildAssetBundleOptions.UseContentHash,请问打包AssetBundle的时候是否能计算可靠Hash?
官方信息如下:
Unity - Scripting API: BuildAssetBundleOptions.UseContentHash (unity3d.com)
A:建议别用,增加这个是为了修复我提交的一个Bug Report:
LOST SPRITE REFERENCES IN BUNDLES WHEN MOVING THE ASSETS [ASSETBUNDLE INCREMENTAL BUILD BUG, WORKS WITH UCBP]
结果没修好,会造成新的Bug:
ADDING OR REMOVING ASSETS TO BUNDLES WILL CAUSE OTHER ASSETS TO BE REBUILT WHEN BUILDASSETBUNDLEOPTIONS.USECONTENTHASH IS USED
感谢黄程@UWA问答社区提供了回答
Memory
Q:请问以下情况下,如何清理Native Reserved部分的内存?
前置条件:
1. Android IL2CPP ARM64版本
2. Unity 2021.3.31f1
3. Memory Profiler版本为0.71 Preview版本
已知:ManagedHeap的Reserved部分,也就是上图中323.4MB部分,会在以下代码执行大约5次之后降低,最终会和In Use部分持平,也就是Managed Reserved大约会变成260.1MB。
Resources.UnloadUnusedAssets();
GC.Collect();
对于Native Memory,尽管我把In Use部分降低到了253.2MB,但Reserved部分,也就是0.89GB部分,却一直没法降低。
我想知道是否有什么函数可以降低这个Reserved内存?
针对以上问题,有经验的朋友欢迎转至社区交流分享:
UWA问答 | 游戏开发者互动问答社区 | 侑虎科技
Addressable
Q:游戏是启动的时候检测资源更新并下载,当下载到一半的时候直接退出游戏。再启动游戏的时候Addressables无法检测到要更新的资源。
我查看了下载写入资源的文件夹,发现Catalog文件已经完全写入了,估计是这个原因导致Addressables无法检测到更新的资源。
请问,像这种下载到一半,希望Addressables能接着上次的进度继续下载的要怎么处理呢?
还有一点,不知道Addressables有没有提供资源完整性校验的方法。
我希望能在资源全部下载完成后,再检测一遍资源文件是否完整(完全下载完成以及文件是否有损坏)。并把这个检测的功能放到UI上,这样在一些不可预测的环境下,不至于卡死且无法解决问题。
A:每个版本下载完整应该有一个MD5值,这个就是catalog.hash的值。如果下载完成,成功进入游戏,就该把这个值写入PlayerPrefs。下次进入的时候继续判断这个值是否和服务器的catalog.hash相等,如果不相等,说明上次没有下完整,本次该继续走Addressables.DownloadDependenciesAsync方法。Addressable内部会自动针对已经下载的Bundle不会继续下载,因此只会下载最新差异的大小。
感谢liuhouchao@UWA问答社区提供了回答
UI
Q:通常,当我们想要更改Image组件的Color时,我们可以直接修改Image组件的Color属性。原理是修改网格的顶点颜色。此操作有一定的开销,因为会导致Canvas.BuildBatch操作。
我最近看了一些UGUI源码,发现当Button组件设置为Color Tint类型时,点击时会出现颜色渐变过程,此时会触发一个协程,每次执行协程都会修改CanvasRenderer组件的颜色,而不是直接修改Image组件的Color属性。
public abstract class Graphic : UIBehaviour, ICanvasElement
{
private readonly TweenRunner<ColorTween> m_ColorTweenRunner;
//trigger on click
public virtual void CrossFadeColor(Color targetColor, float duration,
bool ignoreTimeScale, bool useAlpha, bool useRGB)
{
//...
var colorTween = new ColorTween {duration = duration,
startColor = canvasRenderer.GetColor(), targetColor = targetColor};
//The callback here will be triggered in the coroutine,
//Modify the color of the canvasRenderer component
colorTween.AddOnChangedCallback(canvasRenderer.SetColor);
colorTween.ignoreTimeScale = ignoreTimeScale;
colorTween.tweenMode = mode;
//Start coroutine
m_ColorTweenRunner.StartTween(colorTween);
}
}
请问这两种写作方式之间的本质区别是什么?直接修改CanvasRenderer.color是否更有效?
针对以上问题,有经验的朋友欢迎转至社区交流分享:
UWA问答 | 游戏开发者互动问答社区 | 侑虎科技
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com