Nicht blockierendes Laden und Kopieren großer Texture2Ds in C # for Unity

Ich erstelle eine Unity-App für Android, mit der viele große Texturen dynamisch geladen werden können (alle Bilder sind größer als 6 MB als PNGs). Diese Texturen können entweder von einem Amazon S3-Server stammen, in diesem Fall als Stream, oder vom Gerät des Benutzers selbst.

In beiden Fällen kann ich die Rohdaten oder die Textur problemlos asynchron abrufen. In der ersten frage ich den Server ab und erhalte einen Rückruf mit dem Datenstrom, und in der zweiten verwende ich die WWW-Klasse, um die Textur unter Verwendung des "file: //" -Protokolls zu erhalten.

Das Problem tritt auf, sobald ich diese Daten in eine Texture2D-Umgebung kopieren möchte, die ich nutzen kann, z. B. auf ein privates Texture2D-Mitglied.

Mit dem Stream konvertiere ich es in ein Byte [] und versuche LoadImage () aufzurufen. Mit der WWW-Klasse kopiere ich es einfach mit myTexture = www.texture. Beide Male bekomme ich einen massiven Frame raus, wenn die Textur geladen oder kopiert wird. Ich möchte diesen Frame löschen, da die App damit einfach nicht mehr lieferbar ist.

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

eider scheint es Unity nicht zu gefallen, diese Operationen auf einem anderen Thread als dem Hauptthread auszuführen, und es gibt eine Ausnahme, wenn ich es versuch

Gibt es eine Möglichkeit, diese Vorgänge möglicherweise so aufzuteilen, dass mehrere Frames erforderlich sind? Oder machen Sie eine schnelle Memcopy-Operation, die den Haupt-Thread nicht zum Erliegen bringt?

Danke im Voraus

PS: Ich habe ein funktionierendes Beispiel für das Problem in folgendem Bericht erstellt:https: //github.com/NeoSouldier/Texture2DTest

Antworten auf die Frage(6)

Ihre Antwort auf die Frage