Licht Sichtbarkeit sorgt für Lag

In meinem Objektpack ist der Abdunklungseffekt aus RufderWipfeRemake eingebaut und die Lichter aus Hazard. Nachts ist es also oft so dunkel, dass man ohne diese Lichter nichts mehr sieht.
Deswegen müssen bei großen Basen auch viele viele Lichter gebaut werden.

Dummerweise habe ich jetzt festgestellt, dass je mehr Lichter vorhanden sind, desto langsamer läuft das Spiel in der Nacht. Tagsüber wenn die Lichter aus sind, läuft alles flüssig.
Die Lichter sind Objekte, keine Partikel (weil wir ja schon festgestellt haben, dass Partikel noch viel mehr laggen, als Objekte… edit: okay, es waren Lichtpartikel, die gelaggt haben, also wären wir wieder beim lichtproblem :smiley: ).
Ich habe nun eine Möglichkeit eingebaut, alle Lichter über das Kontextmenü aus-/einzuschalten, indem die TurnOff()/TurnOn() Funktion in allen Lichtern ausgeführt wird. Diese Funktion macht nichts anderes als:
SetVisibility(VIS_None);  bzw. SetVisibility(VIS_All);.
Erstaunlicherweise löst das schon das lagging Problem. Die Lichtobjekte sind ja noch vorhanden, sie sind nur nicht mehr sichtbar.

Nun meine Frage: 
Warum lagt das Spiel, wenn die Lichter sichtbar sind, aber nicht, wenn sie unsichtbar sind?  Ich möchte das gerne verstehen, damit ich das irgendwie unterbinden kann.
Wie könnte ich das Problem lösen, ohne alle Lichter auszuschalten?  Mein erster Gedanke war, wenn sich z.b 4 Lichtobjekte in einem bestimmten Umkreis befinden, diese dann in 1 großes Lichtobjekt umzuwandeln, damit es insg. weniger Lichter sind.   Aber die Frage ist, ob das helfen würde… falls es von der erleuchteten Fläche abhängig ist, ob es lagt, würde das ja nichts bringen.

Hier noch ein Screenshot :slight_smile: Wäre sehr schade, wenn ich auf die Abdunklungs und Lichteffekte verzichten müsste.

>keine Partikel (weil wir ja schon festgestellt haben, dass Partikel noch viel mehr laggen, als Objekte).


Partikel können NICHT mehr laggen als Objekte. Aber in diesem Fall sollten sie auch nur unwesentlich schneller sein - in OC sähe die Sache wieder anders aus. :)

>Warum lagt das Spiel, wenn die Lichter sichtbar sind, aber nicht, wenn sie unsichtbar sind?


Weil in ClonkRage das additive Zeichnen von Grafiken sehr schlecht optimiert ist. Additiv bedeutet, dass die Helligkeit vom Licht auf die Helligkeit der anderen Objekte raufaddiert wird, was den "Lichteffekt" macht. Da kannst du leider nicht viel gegen tun, befürchte ich.
Vielleicht kann es aber helfen, die Lichtgrafik selbst (die Graphics.png) ein wenig kleiner zu machen und dann im Spiel mit SetObjDrawTransform wieder hochzuskalieren. Kann zwar nichts versprechen, aber es wäre mal einen Versuch wert

>Mein erster Gedanke war, wenn sich z.b 4 Lichtobjekte in einem bestimmten Umkreis befinden, diese dann in 1 großes Lichtobjekt umzuwandeln, damit es insg. weniger Lichter sind.


Es wird wahrscheinlich helfen. Wie viel es helfen wird, kann ich so nicht abschätzen
1 „Gefällt mir“

>Partikel können NICHT mehr laggen als Objekte. Aber in diesem Fall sollten sie auch nur unwesentlich schneller sein - in OC sähe die Sache wieder anders aus. :)


okay, das waren Lichtpartikel, als ich versucht habe Geckos Feuerwerk mit den Lichtpartikeln zu verschönern ^^

>Vielleicht kann es aber helfen, die Lichtgrafik selbst (die Graphics.png) ein wenig kleiner zu machen und dann im Spiel mit SetObjDrawTransform wieder hochzuskalieren. Kann zwar nichts versprechen, aber es wäre mal einen Versuch wert


Die Lichtgrafik ist bereits recht klein 128*128, ungefähr Größe eines Clonks.  Vergrößert wird sie mithilfe von SetCon(), wo auch Übergröße zugelassen wird.   Kommt das SetObjDrawTransform() schon nah, oder würde es mit SetObjDrawTransform() deutlich besser sein?  

Habe die Grafik dennoch mal auf 64*64 verkleinert. Die geänderte Grafikgröße macht da aktuell noch Probleme(Licht wird an anderer Stelle sichtbar, als es eigentlich soll), deswegen kann ich noch nicht sagen, ob das bereits eine Besserung bringt.

Ich probiers jetzt noch mit SetObjDrawTransform() und der 128*128 Grafik.

edit: Okay, zwischen SetCon() und SetObjDrawTransform() ist bei Verwendung der 128er Grafik kein Unterschied feststellbar.
bin nur irgendwie zu blöd die 64*64 Grafik an die richtige Stelle zu bekommen... Habe width, heigh, offsett und die vertices Werte halbiert.  Dennoch wird die Grafik etwas links oberhalb erzeugt.. und wenn ich es vergrößere, scheint auch der Abstand zum Objekt vergrößert zu werden... ein SetPosition hilft nicht, also ist die Grafik iwie verschoben... welchen Wert habe ich vergessen anzupassen?

>Die Lichtgrafik ist bereits recht klein 128*128, ungefähr Größe eines Clonks.


Ich dachte ein Clonk wäre 19 Pixel groß. :)

Ich könnte mir vorstellen, dass er das gesamte Clonk Spritesheet meint.

ne ich meinte schon einen Clonk. Ich ging davon aus, dass sie gleich groß sind, weil ich den Clonk im Spiel mit der Größe des unvergrößerten Lichtscheins im Spiel verglichen habe. Allerdings ist der sichtbare Schein bei meiner eingestellten Intensität nur ein Bruchteil so groß, wie die eigentliche Grafik des Lichtes, wodurch dieser Trugschluss entstand :wink:

So… ich hatte bei dem Verkleinern der Grafik vergessen die Werte in der ActMap anzupassen :wink:

Jedenfalls kann ich jetzt sagen, es macht leider keinen Unterschied, ob die Originalgrafik 128mal128 oder 64mal64 groß ist, und auch nicht, ob es mit SetCon oder SetObjDrawTransform vergrößert wird :frowning:
Wieso dachtest du denn, dass es einen Unterschied machen könnte?

Habe ich das Problem richtig verstanden, dass das Problem ist, dass die Lichter sich überlagern und das für die lags sorgt?  Das heißt wenn ich verhindere, dass Lichter sich überlagern, sollte alles problemlos laufen?
Mal überlegen, wie ich das umsetzen könnte…

>Habe ich das Problem richtig verstanden, dass das Problem ist, dass die Lichter sich überlagern und das für die lags sorgt?  Das heißt wenn ich verhindere, dass Lichter sich überlagern, sollte alles problemlos laufen?


Nein, ich denke nicht, dass das einen Unterschied macht.

>Wieso dachtest du denn, dass es einen Unterschied machen könnte?


Der Lag wird daran liegen, wie additives Rendern von Grafiken in der ClonkRage Engine implementiert ist. Ich hatte gehofft, wenn man die Grafiken kleiner macht (und deshalb dann von der Grafikkarte hochskalieren lässt), macht die CR Engine vielleicht weniger Vorverarbeitung oder wasauchimmer da passiert.
Aber war wohl ein Griff ins Klo - dann wird das Langsame an der Sache wohl immer das Starten vom additiven Rendering sein, was für jedes Licht gemacht werden muss. (In OC müsste das nur einmal für alle Partikel gemacht werden!)

bzw, du kannst ja mal versuchen alle Lichter auf 0.1% zu verkleinern und schauen was dann passiert:
```SetObjDrawTransform(1, 0, 0, 0, 1);```

PS: Ich hätte übrigens statt 64 Pixel Größe eher sowas radikales wie 16 Pixel ausprobiert. Aber scheint ja ohnehin nichts zu bringen.

>Kommt das SetObjDrawTransform() schon nah, oder würde es mit SetObjDrawTransform() deutlich besser sein?  


Der Unterschied ist, dass SetObjDrawTransform() wirklich *nur* die Grafik manipuliert. Die Objektgröße (SetCon) beeinflusst aber noch andere Dinge wie Position und sowas. Einen Unterschied für die Geschwindigkeit gibts da nicht

>Der Lag wird daran liegen, wie additives Rendern von Grafiken in der ClonkRage Engine implementiert ist. Ich hatte gehofft, wenn man die Grafiken kleiner macht (und deshalb dann von der Grafikkarte hochskalieren lässt), macht die CR Engine vielleicht weniger Vorverarbeitung oder wasauchimmer da passiert.
>Aber war wohl ein Griff ins Klo - dann wird das Langsame an der Sache wohl immer das Starten vom additiven Rendering sein, was für jedes Licht gemacht werden muss. (In OC müsste das nur einmal für alle Partikel gemacht werden!)


okay... man kann ja durch Vertices überprüfen, ob sich 2 Lichtobjekte überlagern. Mein Gedanke wäre jetzt, dass man in so einem Fall dann die Intensität oder die Sichtbarkeit eines der Lichter runterschraubt. Gibt es eine Möglichkeit, wie man nur die Intensität/Sichtbarkeit des überlagerten Teils beeinflussen kann?
Ich teste gleich mal, ob das Spiel auch so langsam wird, wenn ich viele Lichtquellen baue, aber auf genügend Abstand achte, sodass keine sich überlagert... In der Theorie sollte so das Spiel ja nicht verlangsamt werden, oder?    Oder ist es weniger ein Problem der Überlagerung von 2 Lichtobjekten, als viel mehr die Überlagerung von Lichtobjekt zu Hintergrund?
edit: sehe erst jetzt, dass du das ja schon damit beantwortet hast. also Überlagerung von lichtern ist nicht das Problem sagst du, okay..

>bzw, du kannst ja mal versuchen alle Lichter auf 0.1% zu verkleinern und schauen was dann passiert


ich vermute mal, dass es dann flüssiger läuft, aber ich teste es gleich mal
edit:  da das sichtbare Licht wie gesagt so groß ist, wie ein Clonk, ist es selbst mit 1% nicht mehr sichtbar. Aber selbst auf 100%, also 128mal128 hört das laggen schon auf und läuft flüssig.
edit2: Habe es jetzt nochmal mit der 128er Grafik probiert und sie auf nur fünffache Größe vergrößert. Damit ist sie immernoch nur ca halb so groß, wie das licht im regulären Spiel wäre.  Es läuft aber dafür auch doppelt so schnell (FPS von ca. 10 ist es, wenn ich nichts verändere, also ca 10fache Vergrößerung der Originalgrafik. FPS von 20 ist es jetzt bei fünfacher vergrößerung und FPS von 36 ist es bei 1facher Vergrößerung)

>PS: Ich hätte übrigens statt 64 Pixel Größe eher sowas radikales wie 16 Pixel ausprobiert. Aber scheint ja ohnehin nichts zu bringen.


das probiere ich danach auch, vllt war 64 ja nicht klein genug :)
edit:  okay, habs jetzt mit 16mal16 probiert und dementsprechend mit setobjdrawtransform vergrößert... leider ändert das nichts am laggen =/

Offtopic:
Da du häufig OC erwähnst, kann ich mir ein Kommentar dazu nicht verkneifen:
Ich möchte dich oder die Entwickler nicht beleidigen... aber OC scheint nicht sonderlich gut zu sein. Ich hatte mir das vor 1-2 Monaten mal installiert und mein damaliger (relativ alter, aber dennoch absolut ausreichend um Clonk Rage zu spielen) PC war nichtmal in der Lage das Tutorial vernünftig abzuspielen. Das lief auch nur in Zeitlupe. Ansonsten missfällt mir die Grafik, die Darstellung (z.b vom Wasser beim Schwimmen) und die Steuerung mit der Maus :D Aber naja, kann ja jeder seine eigene Meinung haben :)  Nur es lief jedenfalls nicht besonders flüssig.  
Wie gesagt, entschuldige wenn dich das als Verfechter von OC beleidigen sollte, das ist nicht meine Absicht. Ich kann mir ungefähr vorstellen, wieviel Arbeit da drin stecken muss und es sehr frustrierend ist, wenn es dann nicht so gut ankommt/gut läuft, wie erhofft...
...das merke ich bei meinem Projekt ja auch gerade :D es gibt so viele schöne tolle effekte usw. aber letzlich versauen sie durch das laggen nur das Spiel, weshalb man sie wahrscheinlich entfernen muss...

Vermutlich nimmt die Geschwindigkeit proportional zur Anzahl der additiv gezeichneten Pixel ab. Du kannst vermutlich lokal die Performance verbessern, indem du deine Clonk-Auflösung runtersetzt (800x600!!) oder einen stärkeren Computer verwendest. Als Objektautor kannst du da aber leider nicht mehr viel machen.

>aber OC scheint nicht sonderlich gut zu sein. Ich hatte mir das vor 1-2 Monaten mal installiert und mein damaliger (relativ alter, aber dennoch absolut ausreichend um Clonk Rage zu spielen) PC war nichtmal in der Lage das Tutorial vernünftig abzuspielen.


Dass neuere Spiele bessere Computer erfordern, ist jetzt aber auch keine Erfindung von OC.

>indem du deine Clonk-Auflösung runtersetzt


(800x600!!)

The way it's meant to be played!
1 „Gefällt mir“

Danke, das runtersetzen der Auflösung hat geholfen :)  Echt erschreckend wieviel Leistung das zieht (oderso), da mein jetziger Laptop eig extrem gut ist (glaub ich zumindest) http://www.notebooksbilliger.de/notebooks/gaming+notebooks/msi+ge60+2pci745fd
Daher wird es auf schlechteren PCs vermutlich nichtmal mit runtergesetzer Auflösung laufen…
Naja… AntiLag Regeln hab ich ja schon eingebaut… am besten sorge ich noch dafür, dass man sie auch während des Spiels fehlerfrei ein-/ und ausschalten kann, dann kann man solange es geht mit allen Effekten spielen, und sobalds zuviel wird, schaltet man es halt ab :)

>Dass neuere Spiele bessere Computer erfordern, ist jetzt aber auch keine Erfindung von OC.


Ja… ich hätte nur nicht gedacht, dass mein alter PC doch sooo schlecht war :D mein neuer Laptop jetzt hat keine Probleme mit OC und ich hab dem gerade nochmal ne Chance gegeben und es installiert. Mit normaler Geschwindigkeit macht es sogar Spaß ^^  Und wenn man sich die Tastenbelegung anguckt, kann man sich sogar die unnötigen Klicke mit der Maus sparen (z.b "interagieren") :)

CR macht da leider scheinbar recht viel mit der CPU anstatt mit der Grafikkarte, wie das bei aktuelleren Spielen und auch OC der Fall ist. Dadurch erspart es sich eine Menge an Kompatibilitätsproblemen mit älteren oder auch einfach nur schlecht unterstützten GPUs, wie sie häufig in Notebooks verbaut sind.

Bei deinem alten Computer war möglicherweise nicht einmal die verfügbare Leistung das Problem, sondern nur die schlechte OpenGL-Unterstützung der Treiber.

>>Mein erster Gedanke war, wenn sich z.b 4 Lichtobjekte in einem bestimmten Umkreis befinden, diese dann in 1 großes Lichtobjekt umzuwandeln, damit es insg. weniger Lichter sind.
>Es wird wahrscheinlich helfen. Wie viel es helfen wird, kann ich so nicht abschätzen


ich hab das jetzt auch mal getestet und alle Lichter im Screenshot ausgemacht und durch 6 große Lichter ersetzt. Immerhin hilft es ein bisschen. Es ist von 10FPS auf 20bis 29FPS gestiegen, hat stark zwischen 20 und 29 geschwankt.. also ein bisschen was bringt es. Mal schauen ob ich dazu was schreibe...

Man könnte die Lichter ja weiß machen und sie dann nicht additiv zeichnen, sondern normal.
wimni macht es bei ganz weißen Sachen visuell keinen Unterschied, ob man sie additiv oder normal zeichnet?

Ohne das additive Zeichnen bekommst du kein Lichteffekt hin. Wenn du es normal zeichnest, verdeckst du ja damit das, was hintendran ist.

Ja aber bei sprites, die ganz weiß sind macht es keinen Unterschied, ob man sie additiv oder normal zeichnet. (zumindest in gimp)

Stimmt nicht ganz. Helle Farben werden bei additivem Zeichnen schneller ganz weiss and beim Draufzeichnen einer weissen Flaeche mit Alphakanal.

Bei Helligkeit aus [0, 1] waere additives Zeichnen mit Fleck der Helligkeit alpha:

min(source + alpha, 1)

Und normales Zeichnen einer weissen Flaeche mit Alphakanal:

source + alpha - (source * alpha)

huh, ist mir nie aufgefallen! :shocked::shocked::shocked: