Unity Game FrameWork—Aprendizaje del marco—Análisis del proceso de empaquetado Ab

Actualización y gestión de recursos UGF
https://www.jianshu.com/p/80bff8c9004a

Configuración del paquete

El archivo ResourceBuilder.xml guarda los
[imagen]
parámetros de información de configuración del paquete:
InternalResourceVersion: número de versión interna
Plataformas: el número de plataforma correspondiente al recurso ab generado, desplazamiento binario a la izquierda y operación AND o no operación para obtener
AssetBundleCompression: etiqueta de formato de compresión, sin compresión, compresión LZ4 , compresión LZMA
CompressionHelperTypeName: nombre del tipo de ayuda de compresión y descompresión
AdditionalCompressionSelected: si se debe realizar la recompresión para reducir la sobrecarga de transmisión
ForceRebuildAssetBundleSelected: si se debe forzar la reconstrucción de AssetBundle
BuildEventHandlerTypeName: nombre del tipo de clase de evento relacionado para construir ab
OutputDirectory: carpeta de salida ab, otros directorios de salida son derivado de este directorio
OutputPackageSelected: si se generan recursos del paquete
OutputFullSelected: si se generan recursos completos
OutputPackedSelected: si se generan recursos empaquetados
Explicación de cada directorio:
Working: el directorio de trabajo cuando Unity genera AssetBundle.
Paquete: el directorio donde se encuentran los archivos generados para el modo independiente. Si el juego es un juego independiente, una vez completada la generación, copie los archivos correspondientes a la plataforma en este directorio a StreamingAssets y luego cree la aplicación.
Lleno:El directorio donde se encuentra el paquete de archivos completo generado para el modo actualizable. Si el juego es un juego en línea, una vez completada la generación, este directorio debe cargarse en el servidor de recursos para que los jugadores lo descarguen.
Empaquetado: El directorio donde se encuentran los archivos generados en el modo actualizable. Si el juego es un juego en línea, una vez completada la generación, copie los archivos correspondientes a la plataforma en este directorio a StreamingAssets y luego cree la aplicación. La generación de un AssetBundle en la ruta empaquetada de salida depende de si el AssetBundle está marcado como empaquetado en la herramienta de edición de AssetBundle. (Los recursos publicados con la aplicación se almacenan en este directorio)
BuildReport: los archivos del paquete AB y del paquete no AB se abstraen uniformemente en archivos de recursos en GF, y el sufijo del archivo es .dat. En nuestra lista de recursos, los registros son It es la información de recursos de estos archivos de recursos .dat. La información incluye el nombre de estos archivos de recursos, código hash, longitud, código zipHash, longitud del zip, si es un paquete AB, configuración de carga y otra información.

Proceso de embalaje

La ejecución del proceso empaquetado comienza presionando el botón Iniciar compilación de recursos
[imagen]
. Busque el script ResourceBuilder. Cuando se hace clic en el botón y el valor de la variable de tipo bool m_OrderBuildResources cambia a verdadero, el método BuildResources()
private void Update()
{ if (m_OrderBuildResources ) { m_OrderBuildResources = falso; BuildResources(); } }





Relación de clase
La relación de creación de la clase es la siguiente
ResourceBuilder: Generador de recursos (entrada)
ResourceBuilderController: Controlador de construcción de recursos
ResourceAnalyzerController: Controlador de análisis de recursos
ResourceCollection: Colección de recursos
Recurso: Información de recursos contenida en el paquete ab
Activo: Información del archivo de recursos
// Generador de recursos ( Entrada)
ResourceBuilder: EditorWindow
{ private ResourceBuilderController m_Controller = null; } // Controlador de construcción de recursos ResourceBuilderController { El número de archivos de recursos contenidos en el paquete ab 127 private readonly ResourceCollection m_ResourceCollection; private readonly ResourceAnalyzerController m_ResourceAnalyzerController; //Ruta completa del recurso ab - paquete ab información Pares clave-valor, número de paquetes ab 116 privado de solo lectura SortedDictionary<cadena, ResourceData> m_ResourceDatas; }











// Controlador de análisis de recursos
ResourceAnalyzerController
{ private readonly ResourceCollection m_ResourceCollection; // Los recursos de los que depende cada archivo de recursos private readonly Dictionary<string, DependencyData> m_DependencyDatas; // Cada recurso dependiente (a) corresponde al recurso que depende de él La lista formado por recursos (b, c), (b, c) pertenece a los recursos en el paquete ab private readonly Dictionary<string, List> m_ScatteredAssets; // Una lista de todas las dependencias después de que los recursos ab y los recursos dispersos se integren private readonly List < string[]> m_CircularDependencyDatas; // Lista de recursos de dependencia (ab + dispersos), colección desordenada, búsqueda rápida, sin duplicación HashSet privado de solo lectura m_AnalyzedStamps; } // Colección de recursos ResourceCollection { //ab ruta-ab recurso Información de recurso valor clave Derecha (116) SortedDictionary privado de solo lectura<cadena, Recurso> m_Resources; //par clave-valor guid-Assets (127)
















private readonly SortedDictionary<string, Asset> m_Assets;
}
//La información de recursos contenida en el paquete ab
Resource
{ private readonly List m_Assets;//Los archivos de recursos contenidos en el paquete ab private readonly List m_ResourceGroups;//El grupo de recursos al que pertenece a la cadena pública Nombre //ab Nombre del paquete cadena pública Variante //Nombre de la variante cadena pública Nombre completo //Nombre completo, incluida la ruta public AssetType AssetType //Tipo de recurso, recurso o escena public bool IsLoadFromBinary //Si se carga desde un archivo binario cadena pública FileSystem public LoadType LoadType // Tipo de método de carga de recursos public bool Packed // Si es el recurso del paquete principal } // Información del archivo de recursos Activo : IComparable { cadena pública Guid;// Archivo de recursos guid cadena pública Nombre;// Recurso nombre de archivo recurso público recurso;//paquete Ab al que pertenece

















}
//Información de datos de dependencia
public selled class DependencyData
{ //El paquete ab del que depende private List m_DependencyResources; //Los archivos en el paquete ab del que depende private List m_DependencyAssets; //Los nombres de archivos dispersos de los que depende private List m_ScatteredDependencyAssetNames ; } //Información de dependencia //Cada archivo de recursos puede tener múltiples archivos dependientes. El archivo de recursos en el paquete ab tiene tantas dependencias como estructuras. struct Stamp { cadena privada de solo lectura m_HostAssetName;//Nombre del archivo de recursos cadena privada de solo lectura m_DependencyAssetName ;// Nombre del archivo de recursos dependiente } La entrada es el método ResourceBuilderController.BuildResources(). El proceso principal es el siguiente: 1. Crear un sistema de archivos y generar carpetas de recursos ab para cada modo. 2. Establecer opciones de generación de recursos ab BuildAssetBundleOptions buildAssetBundleOptions = GetBuildAssetBundleOptions ();



















3. Recopile información de recursos
m_ResourceCollection.Load()
lee el archivo xml de información de recursos (Assets/GameMain/Configs/ResourceCollection.xml)
y obtiene la información de recursos que debe empaquetarse del archivo ResourceCollection.xml y la completa en m_Resources y m_Assets de la clase ResourceCollection.La clase ResourceCollection se compone de la creación de ResourceBuilderController
4. Analizar los recursos dependientes
Analizar
m_ResourceAnalyzerController.Analyze();
La clase ResourceAnalyzerController es creada por ResourceBuilderController. Los datos de recursos m_ResourceCollection de ResourceAnalyzerController provienen de ResourceBuilderController.
Este paso completa principalmente la información de atributos de ResourceAnalyzerController m_DependencyDatas
[imagen]Insertar descripción de la imagen aquí
List<string[]> m_CircularDependencyDatas= new List<string[]>();
m_CircularDependencyDatas[0]=new string[]{a,b,d,c,b}
m_CircularDependencyDatas [1 ]=nueva cadena[]{b,d,c,b}
m_CircularDependencyDatas[2]=nueva cadena[]{c,b,d,c}
m_CircularDependencyDatas[3]=nueva cadena[]{e,f,h,e}
m_CircularDependencyDatas[4]=nueva cadena[]{f,h,e,f}
m_CircularDependencyDatas[5]=nueva cadena[]{h,e, f, h}
Si solo a y e están en el paquete ab, entonces también se contarán todos los demás dependientes b, c, d, f, h, k. 5. Prepárese para construir los datos
del recurso ab
PrepareBuildData (fuera de activeBundleBuildDatas, out activeBundleResourceDatas, out binarioResourceDatas)
Tenga en cuenta que solo activeBundleBuildDatas son los datos requeridos por el editor para exportar AssetsBundle. Los datos se obtienen de ResourceBuilderController.m_ResourceCollection y no dependen directamente del análisis de recursos en el paso anterior. Los datos generados al analizar los recursos se muestra en el panel de análisis de forma más intuitiva. En otras palabras, los resultados del análisis no procesan recursos. Este paso puede

6. Generar recursos para la plataforma seleccionada
BuildResources (Platform.Windows, activeBundleBuildDatas, buildAssetBundleOptions, activeBundleResourceDatas, binarioResourceDatas);
la creación de recursos se divide en tres pasos
. 1. Generar archivos de recursos y archivos de lista de recursos (es decir, archivos con el nombre de la ruta de generación). , Windows y Windows.manifest)
AssetBundleManifest activeBundleManifest = BuildPipeline.BuildAssetBundles(workingPath, activeBundleBuildDatas, buildAssetBundleOptions, GetBuildTarget(plataforma));
utilice los datos de activeBundleBuildDatas para generar recursos ab, en el directorio de trabajo
[imagen]
2. Genere el paquete ab cifrado y el byte stream Las funciones clave del código de verificación
son las siguientes, busque
ProcessAssetBundle(platform,workingPath,outputPackagePath,outputFullPath,outputPackedPath,AdditionalCompressionSelected, activeBundleResourceDatas[i].Name, activeBundleResourceDatas[i].Variant, activeBundleResourceDatas[i].FileSystem) usted mismo )
ProcessOutput(plataforma, salidaPackagePath, salidaFullPath, salidaPackedPath, adicionalCompressionSelected, nombre, variante, sistema de archivos, datos de recursos, bytes, longitud, código hash, longitud comprimida, códigoHash comprimido) 3. Genere los archivos de lista cifrados en cada plataforma ProcessPackageVersionList(outputPackagePath, plataforma); ProcessReadOnlyVersionList
(
outputPackedPath
) , plataforma);

carga de recursos ab

DefaultLoadResourceAgentHelper
///
/// Inicia la lectura asincrónica de archivos de recursos cargando el asistente del agente de recursos.
///
/// La ruta completa del recurso que se va a cargar.
anulación pública void ReadFile(string fullPath)
{ if (m_LoadResourceAgentHelperReadFileCompleteEventHandler == null || m_LoadResourceAgentHelperUpdateEventHandler == null || m_LoadResourceAgentHelperErrorEventHandler == null) { Log.Fatal("El controlador auxiliar del agente de recursos de carga no es válido."); return; }




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

análisis de construcción ab

Después de estudiar el código fuente, me beneficié mucho. El análisis de los recursos en la construcción ab es muy completo. Las actualizaciones de recursos utilizan actualizaciones incrementales. Los desarrolladores no necesitan prestar atención al contenido que se ha actualizado. Los registros del contenido de los recursos se empaquetan por separado. , que es muy amigable.
Una vez completado el análisis de recursos, podemos enfrentar dos problemas si el proyecto no gestiona bien los recursos.
El mismo archivo masivo del que depende cada paquete ab se copiará y empaquetará en cada paquete ab varias veces. ¿Es posible considerar brindar orientación sobre cómo clasificar y empaquetar la interfaz de análisis y repetir los recursos masivos comunes que se empaquetarán por separado para reducir la redundancia de recursos.
Se dice que los marcos yooasset y MotionFramework manejan muy bien la redundancia. Necesitamos continuar estudiando e investigando, aquí están los enlaces.
https://zhuanlan.zhihu.com/p/615830582

Supongo que te gusta

Origin blog.csdn.net/qq_37619255/article/details/133304039
Recomendado
Clasificación