Version: 5.5
Construyendo Asset Bundles
Estructura Interna de Asset Bundle

Compresión de Asset Bundles

Unity soporta tres opciones de compresión para Asset Bundles: LZMA, LZ4 y sin comprimir.

Formato LZMA

Por defecto, cuando los Asset Bundles son construidos, estos son almacenados en un formato comprimido. El formato estándar de compresión es un stream LZMA de solo archivos de datos serializados, y necesitan ser des-comprimidos en su totalidad antes de ser usados.

Los bundles comprimidos con LZMA dan el tamaño de descarga más pequeño posible, pero tiene una des-compresión relativamente lenta resultando en tiempos de carga mayores.

Formato LZ4

Unity also supports LZ4 compression, which results in larger compressed file sizes, but does not require the entire bundle to be decompressed before use. LZ4 is a “chunk-based” algorithm, and therefore when objects are loaded from an LZ4-compressed bundle, only the corresponding chunks for that object are decompressed. This occurs on-the-fly, meaning there are no wait times for the entire bundle to be decompressed before use. The LZ4 Format was introduced in Unity 5.3 and was unavailable in prior versions.

Formato sin comprimir

La tercera opción de compresión es sin comprimir en absoluto. Los bundles sin comprimir son grandes en tamaño, pero son los más rápidos para acceder una vez hayan sido descargados.

El almacenamiento en Caché de Bundles Comprimidos

The WWW.LoadFromCacheOrDownload function downloads and caches asset bundles to disk and thus greatly speeds up loading afterwards. From Unity 5.3 onwards, cached data can also be compressed with the LZ4 algorithm. This saves 40%–60% of space compared to uncompressed bundles. Recompression happens during download and thus is almost unnoticeable by the end users. As data arrives from the socket, Unity will decompress it and recompress it in LZ4 format. This recompression occurs during the download streaming, which means the cache compression begins as soon as enough of the data is downloaded, and continues incrementally until the download is complete. After that, data is read from the cached bundle by decompressing chunks on-the-fly when needed.

La compresión en caché es habilitada por defecto y es controlada por la propiedad Caching.compressionEnabled. Esta afecta los bundles almacenados en caché en disco y en memoria.

Visión general del API de la carga (load) de AssetBundles

Esta tabla proporciona una comparación de sobrecarga de memoria y rendimiento cuando se utilice diferentes tipos de compresión y diferentes métodos para cargar.

Sin comprimir Compresión por porciones (chunks-LZ4) Compresión por stream (LZMA)
WWW * Memoria: tamaño del bundle sin comprimir + (mientras que WWW no sea colocado, el tamaño del bundle es sin comprimir). Rendimiento: no hay un procesamiento extra. Memoria: tamaño del bundle comprimido por LZ4HC + (mientras WWW no sea colocado, el tamaño del bundle es uno comprimido por LZ4HC). Rendimiento: no hay un procesamiento extra. Memory: LZ4 compressed bundle size + (while WWW is not disposed, LZMA compressed bundle size). Performance: LZMA decompression + LZ4 compression during download.
LoadFromCacheOrDownload Mem: No se utiliza memoria adicional. Rendimiento: lee desde disco. Mem: No se utiliza memoria adicional. Rendimiento: lee desde disco. Mem: No se utiliza memoria adicional. Rendimiento: lee desde disco.
LoadFromMemory (Async) Mem: Tamaño del bundle sin comprimir. Rendimiento: no se necesita un procesamiento adicional. Mem: Tamaño del bundle comprimido por LZ4HC. Rendimiento: No se necesita un procesamiento adicional. Mem: LZ4 compressed bundle size. Perf: LZMA decompression + LZ4 compression.
LoadFromFile(Async) Mem: No se utiliza memoria adicional. Rendimiento: lee desde disco. Mem: No se utiliza memoria adicional. Rendimiento: lee desde disco. Mem: LZ4 compressed bundle size. Perf: reading from disk + LZMA decompression + LZ4 compression.
WebRequest (también soporta el almacenamiento en caché) Mem: Tamaño del bundle sin comprimir. Rendimiento: No hay un procesamiento adicional [+ lee del disco si está en caché]. Mem: Tamaño del bundle comprimido por LZ4HC. Rendimiento: No hay un procesamiento adicional [+ lee del disco si está en caché]. Mem: LZ4 compressed bundle size. Perf: LZMA decompression + LZ4 compression during download [+reading from disk if cached].

* When downloading a bundle using WWW, WebRequest there is also an 8x64KB accumulator buffer which stores data from a socket.

Por lo tanto, utilice los siguientes lineamientos utilizando un API para cargar de bajo nivel en sus juegos:

  1. Despliegue de asset bundles con su juego como StreamingAssets - utilice BuildAssetBundleOptions.ChunkBasedCompression cuando construya bundles y AssetBundle.LoadFromFileAsync para cargarlos. Esto le da una compresión de datos y la manera más rápida para el rendimiento de cargar con una sobre carga de memoria igual a leer buffers.
  2. Descargando asset bundles como DLCs (contenido para descargar) - utilice las opciones por defecto (compresión LZMA) y LoadFromCacheOrDownload/WebRequest para descargarlo y almacenarlo en caché. Aquí usted tendrá la mejor posible tasa de compresión y AssetBundle.LoadFromFile para un rendimiento optimo de cargar para futuras cargas.
  3. Bundles encriptados -escoja BuildAssetBundleOptions.ChunkBasedCompression y utilice LoadFromMemoryAsync para cargar (este probablemente sea el único escenario dónde LoadFromMemory[Async] debería ser utilizado).
  4. Compresión personalizada - utilice BuildAssetBundleOptions.UncompressedAssetBundle para construir y AssetBundle.LoadFromFileAsync para cargar un bundle después de que haya sido descomprimido por su algoritmo de compresión personalizado.

En general, usted debería siempre escoger funciones asincrónicas - estas no estacan el thread (hilo) principal y permiten que las operaciones de cargan sean pasadas en cola (queued) de manera más eficiente. Y absolutamente evite llamar funciones asincrónicas y sincrónicas al mismo tiempo - esto podría introducir contratiempos al thread principal.

Compatibilidad

El formato contenedor del Asset Bundle fue cambiado con el fin de soportar nuevos tipos de compresión, y para proporcionar una base para mejoras futuras. Unity 5 todavía soporta bundles creados en Unity 4, sin embargo los bundles creados en versiones previas (2.x, 3.x) no son soportados.

Construyendo Asset Bundles
Estructura Interna de Asset Bundle