Unity soporta tres opciones de compresión para Asset Bundles: LZMA, LZ4 y sin comprimir.
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.
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.
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.
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.
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:
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.
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.