2012-04-05 13 views
1

Ich habe eine Basisklasse mit dem Namen GameObject, aus der andere Klassen abgeleitet werden. Ich frage mich, ob die Behandlung der Speicherallokation durch Zuordnen aller abgeleiteten Klassen von GameObjects in zusammenhängendem Speicher die Leistung verbessern wird.C++ - zusammenhängenden Speicher und Polymorphismus

Ich werde am Ende über alle von ihnen jeden Game Engine Frame iterieren.

Meine Frage ist, gibt zusammenhängende Speicher in diesem Fall mir schnellere Iterationszeiten als mallocing Speicher ohne Kontiguation? In beiden Fällen muss ich einen Vektor von Zeigern zu den Spielobjekten halten, da sie in der Größe variieren.

+2

Es wird wahrscheinlich die Leistung verbessern, zumindest ein bisschen. Denken Sie jedoch an die goldene Regel, optimieren Sie nicht vor dem Profiling. Wenn Sie denken, dass dies eine Ursache für Cache-Misses ist, können Sie den 'operator new' Ihrer Klassen immer überladen. – enobayram

+1

Die Verwendung des zusammenhängenden Speichers * könnte * die Cache-Trefferquote verbessern, so dass Ihr Code * schneller wird *. Doch bis Sie ein Profiling durchführen, bleibt es nur ein weiterer Fall einer vorzeitigen Optimierung. – dasblinkenlight

Antwort

0

Iterieren durch Objekte im kontinuierlichen Speicher funktioniert wahrscheinlich besser, weil Cache und Lokalität. Ich empfehle jedoch, dass Sie die beiden Systeme erstellen und sie tatsächlich profilieren. Viel Glück!

+0

obwohl die Objekte in der Größe variieren könnten? Würde es in der Theorie den zusätzlichen Aufwand übersteigen, der erforderlich ist, um es zusammenhängend zu halten? – KaiserJohaan

0

Ich bin mir nicht sicher, ob ich die Frage verstehe. Fragen Sie, ob es besser ist, all Ihre Objekte in einem riesigen Speicherblock vorzubelegen und die Zeiger auf Unterabschnitte davon im Speicher zu speichern? Wenn ja, tu das bitte nicht.

Anstatt schneller zu sein, ist es wahrscheinlicher, dass Sie die Vorgänge verlangsamen, da das System fortlaufenden Speicher größerer Blöcke statt nicht zusammenhängender kleinerer Blöcke anfordern muss. Denken Sie daran, Blockzuweisung, Paging, etc. Sie können 100 Megabyte zusammenhängende Speicher anfordern, aber es ist wirklich nicht zusammenhängend. Ein Haufen davon ist auf der Festplatte und alles ist sowieso in Seiten aufgeteilt.

Dann stehen Sie vor der Frage: Ordnen Sie alle Ihre GameObjects auf einmal zu, um zusammenhängende Speicher zu erhalten, oder erstellen Sie sie bei Bedarf? Möchten Sie für diese eine kleine Optimierung wirklich vorbestimmen? Was passiert, wenn Sie ein neues Objekt erstellen müssen und Ihr zusammenhängender Speicherblock nicht groß genug ist? usw.

Wirklich, ich bin nur Brainstorming potenzielle Probleme hier. Wie die anderen Kommentare sagten, ist es ein Fall von vorzeitigen Optimierung.

Jetzt wäre es sicherlich schneller, wenn Sie alle Ihre Zeiger in einem zusammenhängenden Array statt eines Vektors speichern, der basierend auf seiner aktuellen Größe wächst und kopiert, aber auch dann, wenn Sie absolut nicht wissen, wie viele Spielobjekte Sie sind besser ist es, einfach einen ausreichend großen Vektor zuzuweisen, so dass er nur ein- oder zweimal wächst.