Ich habe eine byte[]
von Farben, die ich auf Texture2D
Objekt über SetPixels(Color32[])
übertragen muss. Ich möchte wissen, was der schnellste Weg ist, um die Color32[]
von byte[]
zu erstellen. Da jeder Color32
4 Bytes (1 Byte pro Kanal) ist, würde es ein Viertel der Anzahl der Elemente geben.C# (Unity) Schnellkopie zwischen verschiedenen verwalteten Array-Typen
Array.CopyTo
lässt keine anderen Objekt-Array-Typen zu.
Von dem, was ich gelesen habe, scheint es, als ob verwalteter Code die byte[]
nicht als Color32[]
uminterpretieren und die Kopie insgesamt überspringen kann.
Die Rückseite dieses (Color32[]
->byte[]
) has a SO solution über Marshalling, aber es scheint eine Tonne kopieren beteiligt.
private static byte[] Color32ArrayToByteArray(Color32[] colors)
{
int length = 4 * colors.Length;
byte[] bytes = new byte[length];
IntPtr ptr = Marshal.AllocHGlobal(length); // unmanaged memory alloc
Marshal.StructureToPtr(colors, ptr, true); // memcpy 1
Marshal.Copy(ptr, bytes, 0, length); // memcpy 2
Marshal.FreeHGlobal(ptr);
return bytes;
}
Für meinen Fall, ich verwende:
int length = bytes.Length;
IntPtr ptr = Marshal.AllocHGlobal(length); // unmanaged mem alloc
Marshal.Copy(bytes, 0, ptr, length); // memcpy 1
Marshal.PtrToStructure(ptr, colors); // memcpy 2
Marshal.FreeHGlobal(ptr);
aber ich sehe nicht die Textur Aktualisierung nach myTexture.SetPixels(colors)
tun. Ich versuche immer noch herauszufinden warum.
Unabhängig davon, muss ich 2 Mem-Kopien tun, um dies in C# zu erreichen? Scheint so eine Verschwendung. Ich sah Gewerkschaften in C# um die Kopien zu umgehen.
Mögliches Duplikat von [Schnelle Kopie von Color32 \ [\] Array zu Byte \ [\] Array] (http: // stackoverflow.com/questions/21512259/fast-copy-of-color32-array-to-byte-array) – NineBerry
Ich habe explizit auf diese Frage in meiner Beschreibung oben verwiesen. Der Link gibt eine mögliche Lösung (die in meinem Fall nicht funktioniert) und wichtiger ist, es ist eine Frage, ob 2 Kopien vermieden werden können. – Raja
Warum können Sie LoadRawTextureData() des Texture2D-Objekts nicht verwenden? Die Dokumentation besagt, dass nach dem Ändern der Textur Apply() aufgerufen wird, damit die Änderungen tatsächlich auf die Grafikkarte hochgeladen werden. – NineBerry