Substance (el motor de Materiales de Procedimiento en Unity) utiliza dos formas de almacenamiento en caché y para administrar la memoria y el uso del disco cuando se usan materiales de procedimiento es importante entender cómo se comportan ambos.
Susbtance le permite generar texturas dinámicas (texturas que pueden obedecer a un conjunto de parámetros) a partir de una pequeña cantidad de datos. Sin embargo, para generar las texturas a partir de los datos binarios y los valores de los parámetros, Substance necesita asignar algo de memoria para almacenar mapas de bits intermedios cuando “recompone” las texturas de salida deseadas.
La cantidad de memoria que Substance permite usar durante la generación de texturas es controlada por ProceduralMaterial.cacheSize.
Una vez que se han generado las texturas de un Material de Procedimiento, y de acuerdo con el valor actual de cacheSize, el motor Substance puede mantener algunos de los resultados intermedios en memoria para acelerar los cálculos posteriores de textura si el usuario cambia el valor de uno o varios parámetros mas tarde.
Una vez hecho esto, ProceduralMaterial.ClearCache() obliga al motor Substance a liberar la memoria que mantuvo asignada, y a liberar el almacenamiento utilizado para almacenar los datos de los mapas de bits de entrada, si los hubiera.
Por lo tanto, la forma más rápida de reducir el consumo de memoria del motor Substance una vez que se han calculado las texturas es la siguiente:
procMat.cacheSize = ProceduralCacheSize.None;
procMat.ClearCache();
Esta función puede ser llamada por material, y es seguro pensar en ello como tal. Sin embargo, bajo el capó, Substance puede optimizar el espacio reutilizando partes compartidas de materiales (por ejemplo, si un patrón de noise básico es utilizado por dos materiales diferentes). Además, dependiendo del orden en que los assets se serializan durante el proceso de compilación y se cargan en tiempo de ejecución, o incluso en el rendimiento de la máquina en la que se ejecuta el juego/aplicación, la fusión de assets no es determinística. Por lo tanto, si está intentando seguir de cerca la cantidad de memoria utilizada por cada material, esta información puede ayudar a explicar si está viendo resultados impredecibles.
Para no pagar el tiempo de generación de textura cada vez que se inicia el juego/aplicación, es posible configurar el Procedural Material en el editor para utilizar un comportamiento de carga de caché.
Esta opción le da control sobre cuándo se generan las texturas por primera vez (ya sea una vez que el asset se carga por primera vez, o la primera vez que el usuario activa el cálculo de texturas a través de una llamada de script), cómo se almacenan en caché las texturas generados, Y si los datos de Substance se mantienen en la memoria para permitir la modificación y regeneración en tiempo de ejecución.
Las opciones disponibles son:
Nombre de la opción | Descripción |
---|---|
Do nothing | No genera las texturas. RebuildTextures() o RebuildTexturesImmediately() se debe llamar para generar las texturas. |
Do nothing and cache | No genere las texturas. RebuildTextures() o RebuildTexturesImmediately() se deben llamar para generar las texturas. Después de que las texturas se han generado por primera vez, se almacenan en caché en disco/flash para acelerar las nuevas partidas de juegos/aplicaciones. |
Build on level load | Genera las texturas cuando cargue para favorecer el tamaño de la aplicación (predeterminado en plataformas soportadas). |
Build on level load and cache | Genere las texturas al cargarlas y almacenarlas en caché en disco/flash para acelerar las nuevas partidas de juegos/ aplicaciones. |
Bake and keep Substance | Bake las texturas para acelerar la carga y guarde los datos del Procedural Material para que aún puedan ser modificadas y regeneradas más adelante. |
Bake and discard Substance | Bake las texturas para acelerar la carga y descarte de los datos del Procedural Material (por defecto en plataformas no soportadas). |
Cuando las texturas generadas se almacenan en caché en el dispositivo, la próxima vez que comience el inicio del juego/ aplicación, las texturas se cargan directamente desde el disco, y esto es casi tan rápido como cargar mapas de bits normales. Esto significa que no se dedica tiempo a generar texturas en absoluto, excepto por primera vez que se ejecuta la aplicación.
The cached data can be cleared using Caching.ClearCache(). This is the same cache space as is used for any download assetbundle data, so calling ClearCache
will clear cached Procedural Material data and downloaded Asset Bundle data.