El Asynchronous Texture Upload (carga asincrónica de textura) permite la carga asíncrona de Texture Data (datos de textura) desde el disco y permite la carga en lonchas de tiempo a la GPU en el hilo de Renderización. Esto reduce la espera de las cargas de GPU en el hilo principal. Async Texture Upload se usará automáticamente para todas las texturas que no sean de lectura/escritura habilitadas, por lo que para utilizar esta función no se requiere acción directa. Sin embargo, puede controlar algunos aspectos de cómo funciona la carga asincrónica, por lo que es útil cierta comprensión del proceso para poder utilizar estos controles.
Cuando el proyecto se construye, los datos de texturas de texturas que se pueden subir asincrónicamente se almacenan como archivos de recurso de streaming y son cargados asincrónicamente.
Un solo ring-buffer se re-utiliza para cargar los datos de la textura y subirla a la GPU, lo cual reduce la cantidad de asignaciones de memoria requeridas. Por ejemplo, si usted tiene 20 texturas pequeñas, Unity configurará una solicitud de carga asincrónica para esas 20 texturas en un solo paso. Si usted tiene una textura gigante, Unity solo solicitará una.
Si el tamaño del buffer no es lo suficientemente grande para las texturas solicitadas, automáticamente se re-dimensiona para acomodarse, no obstante, siempre es óptimo intentar configurar el tamaño para que encaje la textura de mayor tamaño que será subido desde el principio, para que el buffer no tenga que re-dimensionarse por cada nueva textura grande que encuentra.
El tiempo que se gasta en la subida de textura cada frame puede ser controlado, con unos valores grandes que significan que las texturas se volverán disponibles en el GPU más temprano pero con la sobre-carga de más tiempo de CPU siendo utilizado durante esos frames para otro procesamiento. Este tiempo de CPU solamente se utiliza si hay texturas que esperan en el buffer en ser cargadas al GPU.
El tamaño del buffer y el time-slice se pueden especificar a través del panel de los Quality Settings:
Nosotros proporcionamos la habilidad de controlar el valor del Buffer Size y Time-Slice desde script.
Mirar la referencia de Script: QualitySettings.asyncUploadTimeSlice.
Configura el Time-Slice en mili-segundos del tiempo de CPU gastado en las Subidas Asincrónicas de Texturas por frame. Dependiendo en el plataforma objetivo y el API, usted podría configurar esto. El tiempo solo se gasta en la llamada a la función si hay texturas para subir, de lo contrario se sale temprano.
Mirar la referencia de Script: QualitySettings.asyncUploadBufferSize
Configura el Ring Buffer Size para las Subidas Asincrónicas de Texturas. El tamaño está en mega-bytes. Asegura que usted configure un tamaño razonable dependiendo en la plataforma destino. También por favor asegure que siempre será posible cargar cualquier textura gigante en su juego. Por ejemplo, si usted tiene un Cubemap de tamaño 22MB y si usted configura el tamaño del RingBuffer a 16MB, la App automáticamente re-dimensiona el RingBuffer a 22MB mientras carga la escena.
Para texturas no habilitadas para escritura/lecturas, el TextureData es parte de resS (Recurso Streaming) y la subida ahora ocurre en el Render-Thread. La disponibilidad de la textura se garantiza durante la llamada a AwakeFromLoad justo como antes, por lo que no hay cambios en términos del orden de carga o la disponibilidad de texturas en el Rendering.
Para otros tipos de carga de texturas, como texturas habilitadas para escritura/lectura, las texturas se cargan directamente con la función LoadImage(byte[] data), o cargando desde la carpeta Resources, la carga al buffer asincrónico no se utiliza - el método Sincrónico viejo se utiliza.