国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[游戲開(kāi)發(fā)][Unity]Assetbundle加載篇(4)檢查斷點(diǎn)續(xù)傳以及開(kāi)始下載AB包

這篇具有很好參考價(jià)值的文章主要介紹了[游戲開(kāi)發(fā)][Unity]Assetbundle加載篇(4)檢查斷點(diǎn)續(xù)傳以及開(kāi)始下載AB包。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

打包與資源加載框架目錄

正文

AB包之前,要檢查該AB包是否下載中斷過(guò),例如用戶殺程序,卡死等情況。

前文有講解過(guò),下載AB包會(huì)先下載到臨時(shí)文件夾,全部下載成功后,全部剪切到persistentDataPath沙盒目錄中。

回顧一下之前的篩選機(jī)制,哪些AB包可以加入下載列表,其中并沒(méi)有臨時(shí)下載目錄的判斷。

該AB包數(shù)據(jù)是否加入列表要經(jīng)過(guò)下面幾個(gè)篩選

  1. 判斷persistentDataPath沙盒目錄是否存在該AB包,如果存在證明之前下載過(guò),無(wú)需加入下載列表。

  1. 判斷StreamingAsset目錄中是否存在該AB包,如果存在證明打包時(shí)該AB包已經(jīng)在包體里,無(wú)需加入下載列表。

  1. 如果該AB包的下載類(lèi)型是游戲內(nèi)下載,或者叫邊玩邊下,那么不需要在游戲啟動(dòng)熱更時(shí)下載,無(wú)需加入下載列表

檢查是否在臨時(shí)下載目錄中是否存在的代碼如下

private IEnumerator CheckTempFileComplete(List<PatchElement> list, bool isPostCheck)
{
    PatchEventDispatcher.SendCheckDownloadedFileMd5();
    var sw = new Stopwatch();
    sw.Start();
    var buf = new byte[10240];
    this.totalDownloadSizeKB = 0;
    this.currentDownloadSizeKB = 0;
    this.currentDownloadCount = 0;
    using (var md5 = System.Security.Cryptography.MD5.Create())
    {
        foreach (var ele in list)
        {
            this.totalDownloadSizeKB += ele.SizeKB;
            string savePath = AssetPathHelper.MakeDownloadTempPath(ele.Name);
            if (!File.Exists(savePath))
            {
                //下載后的檢查需要拋出異常,下載前的檢查跳過(guò)不存在文件
                if (isPostCheck)
                {
                    PatchHelper.Log(ELogLevel.Error, $"[checking md5] file is not existed: {ele.Name}");
                    failedOnCheckDownload = true;
                    yield break;
                }
                else
                {
                    continue;
                }
            }
            
            using (var fs = new FileStream(savePath, FileMode.Open, FileAccess.Read))
            {
                int byteRead;
                md5.Initialize();
                while ((byteRead = fs.Read(buf, 0, buf.Length)) > 0)
                {
                    md5.TransformBlock(buf, 0, byteRead, null, 0);
                    if (sw.ElapsedMilliseconds > 250)
                    {
                        yield return null;
                        sw.Restart();
                    }
                }
                md5.TransformFinalBlock(buf, 0, 0);
                fs.Close();
                string localMd5 = BitConverter.ToString(md5.Hash).Replace("-", "");
                if (string.Equals(ele.MD5, localMd5, StringComparison.OrdinalIgnoreCase))
                {
                    //MotionLog.Log(ELogLevel.Log, StringFormat.Format("skip download existed file: {0}", savePath));
                    ele.SkipDownload = true;
                    this.currentDownloadSizeKB += ele.SizeKB;
                    this.currentDownloadCount++;
                }
                else if (isPostCheck)
                {
                    PatchHelper.Log(ELogLevel.Error, $"Web file md5 verification error : {ele.Name}");
                    PatchHelper.Log(ELogLevel.Error, $"local md5 is : {localMd5}");
                    PatchHelper.Log(ELogLevel.Error, $"md5 in manifest is : {ele.MD5}");
                    PatchEventDispatcher.SendWebFileMD5VerifyFailedMsg(ele.Name);
                    failedOnCheckDownload = true;
                    File.Delete(savePath);
                    yield break;
                }
            }
        }
    }
}

布爾值isPostCheck的作用是是否是二次檢測(cè),先不管它

按流程來(lái)走

  1. 檢查該AB包是否在臨時(shí)文件夾中存在,如果不存在則跳過(guò)

  1. 如果已存在,創(chuàng)建該臨時(shí)下載文件的MD5,與下載清單中的MD5做對(duì)比

  1. 如果MD5對(duì)比一致,則標(biāo)記該AB包數(shù)據(jù)為SkipDownload,同時(shí)標(biāo)記下載數(shù)據(jù)長(zhǎng)度,供UI顯示

我們項(xiàng)目里目前的代碼被人改了,我也有有點(diǎn)看不懂為何要用 md5.TransformBlock的方式

下面是一套生成MD5碼的代碼,加載文件,MD5CryptoServiceProvider會(huì)根據(jù)加載的stream生成hash,

readonly MD5CryptoServiceProvider _provider = new MD5CryptoServiceProvider();
public static string StreamMD5()
{
? ? using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
? ? {
    ? ? byte[] hashBytes = _provider.ComputeHash(stream);
    ? ? return ToString(hashBytes);
? ? }
}
private static string ToString(byte[] hashBytes)
{
? ? var sb = new StringBuilder();
? ? foreach (var t in hashBytes)
? ? sb.Append(t.ToString("x2"));
? ? return sb.ToString();
}

首先要判斷臨時(shí)下載目錄中是否存在該文件,如果沒(méi)有,我們項(xiàng)目文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-476842.html

private IEnumerator Download()
{
    // 計(jì)算下載文件的總大小
    totalDownloadCount = _patcher.DownloadList.Count;
    if (totalDownloadCount == 0)
    {
        _patcher.SwitchNext();
        yield break;
    }
    //先檢查一遍temp目錄有沒(méi)有下載完的, 計(jì)算這次實(shí)際需要下載的個(gè)數(shù)和size
    yield return CheckTempFileComplete(_patcher.DownloadList, false);

    // 開(kāi)始下載列表里的所有資源
    PatchHelper.Log(ELogLevel.Log, $"Begine download web files : {totalDownloadCount-currentDownloadCount}");
    PatchEventDispatcher.SendPatchStatesChangeMsg(EPatchStates.DownloadWebFiles);
    var startTime = Time.realtimeSinceStartup;
    var newDownloaded = new List<PatchElement>(_patcher.DownloadList.Count);
    foreach (var element in _patcher.DownloadList)
    {
        if (element.SkipDownload) continue;
        newDownloaded.Add(element);
    }

    if (useMultiRequest)
    {
        yield return DownloadWithMultiTask(newDownloaded);
    }
    else
    {
        yield return DownloadWithSingleTask(newDownloaded);
    }
    if (failedOnDownload)
    {
        yield break;
    }
    MotionLog.Log(ELogLevel.Log, $"<color=#ff0000>Downloading {newDownloaded.Count} files cost {Time.realtimeSinceStartup-startTime} sec.</color>");
    //全部下載完成后把這次新下載的文件再校驗(yàn)一遍,如果有文件失敗就退出
    yield return CheckTempFileComplete(newDownloaded, true);
    if (failedOnCheckDownload)
    {
        yield break;
    }
    
    if (_patcher.MiniAndroid)
    {
        var fileCount = _patcher.DownloadList[0].Version; // tricky storing filecount in field [version]
        var zipFileName = _patcher.DownloadList[0].Name;
        yield return DecompressInitPack(zipFileName, fileCount);
    }
    else
    {
        yield return DeployDownloadFiles();
    }

    // 最后清空下載列表
    _patcher.DownloadList.Clear();
    _patcher.SwitchNext();
}

到了這里,關(guān)于[游戲開(kāi)發(fā)][Unity]Assetbundle加載篇(4)檢查斷點(diǎn)續(xù)傳以及開(kāi)始下載AB包的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • [游戲開(kāi)發(fā)][Unity]Assetbundle打包篇(2)打包資源配置篇

    [游戲開(kāi)發(fā)][Unity]Assetbundle打包篇(2)打包資源配置篇

    打包與資源加載框架目錄 可視化配置的方式有很多種,Json、XML、以及Unity內(nèi)置的ScriptableObject序列化 配置文件里要有哪些內(nèi)容呢,很顯然,最重要的就是目標(biāo)文件路徑,其次是權(quán)重類(lèi)型,權(quán)重類(lèi)型有:必要打包型、被引用打包型、忽略類(lèi)型。為何會(huì)有忽略類(lèi)型呢,是因?yàn)槲覀?/p>

    2024年02月09日
    瀏覽(52)
  • [游戲開(kāi)發(fā)][Unity]Assetbundle下載篇(7)獲取運(yùn)行時(shí)(邊玩邊下)下載列表

    [游戲開(kāi)發(fā)][Unity]Assetbundle下載篇(7)獲取運(yùn)行時(shí)(邊玩邊下)下載列表

    打包與資源加載框架目錄 啥是運(yùn)行時(shí)下載清單?現(xiàn)在大多數(shù)手游都會(huì)有一個(gè)邊玩邊下功能,會(huì)提示用戶是否開(kāi)啟下載,要XXX流量,如果你下載完了,可能還會(huì)有獎(jiǎng)勵(lì)。 ? 疑問(wèn):為何要有邊玩邊下功能? 解答:為了發(fā)包的包體小,并且是越小越好! 我們的游戲想要賺錢(qián),第一

    2024年02月08日
    瀏覽(27)
  • [游戲開(kāi)發(fā)][Unity]Assetbundle打包篇(5)使用Manifest二次構(gòu)建資源索引

    [游戲開(kāi)發(fā)][Unity]Assetbundle打包篇(5)使用Manifest二次構(gòu)建資源索引

    打包與資源加載框架目錄 正文開(kāi)始前,先把打包代碼放過(guò)來(lái),請(qǐng)注意,前面的代碼已省略,自己去對(duì)比前面的文章。本篇文章從第一次執(zhí)行打包代碼開(kāi)始。 第一次調(diào)用BuildPipeline.BuildAssetBundles打包API后(詳見(jiàn)代碼第七行),會(huì)返回AssetBundleManifest的引用, 【疑問(wèn)】: BuildPipe

    2024年02月03日
    瀏覽(23)
  • [游戲開(kāi)發(fā)][Unity]Assetbundle下載篇(1)熱更前準(zhǔn)備與下載AB包清單

    [游戲開(kāi)發(fā)][Unity]Assetbundle下載篇(1)熱更前準(zhǔn)備與下載AB包清單

    打包與資源加載框架目錄 熱更流程都不是固定的,每個(gè)人寫(xiě)的狀態(tài)機(jī)也有所差別,但是一些必要步驟肯定不可能少,例如下載清單,對(duì)比版本,下載AB包,標(biāo)記下載完成。我接下來(lái)的每一篇文章都是下載AB包的重要步驟,大概率是不能省略的。 檢查沙盒路徑是否存在 檢查下載

    2024年02月15日
    瀏覽(25)
  • 【Unity】AssetBundle加載與卸載

    【Unity】AssetBundle加載與卸載

    需要注意的是同一個(gè)ab包一次只能加載一個(gè),不可以同時(shí)加載, 報(bào)錯(cuò): The AssetBundle \\\'xxxxx\\\' can\\\'t be loaded because another AssetBundle with the same files is already loaded. 如果AB包已經(jīng)加載過(guò)則先進(jìn)行卸載: 1、卸載全部的目前沒(méi)有使用的資源: Resources.UnloadUnusedAssets() 2、卸載 AssetBundle 釋放其

    2024年04月25日
    瀏覽(17)
  • Unity-AssetBundle Browser 打包和加載

    Unity-AssetBundle Browser 打包和加載

    進(jìn)入unity手冊(cè)中,搜素 Unity Asset Bundle Browser 工具,選擇你使用的版本號(hào),根據(jù)顯示出的操作進(jìn)行資源導(dǎo)入即可。 注:有的版本可能沒(méi)有資源鏈接,可以百度一下有很多。 1、制作預(yù)制體(省略)? 2、選擇一個(gè)預(yù)制體,在Inspector窗口下方,設(shè)置預(yù)制體的ab包名(包名只能為小寫(xiě)字

    2024年04月13日
    瀏覽(23)
  • 【Unity】AssetBundle資源異步加載以及AB包卸載

    【Unity】AssetBundle資源異步加載以及AB包卸載

    以下代碼是基于上一篇文章《AssetBundle資源同步加載》的代碼新增了異步加載和AB包卸載功能,有興趣的同學(xué)可以去看看我的上一篇文章。 由于異步加載需要配合協(xié)程進(jìn)行功能開(kāi)發(fā),所以我對(duì)之前封裝的AB包資源加載管理器進(jìn)行修改,改為繼承MonoBehaviour的單例模式。 主要修改

    2023年04月08日
    瀏覽(23)
  • Unity的AssetBundle系統(tǒng)來(lái)動(dòng)態(tài)加載FBX模型

    在Unity中,可以使用C#腳本和Unity的AssetBundle系統(tǒng)來(lái)動(dòng)態(tài)加載FBX模型。以下是一個(gè)簡(jiǎn)單的示例,演示如何動(dòng)態(tài)加載FBX模型: 準(zhǔn)備FBX模型 首先,準(zhǔn)備一個(gè)或多個(gè)FBX模型,并將它們導(dǎo)入到Unity項(xiàng)目中。確保每個(gè)FBX模型都有一個(gè)獨(dú)立的游戲?qū)ο?,并且已?jīng)被正確地設(shè)置為“Static”或“

    2024年02月06日
    瀏覽(25)
  • Unity AssetBundle批量打包、加載(場(chǎng)景、Prefab)完整流程

    Unity AssetBundle批量打包、加載(場(chǎng)景、Prefab)完整流程

    1、文章介紹 2、具體思路和寫(xiě)法 ????????(1)AB包的打包 ????????(2)AB包的加載 ????????(3)AB包卸載 3、結(jié)語(yǔ) 本篇博客主要起記錄和學(xué)習(xí)作用,簡(jiǎn)單的介紹一下AB包批量的打包和加載AB包的方式,若各位同學(xué)有幸看到本篇博客,希望能夠?qū)δ阌兴鶐椭?(1)

    2024年02月04日
    瀏覽(26)
  • Unity中使用AssetBundle打包與加載的注意事項(xiàng)

    Unity中使用AssetBundle打包與加載的注意事項(xiàng)

    一、使用AssetBundle進(jìn)行打包與加載 個(gè)人覺(jué)得可以參考以下兩篇博客,這個(gè)網(wǎng)上相關(guān)教程很多,還不明白的可以去百度,或者給我留言。 Unity 打包與加載AssetBundle(加載對(duì)應(yīng)的依賴(lài)) Unity中的AssetBundle 二、使用AssetBundle進(jìn)行加載的時(shí)候注意事項(xiàng): 注意事項(xiàng)一:AssetBundle名字和設(shè)置

    2024年02月11日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包