Seite 1 von 1

Automatisiert oder Kontrolliert?

Verfasst: 23.08.2011, 23:49
von Zudomon
Ich überlege gerade, was im Endeffekt besser ist. Bisher habe ich immer versucht, alles so weit wie möglich zu automatisieren.

Ein aktueller Fall: Man bestimmt die Vertexdeklaration. Nachdem man fertig ist könnte man entweder direkt sagen, kompiliere die Deklaration, oder man könnte abwarten, bis diese wirklich gebraucht wird un die dann kompilieren.
Den Vorteil beim automatisieren sehe ich darin, dass man sich um weniger kümmern muss, was es einfacher macht. Außerdem wirds erst erstellt, wenn es auch angewendet wird. Wird es nie angewendet, wirds auch nie erstellt. Der Nachteil ist allerdings, dass es zu einem Lag kommt ( gut, bei ner Deklaration nicht, aber bei Shader Kompilierung oder bei Texturen bzw. Objekte auf jeden Fall ). Außer man würde vielleicht dann im Hintergrund kompilieren und erst wenns fertig ist, anzeigen. Dadurch kommt es natürlich zu einem Darstellungsverzug. Bei Objekte, die nachträglich in der Szene erscheinen schon nicht so schön.

Was ist eurer Meinung nach besser, effektiver, sinnvoller?

Re: Automatisiert oder Kontrolliert?

Verfasst: 24.08.2011, 00:23
von Schrompf
Das Prinzip nennt sich Lazy Evaluation. Ich habe es früher sehr gern benutzt, aber je mehr ich Abstand gewinne, desto schlechter erscheint es mir. Ich würde es mal so beschreiben:

a) Du *musst* es anwenden. Z.B. weil Du 2GB Texturen hast, aber nur 500MB davon realistischerweise gleichzeitig unterbringen kannst. In dem Fall führt kein Weg dran vorbei.
b) Du könntest es anwenden, um etwas Rechenzeit bis zur ersten Benutzung zu verschieben.

Nur b) lohnt überhaupt die Diskussion. Und da würde ich in quasi allen Fallen davon abraten. Die Rechenzeit für die Erstellung der Resource ist immer dieselbe. Dafür holt man sich bei jedem Zugriff noch einen Test rein, ob die Resource schon erstellt ist. Man verliert die const correctness. Und man bekommt potentiell einen Haufen Ärger in einer Multithreading-Umgebung. Ich würde solche verzögerten Arbeiten also nur einbauen, wenn ich dadurch sehr viel sparen könnte.

Re: Automatisiert oder Kontrolliert?

Verfasst: 24.08.2011, 00:57
von kaiserludi
Schrompf hat geschrieben:Das Prinzip nennt sich Lazy Evaluation. Ich habe es früher sehr gern benutzt, aber je mehr ich Abstand gewinne, desto schlechter erscheint es mir. Ich würde es mal so beschreiben:

a) Du *musst* es anwenden. Z.B. weil Du 2GB Texturen hast, aber nur 500MB davon realistischerweise gleichzeitig unterbringen kannst. In dem Fall führt kein Weg dran vorbei.
b) Du könntest es anwenden, um etwas Rechenzeit bis zur ersten Benutzung zu verschieben.

Nur b) lohnt überhaupt die Diskussion. Und da würde ich in quasi allen Fallen davon abraten. Die Rechenzeit für die Erstellung der Resource ist immer dieselbe. Dafür holt man sich bei jedem Zugriff noch einen Test rein, ob die Resource schon erstellt ist. Man verliert die const correctness. Und man bekommt potentiell einen Haufen Ärger in einer Multithreading-Umgebung. Ich würde solche verzögerten Arbeiten also nur einbauen, wenn ich dadurch sehr viel sparen könnte.
c) man möchte es anwenden, weil viele Texturen nur unter bestimmten Bedingungen je benutzt werden, so dass der Test billig ist im Vergleich zu dem Preis, den man für die Texturen zahlt, die man ohne ihn lädt, aber mit ihm nie geladen hätte. Da gilt es dann eben, abzuwegen, wie wahrscheinlich man eine Ressource braucht und wie teuer es ist, sie zu erstellen und wie viel Ärger man sich potentiell damit einhandelt.

Re: Automatisiert oder Kontrolliert?

Verfasst: 24.08.2011, 03:20
von Schrompf
Das stimmt, gerade Texturen sind bisweilen sehr regional begrenzt in ihrer Verwendung. Wenn der Spieler da nicht hinkommt, hat man sie umsonst geladen. Aber man braucht doch erstaunlich viel Daten - auch Texturen - bereits ab Start. Daher überlege ich z.B. gerade, bei den Splitterwelten wieder ein Precaching einzubauen, um die ersten 20s keine aufploppenden Objekte und Texturen betrachten zu müssen. Abwägungssache.

Re: Automatisiert oder Kontrolliert?

Verfasst: 24.08.2011, 05:17
von Krishty
Direct3D führt sowieso eine Lazy Evaluation für dich durch. Darum müssen auch viele Spiele einen oder mehrere Cache-Durchheiz-Frames zeichnen – erst dann werden nämlich die Shader und Vertex-Deklarationen tatsächlich kompiliert. Täte man das nicht, hätte man scheinbar wahlloses Geruckel, sobald ein Shader zum ersten Mal benutzt wird (heute sind die Shader ja komplex und der HLSL-Compiler immernoch Müll). Modern Warfare fällt mir in diesem Zusammenhang ein; ich weiß aber nicht mehr, was genau da vorfiel.

Gruß, Ky