Unity ゲーム フレームワーク - フレームワークの学習 - Ab パッケージング プロセス分析

UGF リソースの更新と管理
https://www.jianshu.com/p/80bff8c9004a

パッケージ構成

ResourceBuilder.xml ファイルには、パッケージ化構成情報
[写真]
パラメータが保存されます。
InternalResourceVersion: 内部バージョン番号
プラットフォーム: 生成された ab リソースに対応するプラットフォーム番号、バイナリ左シフト、
AssetBundleCompression を取得するための AND または非演算子: 圧縮形式ラベル、圧縮なし、LZ4 圧縮、LZMA 圧縮
CompressionHelperTypeName: 圧縮および解凍ヘルパーのタイプ名
AdditionalCompressionSelected: 送信オーバーヘッドを削減するために再圧縮を実行するかどうか
ForceRebuildAssetBundleSelected: AssetBundle の再構築を強制するかどうか
BuildEventHandlerTypeName: ab を構築するための関連イベント クラスのタイプ名
OutputDirectory: ab 出力フォルダー、その他の出力ディレクトリはこのディレクトリから派生
OutputPackageSelected: パッケージ リソースを生成するかどうか
OutputFullSelected: フル リソースを生成するかどうか
OutputPackedSelected: パックされたリソースを生成するかどうか
各ディレクトリの説明:
Working: Unity が AssetBundle を生成するときの作業ディレクトリ。
パッケージ:スタンドアロン モード用に生成されたファイルが配置されているディレクトリ ゲームがスタンドアロン ゲームの場合、生成が完了した後、このディレクトリ内のプラットフォームに対応するファイルを StreamingAssets にコピーして、アプリをビルドします。
満杯:更新可能モード用に生成された完全なファイル パッケージが配置されるディレクトリ。ゲームがオンライン ゲームの場合、生成が完了した後、プレーヤーがダウンロードできるようにこのディレクトリをリソース サーバーにアップロードする必要があります。
Packed:更新可能モードで生成されたファイルが配置されているディレクトリ ゲームがオンライン ゲームの場合、生成が完了した後、このディレクトリ内のプラットフォームに対応するファイルを StreamingAssets にコピーして、アプリをビルドします。アセットバンドルが出力パック パスに生成されるかどうかは、アセットバンドル編集ツールでアセットバンドルがパック済みとしてマークされているかどうかによって決まります。(APP とともにリリースされたリソースはこのディレクトリに保存されます)
BuildReport: AB パッケージ ファイルと非 AB パッケージ ファイルは GF のリソース ファイルに均一に抽象化され、ファイルのサフィックスは .dat です。リソース リストでは、レコードはそれですは、これらの .dat リソース ファイルのリソース情報です。この情報には、リソース ファイルの名前、ハッシュコード、長さ、zipHashcode、zip 長、AB パッケージかどうか、読み込み設定、その他の情報が含まれます。

包装工程

パッケージ化されたプロセスの実行は、[Start Build Resources] ボタンを押すと開始されます
[写真]
。ResourceBuilder スクリプトを見つけます。ボタンがクリックされ、bool 型変数 m_OrderBuildResources の値が true に変更されると、BuildResources() メソッド
private void Update()
{ if (m_OrderBuildResources) ) { m_OrderBuildResources = false; BuildResources(); } }





クラスの関係 クラス
の生成関係は以下の通り
ResourceBuilder: リソースジェネレータ(エントリ)
ResourceBuilderController: リソース構築コントローラ
ResourceAnalyzerController: リソース分析コントローラ
ResourceCollection: リソース収集
Resource: abパッケージに含まれるリソース情報
Asset: リソースファイル情報
// リソースジェネレータ( Entry)
ResourceBuilder: EditorWindow
{ private ResourceBuilderController m_Controller = null; } //リソース構築コントローラResourceBuilderController { ab パッケージに含まれるリソース ファイルの数 127 private readonly ResourceCollection m_ResourceCollection; private readonly ResourceAnalyzerController m_ResourceAnalyzerController; // ab リソース - ab パッケージのフルパス情報 キーと値のペア、ab パッケージの数 116 private readonly SortedDictionary<string, ResourceData> m_ResourceDatas; }











//リソース分析コントローラー
ResourceAnalyzerController
{ private readonly ResourceCollection m_ResourceCollection; //各リソース ファイルが依存するリソースprivate readonly Dictionary<string, dependencyData> m_DependencyDatas; //各依存リソース (a) は、それに依存するリソースに対応します リストリソース (b, c) によって形成され、(b, c) は ab パッケージ内のリソースに属しますprivate readonly Dictionary<string, List> m_ScatteredAssets; //ab リソースと分散リソースが統合された後のすべての依存関係のリストprivate readonly List < string[]> m_CircularDependencyDatas; //依存関係リソースリスト(ab +分散)、順序なしコレクション、高速検索、重複なしprivate readonly HashSet m_AnalyzedStamps; } //リソースコレクションResourceCollection { //ab path-ab resource リソース情報キー値 Right (116) private readonly SortedDictionary<string, Resource> m_Resources; //guid-Assets キーと値のペア (127)
















private readonly SortedDictionary<string, Asset> m_Assets;
}
//ab パッケージに含まれるリソース情報
Resource
{ private readonly List m_Assets;//ab パッケージに含まれるリソース ファイルprivate readonly List m_ResourceGroups;//属しているpublic string Name //ab パッケージ名public string Variant //バリアント名public string FullName //パスを含む完全名public AssetType AssetType //リソース タイプ、リソース、またはシーンpublic bool IsLoadFromBinary //バイナリ ファイルからロードするかどうかpublic string FileSystem public LoadType LoadType //リソースの読み込みメソッドの種類public bool Packed //メインパッケージリソースかどうか} //リソースファイル情報Asset: IComparable { public string Guid;//リソースファイル guid public string Name;//Resourceファイル名public Resource Resource;//それが属する Ab パッケージ

















}
//依存関係データ情報
public sealed class dependencyData
{ //依存する ab パッケージprivate List m_DependencyResources; //依存する ab パッケージ内のファイルprivate List m_DependencyAssets; //依存する分散ファイル名private List m_ScatteredDependencyAssetNames ; } / /依存関係情報//各リソース ファイルには複数の依存ファイルが存在する場合があります。ab パッケージ内のリソース ファイルには、構造の数だけ依存関係があります。struct Stamp { private readonly string m_HostAssetName;//リソース ファイル名private readonly string m_DependencyAssetName ;//依存リソースファイル名}入り口は ResourceBuilderController.BuildResources() メソッド 主な処理は以下の通り1. ファイルシステムを作成し、各モードの ab リソースフォルダを生成2. ab リソース生成オプションを設定BuildAssetBundleOptions buildAssetBundleOptions = GetBuildAssetBundleOptions ();



















3. リソース情報の収集
m_ResourceCollection.Load() は、
リソース情報 xml ファイル (Assets/GameMain/Configs/ResourceCollection.xml) を読み取り
、ResourceCollection.xml ファイルからパッケージ化する必要があるリソース情報を取得し、m_Resources と m_Assets に格納します。 ResourceCollection クラスは ResourceBuilderController の作成で構成されます
4. 依存リソースの解析
解析
m_ResourceAnalyzerController.Analyze();
ResourceAnalyzerController クラスは ResourceBuilderController によって作成されます。ResourceAnalyzerController の m_ResourceCollection リソース データは ResourceBuilderController から取得されます。このステップでは主に ResourceAnalyzerController m_DependencyDatas List<string[]> m_CircularDependencyDatas= new List<string[]>(); m_CircularDependencyDatas[0]=new string[]{a,b,d,c,b} m_CircularDependencyDatas
の属性情報を入力します。[1 ]=新しい文字列[]{b,d,c,b} m_CircularDependencyDatas[2]=新しい文字列[]{c,b,d,c}
[写真]ここに画像の説明を挿入します




m_CircularDependencyDatas[3]=新しい文字列[]{e,f,h,e}
m_CircularDependencyDatas[4]=新しい文字列[]{f,h,e,f}
m_CircularDependencyDatas[5]=新しい文字列[]{h,e, f, h}
a と e のみが ab パッケージにある場合、他の依存関係のある b、c、d、f、h、k もカウントされます。 5.
ab リソースのデータを構築する
準備をしますPrepareBuildData (outassetBundleBuildDatas, outassetBundleResourceDatas、outbinaryResourceDatas)
エディターが AssetsBundle をエクスポートするために必要なデータは、assetBundleBuildDatas のみであることに注意してください。データは ResourceBuilderController.m_ResourceCollection から取得され、前のステップのリソースの分析には直接依存しません。リソースの分析によって生成されたデータデバイスパネルの分析がより直感的に表示されます。つまり、分析結果はリソースを処理しません。

6. 選択したプラットフォームのリソースをビルドします
BuildResources(Platform.Windows,assetBundleBuildDatas,buildAssetBundleOptions,assetBundleResourceDatas,binaryResourceDatas);
リソースの構築は 3 つのステップに分かれています
. 1. リソース ファイル、リソースおよびリソース リスト ファイル (つまり、生成パスに基づいて名前が付けられたファイル) を生成します、Windows および Windows.manifest)
AssetBundleManifestassetBundleManifest = BuildPipeline.BuildAssetBundles(workingPath,assetBundleBuildDatas,buildAssetBundleOptions,GetBuildTarget(platform));
assetBundleBuildDatas データを使用して、作業ディレクトリに ab リソースを生成します
[図]
2. 暗号化された ab パッケージとバイトを出力しますstream チェックコードの主な機能
は以下の通りです
。ProcessAssetBundle(platform, workingPath,outputPackagePath,outputFullPath,outputPackedPath,AdditionalCompressionSelected,assetBundleResourceDatas[i].Name,assetBundleResourceDatas[i].Variant,assetBundleResourceDatas[i].FileSystem)を自分で見つけてください。 )
ProcessOutput(platform,outputPackagePath,outputFullPath,outputPackedPath,AdditionalCompressionSelected,name,variant,fileSystem,resourceData,bytes,length,hashCode,compressedLength,compressedHashCode) 3. 各プラットフォームの下に暗号化されたリストファイルを出力します。 ProcessPackageVersionList(outputPackagePath, platform);
ProcessReadOnlyVersionList
(
outputPackedPath 、 プラットホーム);

ab リソースの読み込み

DefaultLoadResourceAgentHelper
///
/// リソース エージェント ヘルパーをロードして、リソース ファイルの非同期読み取りを開始します。
///
/// ロードされるリソースの完全なパス名。
public override void ReadFile(string fullPath)
{ if (m_LoadResourceAgentHelperReadFileCompleteEventHandler == null || m_LoadResourceAgentHelperUpdateEventHandler == null || m_LoadResourceAgentHelperErrorEventHandler == null) { Log.Fatal("ロード リソース エージェント ヘルパー ハンドラーが無効です。"); return; }




        m_FileFullPath = fullPath;
        //将本地资源加载到内存
        m_FileAssetBundleCreateRequest = AssetBundle.LoadFromFileAsync(fullPath);
    }

アブビルド分析

ソース コードを勉強した後、多くの恩恵を受けました。ab 構築におけるリソースの分析は非常に完全です。リソースの更新には増分更新が使用されます。開発者は、どのコンテンツが更新されたかに注意を払う必要はありません。リソース コンテンツの記録は個別にパッケージ化されています。 、とてもフレンドリーです。
リソース分析が完了した後、プロジェクトがリソースを適切に管理していないと、2 つの問題に直面する可能性があります。
各 ab パッケージが依存する同じバルク ファイルが、各 ab パッケージに複数回コピーされてパッケージ化されます。分析インターフェイスを分類してパッケージ化する方法についてのガイダンスを提供することを検討して、共通のバルク リソースを個別にパッケージ化することを繰り返します。リソースの冗長性を削減します。
yooasset と MotionFramework フレームワークは冗長性をうまく処理していると言われていますが、今後も研究を続ける必要があります。
https://zhuanlan.zhihu.com/p/615830582

おすすめ

転載: blog.csdn.net/qq_37619255/article/details/133304039