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

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

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

目錄

打包與資源加載框架目錄

正文

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

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

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

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

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

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

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

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

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))
            {
                //下載后的檢查需要拋出異常,下載前的檢查跳過不存在文件
                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的作用是是否是二次檢測,先不管它

按流程來走

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

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

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

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

下面是一套生成MD5碼的代碼,加載文件,MD5CryptoServiceProvider會根據(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();
}

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

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

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

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

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

相關(guān)文章

  • [游戲開發(fā)][Unity]Assetbundle打包篇(1)打包流程介紹

    [游戲開發(fā)][Unity]Assetbundle打包篇(1)打包流程介紹

    打包與資源加載框架目錄 先捋一下打AB包的整體思路,首先,Unity4.6版本之后就使用了全新的打包接口 無論是全新打包還是增量打包都是使用這個API,所以一切的一切,都要圍繞這個API開始講起。 該API有四個參數(shù) string outputPath AssetBundleBuild[] builds BuildAssetBundleOptions assetBundle

    2024年02月10日
    瀏覽(29)
  • [游戲開發(fā)][Unity]Assetbundle打包篇(2)打包資源配置篇

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

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

    2024年02月09日
    瀏覽(52)
  • lazarus、delphi文件Http下載斷點(diǎn)續(xù)傳的實(shí)現(xiàn)

    下載大文件時,斷點(diǎn)續(xù)傳是很有必要的,特別是網(wǎng)速度慢且不穩(wěn)定的情況下,很難保證不出意外,一旦意外中斷,又要從頭下載,會很讓人抓狂。斷點(diǎn)續(xù)傳就能很好解決意外中斷情況,再次下載時不需要從頭下載,從上次中斷處繼續(xù)下載即可,這樣下載幾G或十幾G大小的一個

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

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

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

    2024年02月03日
    瀏覽(23)
  • 舊版Xcode文件較大導(dǎo)致下載總是失敗但又不能斷點(diǎn)續(xù)傳重新開始的解決方法

    舊版Xcode文件較大導(dǎo)致下載總是失敗但又不能斷點(diǎn)續(xù)傳重新開始的解決方法

    舊版mac下載舊版Xcode時需要進(jìn)入https://developer.apple.com/download/all/?q=xcode下載,但是下載這些文件需要登錄。登錄后下載中途很容易失敗,失敗后又必須重新下載。 下載這里面的內(nèi)容都需要登錄,經(jīng)過分析需提供其cookie,我這里使用的是motrix。需要下載時先通過搜索找到你要下載

    2024年02月15日
    瀏覽(27)
  • Spring Boot實(shí)現(xiàn)HTTP大文件斷點(diǎn)續(xù)傳分片下載-大視頻分段漸進(jìn)式播放

    服務(wù)端如何將一個大視頻文件做切分,分段響應(yīng)給客戶端,讓瀏覽器可以漸進(jìn)式地播放。 Spring Boot實(shí)現(xiàn)HTTP分片下載斷點(diǎn)續(xù)傳,從而實(shí)現(xiàn)H5頁面的大視頻播放問題,實(shí)現(xiàn)漸進(jìn)式播放,每次只播放需要播放的內(nèi)容就可以了,不需要加載整個文件到內(nèi)存中。 文件的斷點(diǎn)續(xù)傳、文件多

    2024年02月14日
    瀏覽(31)
  • 斷點(diǎn)續(xù)傳下載:深入理解 HTTP Header 中的 Range 和 Content-Range 參數(shù)

    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-bAhEY9hc-1687309020087)(https://example.com/resume-download-image)] 在進(jìn)行文件下載時,我們經(jīng)常會遇到網(wǎng)絡(luò)不穩(wěn)定或其他中斷情況。為了提供更好的用戶體驗(yàn)和節(jié)省帶寬資源,斷點(diǎn)續(xù)傳技術(shù)應(yīng)運(yùn)而生。HTTP 協(xié)議通過

    2024年02月10日
    瀏覽(22)
  • 斷點(diǎn)續(xù)傳下載引出的http header的range和content-range參數(shù)

    最近同事在做安卓的斷點(diǎn)續(xù)傳下載,然后遇到了在請求頭添加RANGE參數(shù)設(shè)置時: 網(wǎng)絡(luò)上找的資料都是設(shè)置contentLength,同時測試后,發(fā)現(xiàn)中間下載無法返回206成功,最終發(fā)現(xiàn)是需要end參數(shù)-1.此處稍微記錄一下,主要了解一下相關(guān)的知識。 HTTP1.1 協(xié)議(RFC2616)開始支持獲取文件的

    2024年02月10日
    瀏覽(27)
  • U3D客戶端框架之支持?jǐn)帱c(diǎn)續(xù)傳的文件下載器實(shí)現(xiàn)方案

    ????????文件下載器是應(yīng)用程序的基礎(chǔ)模塊,為應(yīng)用程序與外部網(wǎng)絡(luò)交互提供了必要的橋梁。該模塊設(shè)計(jì)初衷是為了熱更新過程中,下載CDN站點(diǎn)上的文件資源,所以下載器會驗(yàn)證 要下載的文件是否存在于CDN中。如果存在允許下載器繼續(xù)工作;如果不存在會跳過本地下載。

    2024年02月07日
    瀏覽(25)
  • Spring-Boot實(shí)現(xiàn)HTTP大文件斷點(diǎn)續(xù)傳分片下載-大視頻分段漸進(jìn)式播放

    服務(wù)端如何將一個大視頻文件做切分,分段響應(yīng)給客戶端,讓瀏覽器可以漸進(jìn)式地播放。 Spring Boot實(shí)現(xiàn)HTTP分片下載斷點(diǎn)續(xù)傳,從而實(shí)現(xiàn)H5頁面的大視頻播放問題,實(shí)現(xiàn)漸進(jìn)式播放,每次只播放需要播放的內(nèi)容就可以了,不需要加載整個文件到內(nèi)存中。 文件的斷點(diǎn)續(xù)傳、文件多

    2024年02月11日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包