2015-12-24 28 views
6

Ho una lista e voglio assegnare la sua matrice a una proprietà.Ottieni array dalla lista senza allocazione heap

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

Ora i problemi:

  • Il progetto è un gioco ed è molto dura per la raccolta dei rifiuti in modo da l'implementazione predefinita di ToArray() non è un'opzione in quanto crea un nuovo array accanto array interno di lista .
  • L'oggetto mesh proviene da un'API closed source e la proprietà vertici è una Vector3 [] quindi non è possibile assegnarvi un puntatore.

Ho qualche opzione per impedire l'allocazione dell'heap?

EDIT: Questo non è un duplicato

Impossibile utilizzare IList<Vector3>. La mesh proviene da un'API closed source e necessita di Vector3 [], quindi non posso assegnare a questo l'IList<Vector3>.

+3

Possibile duplicato di [Lista a T \ [\] senza copiare] (http://stackoverflow.com/questions/4972951/listt-to-t-withoutcopying) –

+1

@VadimMartynov Questa è un'altra domanda. La mesh proviene da un'API closed source e necessita di Vector3 [], quindi non posso assegnare ad esso IList . –

+0

se l'oggetto dimensione è stato risolto, non disporre l'oggetto. Invece basta contrassegnare l'oggetto non utilizzato. Crea una matrice fissa di oggetti all'inizio del programma. Quindi contrassegna l'oggetto utilizzato o inutilizzato invece di creare e smaltire l'oggetto. Non è richiesta la raccolta dei rifiuti. – jdweng

risposta

2

Penso che tu stia usando Unity. Se ho ragione, prova con mesh.SetVertices(list) che accetta uno List<Vector3>.

+0

Sì, funziona. Sono anche curioso di trovare una soluzione generale al problema. –

+1

Penso che non sia possibile, perché l'array interno di List potrebbe essere più grande del suo Conteggio. Se si utilizza frequentemente un numero specifico di vertici come 64 vertici, è possibile provare a riutilizzare questo array per impedire un'ulteriore allocazione dell'heap. –

+0

Setvertices funziona perfettamente con l'assegnazione zero del GC. Quindi il mio problema è essenzialmente risolto in questa faccenda e I + 1ed la tua risposta. La domanda è valida anche come problema generale C#. Cosa succede se affrontiamo la situazione in API diverse dall'unità? –