• Login

Dear visitor, welcome to RPG Studio - Make your World real. If this is your first visit here, please read the Help. It explains in detail how this page works. To use all features of this page, you should consider registering. Please use the registration form, to register here or read more information about the registration process. If you are already registered, please login here.

1

Wednesday, December 19th 2018, 12:40am

Strapazierung durch parallele Events minimieren

Hallo liebe Community,

Ich tüftle gerade an einem kleinen Projekt und habe hierzu ein paar Fragen.

Ich habe schon öfter gelesen, dass der XP bei zu vielen Events, die parallel laufen, schnell ins stottern kommt. Das lässt sich natürlich eingrenzen, indem man diese Events mapgebunden macht, wodurch natürlich nur diejenigen laufen, die sich auf der aktuell offenen Map abspielen. (bitte korrigiert mich, wenn ich irgendwo was falsch verstehe)

Ich habe allerdings den Wunsch, in meinem Projekt so viel wie möglich auf der Hauptmap passieren zu lassen und diese möglichst nicht aufzuteilen. Deswegen will ich testweise mal alle grundlegenden Features als Skelett auf einer Testmap anlegen und dabei direkt so gut es geht optimieren.

Ich habe hierbei bisher vor allem versucht, unnötige parallel Events zu verzichten, indem ich Beispielsweise nicht von jedem Gegner aus eine Abstandsabfrage zum Spieler errechnen lasse, sondern nur ein Common-Event habe, das gleichzeitig alle relevanten Abstände errechnet.

Ebenso werde ich bei meinem Common-Event, das die Ingame-Zeit abfrägt, auch gleichzeitig alle Variablen verringern, die beispielsweise die Wachstumsdauer von Pflanzen oder die Aggrodauer von Gegnern bestimmen, anstatt dies bei den jeweiligen Events parallel laufen zu lassen.
Jetzt stellt sich mir die Frage, ob

a) diese Maßnahmen gegen Überlastung helfen dürften,
b) es mittlerweile technische Kniffe gibt, die den Maker etwas schmieren, und
c) es noch andere Dinge gibt, die ich beachten sollte, bzw. die Noobs gerne tun ohne zu wissen, wie schwer man es der Engine damit macht.

Außerdem wollte ich fragen, ob es ohnehin eine Obergrenze an sich bewegenden Events gibt, die der XP gleichzeitig auf einer Map verträgt (Pi mal Daumen). Denn wenn der Maker bei sagen wir mal 20 herumwuselnden NPCs und noch dem einen oder anderen Event, das eine Animation abspielt, wenn der Spieler in der Nähe ist, bereits ins prusten kommt, sind mehrere kleinere Maps wohl einfach angebracht.


Ich hoffe, mir kann jemand helfen
Meine neue Homepage!, da findet ihr auch meinen Blog :palette: und meine unfertigen Ressourcen :gear: könnt ihr da auch schon testen im WIP-Bereich. Für häufigere Updates könnt ihr mir auf Twitter :binocular: folgen.
Bild

Mitsch93

Drachentöter

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

2

Thursday, December 20th 2018, 2:58pm

Ähnliche Überlegungen habe ich mal angestellt, als ich mir Gedanken über Open World Spiele im XP gemacht habe.

Aber zuerst mal zu deinen Methoden:
Abstandsabfragen usw., wie realisierst du die? Native per Events oder per Skript? Ich würde vermuten, dass a) die Skriptlösung schneller ist und
b) es keinen (kaum) Unterschied macht, ob 10 parallele Events eine Abfrage oder ein Event 10 Abfragen behandelt.

Mal abgesehen von parallel Events, kann auch die Summe von beliebigen Events die FPS drücken. Ich hatte mal beim Dorfcontest eine Map erstellt.
Da waren gut 600 - 800 Events drauf. Das hat auch schon (in Kombination mit einem Skript) den ein oder anderen Ruckler verursacht.

Ich habe mich vor einiger Zeit generell mal eingelesen, wie das sein kann, dass es bei rieseigen Open World Spielen wie Zelda überhaupt sein kann,
dass alles so flüssig läuft. Der Clue; es wird nur das geladen, was gerade gebraucht wird. Mit der Distanz nimmt zB auch die Polygonanzahl von Grafiken ab,
dadurch wird weniger Leistung gefressen.

Dann habe ich mir überlegt: Im Maker mal eine Map (400x400) erstellen mit endlos vielen Events und Abfragen. Diese Abfragen und Events sind aber nur sichtbar / werden nur eingeschaltet, wenn sie in einer bestimmten Range zum Spieler sind. Das wäre ja in etwa das gleiche wie bei Open World Spielen. Zum Beispiel sind nur Events in einem Radius von 50 Tiles aktiv.
Stellt sich natürlich wie Frage, wie effektiv dann das ganze wäre, aber das ist bestimmt interessant mal zu erfahren.
Probleme würden deine erwähnten Aggromechaniken machen. Theoretisch wäre es möglich einen Gegner über die komplette Map zu ziehen. Das sollte natürlich nicht vorkommen und muss
verhindert werden.

Eine ganz edle Lösung ist mir mal aus Zufall begegnet. Und war im Pokemon SDK (Pokemon Kit für den XP). Pokemon ist ja auch im Grunde eine Art Open World.
Dort gibt es die Möglichkeit einzelne Maps zu erstellen und sie in einem gesonderten Editor aneinanderzuhängen. Dadurch kann der Spieler zwischen Maps hin und her switchen
ohne ein Teleport-Event benutzen zu müssen.
Weitere Vorteile wären, dass nur Events geladen werden, die auf der aktuellen Map sind und man keine rießigen Tilesets benötigt.
Von daher würde ich diese Methode mit Abstand bevorzugen.

This post has been edited 1 times, last edit by "Mitsch93" (Dec 20th 2018, 2:58pm)


3

Thursday, December 20th 2018, 6:10pm

Ja, ich habe ein Common-Event, das parallel läuft und von allen relavanten Gegnern den Abstand über Variablen berechnet in bestimmten Abständen. ist dieser dann < X, wird ein Switch aktiviert. Ich hatte hoffnung, dass ein paralleles Event, das hintereinander 5 Abstände berechnet weniger starparierens ist als 5 parallele Events, die jeweils einen Abstand berechnen, da die Berechnungen im ersten Fall ja hintereinander ablaufen und im zweiten Fall gleichzeitig. Der Gedanke war, dass auf der Map relativ viele dieser Gegener Spawnen können, wodurch man entweder bestimmte Bereiche nicht mehr ungestört betreten kann, oder die Gegner dort besiegen oder an einen anderen Ort auf der Map ziehen muss.

Hm... ich werde mal den guten Kagu-chan fragen, ob man das dann lieber als Script machen sollte.

Naja, der ganze Sinn dieser einen großen Map wäre es aber, dass Gegner über die ganze Map hinter dir herlaufen, wenn du dich dumm anstellst bzw. es absichtlich machst...

Aber ja, man könnte ja zwei Abstände abfragen... einen, der für die Aggrorange benötigt wird und einen größeren, der das Event komplett deaktiviert, wenn es außerhalb eines bestimmten Wert liegt. Ich glaube, ich mach mal eine Testmap bzw. ein Testprojekt, in dem ich mal probiere, ob durch diese deaktivierten Events das Ruckeln reduziert wird.

Grundlegend bin ich mit meinem Projekt noch nicht an dem Punkt angelangt, wo es Ruckelt. Ich dachte nur, ich frag mal frühzeitig nach, wie man dem Ruckeln vorbeugen kann.
Meine neue Homepage!, da findet ihr auch meinen Blog :palette: und meine unfertigen Ressourcen :gear: könnt ihr da auch schon testen im WIP-Bereich. Für häufigere Updates könnt ihr mir auf Twitter :binocular: folgen.
Bild

Mitsch93

Drachentöter

Motto: Aufgeben ist es, was den Menschen tötet. Nur der Mensch, der sich weigert aufzugeben, hat sich das Recht verdient, auf dem glanzvollen Pfad der Menschheit zu wandeln.

  • Send private message

4

Thursday, December 20th 2018, 9:09pm

Ok, wenn das ein Zombie-Spiel wird macht es ja durchaus Sinn, dass die Gegner dich quasi unendlich verfolgen können, ich war da
in Gedanken ehr in Richtung Adventures. Dann weiß ich allerdings nicht, ob da so eine Lösung wie bei Pokemon funktioniert - ich denke ehr nicht.

Denn ich glaube, dass die Maps weiterhin in sich abgeschlossen sind, auch wenn das SDK die Möglichkeit bietet quasi ohne Teleports die Map zu wechseln.
Also vermutlich ist es nicht möglich, dass dich ein Gegner-Event von Map 1 auf Map 2 weiterverfolgt.

Da müsste man wirklich hin zu einer Map gehen und zusehen, dass nur alle relevanten Events geupdated werden. Hier wäre ein Skript angebracht, das
nicht alle Events updated, sondern nur die, die innerhalb einer Reichweite des Spielers sind.