2015-12-24 7 views
6

Ich habe eine Liste, und ich möchte ihr Array einer Eigenschaft zuweisen. JetztGet Array aus Liste ohne Heap-Zuweisung

public void BuildMesh(List<Vector3> list){ 
    mesh.vertices=list.ToArray(); 
} 

die Probleme:

  • Das Projekt Spiel und ist sehr hart für die Garbage Collection, so dass die Standardimplementierung von ToArray() ist keine Option, da es ein neues Array neben Liste der internen Arrays erstellt .
  • Das Mesh-Objekt stammt von einer API mit geschlossener Quelle und die Vertices-Eigenschaft ist ein Vector3 [], daher kann ihm kein Zeiger zugewiesen werden.

Kann ich die Heap-Zuweisung verhindern?

EDIT: Dies ist kein Duplikat

nicht IList<Vector3> verwenden können. Das Mesh stammt von einer API mit geschlossener Quelle und benötigt Vector3 [], so dass ich ihm IList<Vector3> nicht zuweisen kann.

+3

Mögliches Duplikat von [Liste zu T \ [\] ohne zu kopieren] (http://stackoverflow.com/questions/4972951/listt-to-t-without-copying) –

+1

@VadimMartynov Dies ist eine andere Frage. Das Mesh stammt aus einer Closed-Source-API und benötigt Vector3 [], so dass ich IList nicht zuweisen kann. –

+0

Wenn Sie ein Objekt fester Größe haben, entsorgen Sie das Objekt einfach nicht. Markieren Sie stattdessen das Objekt einfach unbenutzt. Erstellen Sie zu Beginn des Programms ein festes Array von Objekten. Markieren Sie dann das verwendete oder nicht verwendete Objekt, anstatt das Objekt zu erstellen und zu entfernen. Keine Speicherbereinigung erforderlich. – jdweng

Antwort

2

Ich denke, Sie verwenden Unity. Wenn ich recht habe, versuchen Sie mesh.SetVertices(list), die eine List<Vector3> akzeptieren.

+0

Ja, es funktioniert. Ich bin auch neugierig, eine allgemeine Lösung für das Problem zu finden. –

+1

Ich denke, das ist nicht möglich, weil das innere Array der Liste größer als sein Count sein könnte. Wenn eine bestimmte Anzahl von Scheitelpunkten häufig wie 64 Scheitelpunkte verwendet wird, können Sie versuchen, dieses Array wiederzuverwenden, um eine weitere Heap-Zuweisung zu verhindern. –

+0

Der Setvertices funktioniert perfekt mit Null GC-Zuweisung. Damit ist mein Problem im wesentlichen gelöst und ich habe Ihre Antwort erhalten. Die Frage gilt auch als allgemeines C# -Problem. Was ist, wenn wir die Situation in API anders als Einheit sehen? –