Not logged inClonkspot Forum
Forum Home Help Search Register Login
Up Topic Deutsch / Hilfestellung / Licht Sichtbarkeit sorgt für Lag
- - By Serpens66 (More than 200 posts.) Date 08.02.2015 14:41 Edited 08.02.2015 14:57 Upvotes 1
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 :D ).
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 :) Wäre sehr schade, wenn ich auf die Abdunklungs und Lichteffekte verzichten müsste.
Parent - - By Zapper (More than 500 posts.) Date 08.02.2015 14:55

>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
Parent - - By Serpens66 (More than 200 posts.) Date 08.02.2015 15:47 Edited 08.02.2015 16:02

>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?
Parent - - By Pyrit (More than 200 posts.) Date 08.02.2015 16:06

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


Ich dachte ein Clonk wäre 19 Pixel groß. :)
Parent - - By Pitri (More than 200 posts.) Date 08.02.2015 16:16
Ich könnte mir vorstellen, dass er das gesamte Clonk Spritesheet meint.
Parent - By Serpens66 (More than 200 posts.) Date 08.02.2015 16:34
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 ;)
Parent - - By Serpens66 (More than 200 posts.) Date 08.02.2015 17:09
So.. ich hatte bei dem Verkleinern der Grafik vergessen die Werte in der ActMap anzupassen ;)

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 :(
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....
Parent - - By Zapper (More than 500 posts.) Date 08.02.2015 18:57 Edited 08.02.2015 18:59

>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.
Parent - - By Serpens66 (More than 200 posts.) Date 08.02.2015 19:56 Edited 08.02.2015 21:01

>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...
Parent - - By Luchs (More than 1000 posts.) Date 08.02.2015 21:17
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.
Parent - By Pyrit (More than 200 posts.) Date 08.02.2015 21:40

>indem du deine Clonk-Auflösung runtersetzt


(800x600!!)

The way it's meant to be played!
Parent - - By Serpens66 (More than 200 posts.) Date 08.02.2015 22:42
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") :)
Parent - By Luchs (More than 1000 posts.) Date 09.02.2015 11:34
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.
Parent - By Zapper (More than 500 posts.) Date 08.02.2015 18:59

>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
Parent - By Serpens66 (More than 200 posts.) Date 09.02.2015 12:57

>>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...
Parent - - By Pyrit (More than 200 posts.) Date 09.02.2015 13:05
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?
Parent - - By Luchs (More than 1000 posts.) Date 09.02.2015 16:05
Ohne das additive Zeichnen bekommst du kein Lichteffekt hin. Wenn du es normal zeichnest, verdeckst du ja damit das, was hintendran ist.
Parent - - By Pyrit (More than 200 posts.) Date 09.02.2015 17:15
Ja aber bei sprites, die ganz weiß sind macht es keinen Unterschied, ob man sie additiv oder normal zeichnet. (zumindest in gimp)
Parent - - By Sven2 (More than 500 posts.) Date 09.02.2015 17:22
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)
Parent - By Pyrit (More than 200 posts.) Date 09.02.2015 17:27
huh, ist mir nie aufgefallen! :shocked::shocked::shocked:
- - By Serpens66 (More than 200 posts.) Date 12.02.2015 22:21
davon ausgehend dass das additive Zeichnen schuld ist... ist es dann normal, dass eine Farbzuweisung von RGBa(255,255,255,255); trotzdem noch zu Lag führt? Das Licht ist nicht mehr sichtbar, aber trotzdem Lag das Spiel noch.  Erst wenn ich SetVisibility verändere, hört das laggen auf.  Wundert mit nur etwas, dass die Durchsichtigkeit von 255 nichts bewirkt und gibt mir gerade die Hoffnung, dass es vllt doch eine andere Ursache haben könnte? :D
Parent - - By Luchs (More than 1000 posts.) Date 12.02.2015 22:41
Ja, weil es darauf ankommt, ob gerechnet wird, nicht mit welchen Werten gerechnet wird.

Einfaches Beispiel: Du hast eine Addition in deinem Programmcode (additives Zeichnen ist ja auch genau das): `result += x;`

Für die CPU ist es völlig egal, ob x null ist oder nicht - sie führt immer eine Addition aus.

Der Code könnte aber die Addition vielleicht nur ausführen, wenn eine weitere Variable gesetzt ist (d.h. das Objekt sichtbar ist):

```
if (doAddition) {
   result += x;
}
```

Jetzt wird die Addition nur dann ausgeführt, wenn `doAddition` gesetzt ist, wir sparen also manchmal eine Instruktion ein! (davon abgesehen, dass dieser einfache Fall wegen der CPU-Pipeline nicht wirklich effizienter wäre)

Genauso funktioniert auch das additive Zeichnen. Das eigentliche Zeichnen ist eine Schleife über alle Pixel der Grafik, wobei die Farbwerte addiert werden (unter Berücksichtigung des Alpha-Wertes). Wenn das Alpha dafür sorgt, dass man nichts davon sieht, dann hat das trotzdem keinen Effekt auf die Addition - es wird eben 0 addiert und trotzdem Zeit dafür verbraucht. Der Visibility-Wert ist die Zusatzbedingung, die dafür sorgt, dass diese ganze Zeichenschleife mit ihren vielen Additionen gar nicht erst ausgeführt wird.

Theoretisch könnte natürlich eine zusätzliche Bedingung dabei sein, die auf Alpha-Wert 255 überprüft. Das würde dein Problem aber auch nicht lösen.
Parent - By Serpens66 (More than 200 posts.) Date 12.02.2015 23:25
alles klar, danke dir für die ausführliche Erklärung :)
Habe jetzt eine Regel eingebaut, die man jederzeit aktivieren kann, und die die normale Helligkeit der Landschaft herstellt, dafür sorgt, dass diese nicht mehr in der Nacht runtergesetzt wird und Lichter durch SetVis nicht sichtbar sind :) Wenns dann iwann bei zuvielen Lichtern laggt, stellt man das halt ein... Die Lichter haben glücklicherweise noch den 2ten Effekt, dass sie SetPlrViewRange verteilen, sodass es trzd. sinnvoll ist Fackeln und Lcihtobjekte zu bauen :)
- By OffizierMichael (More than 500 posts.) Date 04.09.2017 15:08
Danke für diesen Beitrag, interessante Feststellung - kein Wunder das viele hazard-basierende Szenarien und Pakete unter schlechter Performance leiden, die Engine läuft sich an ineffizienten Rechenaufgaben kapputt nur um simple Lichtkreise und -kegel darzustellen =|
Ich hatte da ja immer die Dunkelheit an sich unter Verdacht^^'
Up Topic Deutsch / Hilfestellung / Licht Sichtbarkeit sorgt für Lag

Powered by mwForum 2.29.7 © 1999-2015 Markus Wichitill