Skripting-Tutorial: Techniken #2 - Das richtige Rendern

  • 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:

    Externer Inhalt dl.dropboxusercontent.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    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):

    Lua
    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.

    ~ Signatur in Bearbeitung ~

    2 Mal editiert, zuletzt von Krischkros (9. Mai 2013 um 13:06)

  • Dieses Thema enthält 2 weitere Beiträge, die nur für registrierte Benutzer sichtbar sind, bitte registrieren Sie sich oder melden Sie sich an um diese lesen zu können.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!