Comprensión de la dependencia de Unity3d AssetBundle

Método de empaquetado AssetBundle (paquete AB para abreviar):

[@MenuItem("AB/Build AB")]
        public static void BuildAB()
        {
    
    
            BuildPipeline.BuildAssetBundles(Application.dataPath, BuildAssetBundleOptions.UncompressedAssetBundle,
                BuildTarget.StandaloneWindows64);
        }

Tres métodos de compresión de AssetBundle:

  1. LZMA (un archivo de secuencia serializado): formato de compresión predeterminado U3D, debe descomprimirse antes de su uso, relación de compresión alta pero lleva tiempo
  2. LZ4: la relación de compresión es promedio pero el tiempo de descompresión es rápido, la opción es ChunckBasedCompression
  3. Sin comprimir: más rápido, la opción es UncompressdAssetBundle (compresión propia)

Comprensión popular de la dependencia: cuando los recursos en un paquete AB paquete1 se refieren a los recursos en otro paquete AB paquete2, decimos que el paquete1 depende del paquete2, es decir, si no hay paquete2, el paquete1 cometerá un error.

Por qué necesita comprender las dependencias:

  1. Al desarrollar con paquetes AB, si un paquete depende de otros paquetes, los paquetes dependientes deben cargarse primero antes de que los recursos del paquete se puedan cargar normalmente. Si las dependencias son confusas, fácilmente puede provocar pérdidas de material y otros fenómenos.
  2. Si hay varios paquetes AB

Caso de prueba:

  1. Comparación del paquete AB que hace referencia a recursos no empaquetados y que hace referencia a recursos empaquetados:
    Insertar descripción de la imagen aquí
  2. Comparación de múltiples referencias a recursos no empaquetados y referencias a recursos empaquetados:
    Insertar descripción de la imagen aquí

La lógica de Unity para determinar si se debe generar una copia:

foreach(包名)
{
    
    
    //-----对所有包进行遍历-----
    name:packageNameAB
    foreach(packageNameAB下所有资源的路径assetPath)
    {
    
    
        checkNonBundleNameDpendencies:
        //-----对包下所有资源进行遍历-----
        foreach(assetPath对应的资源所依赖的资源路径dependencyPath)
        {
    
    
            //-----对依赖路径下所有的依赖对象进行判断-----
            if(依赖路径下资源没有设置打包AB)
            {
    
    
                copy一份该资源入当前packageNameAB
                goto checkNonBundleNameDpendencies 再对这一个资源进行相同的遍历处理
            }
        }
    }
}

Conclusión: en general, siempre que se haga referencia directa al recurso en el paquete AB (para determinar si se hace referencia directamente, puede abrir el recurso en modo texto para ver si hay un GUID del recurso al que se hace referencia) y el recurso no empaquetado se agregará a este paquete una copia, y si el recurso al que se hace referencia está empaquetado AB, entonces este problema no existe.

Supongo que te gusta

Origin blog.csdn.net/qq_37421018/article/details/106103579
Recomendado
Clasificación