UseContentHash选项能否在打包AssetBundle时计算可靠的Hash

发布时间 2024-01-04 15:21:07作者: UWATech

1)UseContentHash选项能否在打包AssetBundle时计算可靠的Hash
2)如何清理Native Reserved部分的内存
3)Addressables资源完整性校验
4)通过Image.color和CanvasRenderer.SetColor修改UI组件颜色的区别


这是第368篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

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内存?

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/658bdd6a3625c22cffcb1d9c


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是否更有效?

针对以上问题,有经验的朋友欢迎转至社区交流分享:
https://answer.uwa4d.com/question/658d72b93625c22cffcb1dbd

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844