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 también soporta la compresión LZ4, la cual resulta en tamaños de archivo comprimidos mayores, pero no requiere que el bundle en su totalidad sea descomprimido antes de su uso. LZ4 es un algoritmo que se basa en “porciones (chunks)”, y por lo tanto cuando los objetos son cargados desde un bundle comprimido mediante LZ4, solamente las porciones (chunks) correspondientes para ese objeto son descomprimidos. Esto ocurre en la marcha (on the fly), significando que no hay tiempos de espera para que el bundle entero sea descomprimido antes de su uso. El formato LZ4 fue introducido en Unity 5.3 y no estaba disponible en versiones anteriores.
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.