Einleitung
Mir ist aufgefallen, das viele Nutzer nicht wissen, auf was man beim Rendern achten sollte.
Dieses kleine Tutorial sollte eine Erläuterung sein, welche dazu dient, euch in Zukunft von falscher Anwendung zu schonen.
Vorwort
Es gibt bestimmte Sachen zu beachten, wenn man rendern möchte.
Zum Einen ist es die Abarbeitungsreihenfolge einer Rendereinheit und zum Anderen sind es Anwendungsfehler.
Abarbeitungsreihenfolge
Eine Einheit, so definiere ich das mal, ist eine fertigen Frame.
Es gibt eine Abarbeitungsreihenfolge, welche immer erneut pro Einheit abläuft.
Zuerst werden alle GTA-Positionen aktualisiert.
Danach wird für MTA ein Event namens onClientPreRender getriggert. Das könnte man z.B. als physikalische Updatefunktion verwenden, um in der Spielwert bestimmte Dinge zu richten.
Nachfolgend wird die GTA-Spielwelt und in MTA alle 3D-Linien gezeichnet.
Nachdem diese Schritte abgearbeitet wurden werden alle sichtbaren Effekte gezeichnet wie Blut oder Muzzle-Flashes.
Als nächstes wird das Event onClientHUDRender getriggert. Hier sollte man den optischen Aspekt beachten. Dies könnten man z.B. verwenden um seine Shader zu aktualisieren, da die GTA-HUD zu diesem Zeitpunkt nicht gezeichnet wurde und man sein Frame ohne HUD bekommt. Das wäre suboptimal wenn man seine HUD mit in den Shader einbezieht. (In manchen Fällen könnte jedoch das gewollt sein).
Danach wie oben bereits erwähnt wird die GTA-HUD gezeichnet.
Nachdem die HUD gezeichnet wurde wird das wohl bekannteste Event getriggert: onClientRender.
Und nach all diesen Schritten werden die MTA-Elemente gezeichnet wie Chat, GUI-Fenster und Sonstiges.
Um das vielleicht etwas verständlicher auszudrücken ein kleines Schaubild:
Redundantes zeichnen verhindern
Es kommt hin und wieder vor, das man Dinge zeichnet die sich nach gegebenen Anlass für eine gewisse Zeit nicht ändern.
Da wäre es ebenfalls suboptimal, wenn man diese ständig zeichnet. Das kann z.B. bei eigenen GUI-Klassen der Fall sein.
Hier empfehle ich auf Texturen zurückzugreifen.
Diese lassen sich ebenfalls im nachhinein skalieren oder ändern, was evtl. dein ein oder anderen netten Effekt mit sich bringt.
Die Essenz meiner Empfehlung ist, das man diese Textur, solange nichts geändert wurde, cachen kann.
Realisierungsvorschlag (sehr billiges Beispiel):
local derText = "blub"local changedFrame = truelocal cacheFrame = falseaddEventHandler("onClientResourceStart", resourceRoot, function() cacheFrame = dxCreateRenderTarget(128, 128) -- ScreenSource definierenend)addEventHandler("onClientRender", root, function() if changedFrame then dxSetRenderTarget(cacheFrame, true) dxDrawImage(0, 0, 128, 128, "files/Images/trax/speaker.png") -- irgendein Bild dxDrawText(derText, 1, 2, 3, 4) -- irgendein Text dxSetRenderTarget() changedFrame = false end dxDrawImage(0, 0, 128, 128, cacheFrame)end)addEventHandler("onClientVehicleCollision", root, function() -- irgendein Event derText = "blub " .. math.random(0, 255) -- hier wurde nun der Text geändert changedFrame = trueend)
Schlusssatz
Ich hoffe ich konnte euch damit weiterhelfen.
Bei Fragen stehe ich gerne zur Verfügung.
P.S. Dieser Thread kann erweitert werden.