Carregamento e cópia sem bloqueio de grandes Texture2Ds em C # para Unity

Estou criando um aplicativo Unity para Android que lida com o carregamento de muitas texturas grandes dinamicamente (todas as imagens têm mais de 6 MB de tamanho como png). Essas texturas podem vir de um servidor Amazon S3, caso em que chegam como um fluxo ou do próprio dispositivo do usuário.

Nos dois casos, sou capaz de acessar os dados brutos ou a textura de forma assíncrona, sem problemas. Na primeira consulta o servidor e recebo um retorno de chamada com o fluxo de dados, e na segunda utilizo a classe WWW para obter a textura usando o protocolo "file: //".

O problema ocorre assim que eu quero copiar esses dados em um Texture2D para algum lugar que eu possa usar, como em um membro privado do Texture2D.

Com o fluxo, eu o converto em um byte [] e tento chamar LoadImage () e, com a classe WWW, simplesmente tento copiá-lo com myTexture = www.texture. Nas duas vezes, obtenho um quadro enorme à medida que a textura é carregada ou copiada. Eu quero erradicar esse quadro porque o aplicativo é simplesmente impossível de transportar.

using (var stream = responseStream)
{
   byte[] myBinary = ToByteArray(stream);
   m_myTexture.LoadImage(myBinary);  // Commenting this line removes frame out
}

...

WWW www = new WWW("file://" + filePath);
yield return www;
m_myTexture = www.texture;  // Commenting this line removes frame out

Infelizmente, o Unity não parece gostar de executar essas operações em um thread separado do thread principal e lança uma exceção quando tento.

Existe alguma maneira de, talvez, agrupar essas operações para que ele leve vários quadros? Ou algum tipo de operação rápida de memcopy que não paralisa o thread principal?

Desde já, obrigado!

PS: Criei um exemplo de trabalho do problema no seguinte repositório:https://github.com/NeoSouldier/Texture2DTest/

questionAnswers(3)

yourAnswerToTheQuestion