2016-07-24 11 views
-1

Ich schreibe einen Ray Tracer in C#. Ich verwende eine Vector3-Klasse für meine Punkte, Normalen, Richtungen und Farben. Diese Klasse wird mehrmals pro Pixel instanziiert. Gibt es eine Möglichkeit, meinen Code so zu strukturieren, dass die riesige Menge an Garbage Collection, die ich sehe, vermieden wird?Wie optimiere ich die Objekterstellung, um eine Speicherbereinigung zu vermeiden?

+1

Es ist eine Struktur, keine Klasse, so schwer zu erraten, wie sie im GC-Heap landeten. Auch sehr schwer zu erraten, wie sie eine Gen # 0-Sammlung überleben könnten. Eine blinde Vermutung ist, dass Sie große Arrays von ihnen erstellen, sie wiederverwenden. –

+0

Solange Sie ein Handle für den Speicher haben, wird die Garbage Collection es nicht bereinigen. Warum willst du GC vermeiden? Schreibst du unsicheren Code? – noone392

+0

@Hans: OP hat wahrscheinlich seine eigene 'Vector' Klasse geschrieben. Wenn man es zu einer 'struct' macht, würde das Problem gelöst, wenn das * wirklich * das Problem ist, das er/sie hat. – Groo

Antwort

-1

Sie können das Objektpoolmuster zum Speichern und Wiederverwenden Ihrer Entitäten verwenden. Aber ich bin nicht sicher, wie groß wäre Overhead in Boxen/Unboxing (wenn Sie Werttypen verwenden)

+1

Werttypen müssen nicht gesammelt werden, daher ist es nicht sinnvoll, einen Objektpool für sie zu verwenden. Selbst wenn Sie so etwas tun wollten, würden Sie wahrscheinlich generische Sammlungen verwenden, also würde es auch kein Boxen geben. – Groo

0

Für jeden, der dies durch die Magie von Google findet. Was ich tat, war meine Vector3 class in eine Vector3 struct zu ändern. Dadurch wurde nicht nur der massive GC-Overhead beseitigt, sondern auch die Performance spürbar gesteigert.

+0

Beachten Sie, dass bei der Verwendung von Werttypen Kompromisse bestehen. Zuerst müssen Sie ihre Semantik verstehen und verstehen, wie sie sich von Referenztypen unterscheiden. Wenn Sie diese Objekte häufig verschieben, wird jedes Mal eine Kopie davon erstellt. Wenn Sie sie als Wert in einer Auflistung verwenden (zum Beispiel "List "), wird ihre Zuweisung auf dem Heap ausgeführt. –

+0

@YuvalItzchakov: Wenn OP Floats verwendet (d. H. 3 × 32 Bits oder 12 Bytes), dann ist der Unterschied zwischen dem Weiterleiten einer 64-Bit-Referenz (oder 8B, vorausgesetzt eine x64-Maschine) nicht groß. Wenn Sie auch betrachten, dass eine [minimale Objektgröße in x64 .NET ist 24B] (http://stackoverflow.com/questions/10655829/what-is-the-memory-overhead-of-a-net-object), dh das Objekt würde zweimal den Speicher + zusätzliche 64 Bits für die Referenz benötigen, dann wird das "struct" noch ansprechender. * Und * Sie ersparen der CPU das Sammeln. Wenn es sich um eine unveränderbare Struktur handelt, sollte die Semantik gleich bleiben (im Vergleich zu einer unveränderlichen Klasse). – Groo

+1

@Groo Ich wollte nicht, dass eine Struktur in diesem speziellen Fall nicht attraktiver ist. Ich habe nur daran erinnert, dass all diese glänzende ansprechende Güte hat auch Nachteile für zukünftige Referenz. Dieser Beitrag fehlt die Information, um eine formelle Aussage über die Effizienz der Verwendung von Strukturen IMO zu machen –