AntiLagSwitch 2k(3)
download AntiLagSwitch
AntiLagSwitch 2k(3)
download AntiLagSwitch
Geändert von bugmenot (28.03.2014 um 14:49 Uhr)
Also werden nur die Events geupdated, die von einem Change Switch bzw. Change Variable direkt betroffen sind?
--Elektra Kingdom v.4.12 Vollversion in der Mache, Zeitlimit bis zum 31.12.2024 *click
Offizieller Blog zum Spiel News, Links, Screenshots, etc. *click
Tanalin Integer Scaler Fullscreen Tool für RPG Maker 2000 / 2003 Spiele *click
VirtualMIDISynth Fix für kaputte MIDI Musik *click
Windows Photo Viewer Fix für unscharfe Windows Fotoanzeige *click
RPG Maker Ultimate (rpg2009) von Cherry: 1 Million Switches/Variablen, 125 Kästchen für BattleAnimationen, beliebige Picture-Größen importieren *click für DL & *click für 100.000 Pictures
RPG Maker 2000 / 2003 (Steam) Korrektes Vollbild , Performance+ & Ultimate *click
Erm... immer wenn irgendetwas passiert (oder der entsprechende Eventbefehl erfolgt), das die PreConditions auf der linken Seite von Events erfüllen könnte (ChangeSwitch, ChangeVariable, AddItem, ChangeParty, ChangeTimer) ... erfolgt nach jedem solchen Eventbefehl ein EventUpdate, das ALLE Events auf der momentanen Map und ALLE CommonEvents anvisiert.
Wenn man im Hintergrund irgendwelche Logik- oder Arithmetik-Prozesse laufen hat, die aus zig Zeilen bestehen, die in jedem Frame wiederholt werden... kann man entweder einen 0.0 wait setzen (damit das Spiel Zeit hat, sich wieder zu beruhigen... dann muss man aber auch mittendrin waits setzen, weil 2 Frames warten statt vorher 1 ohne wait auch nicht viel bringen könnte...) ...oder halt das Auslagern von Rechenarbeit auf das Durchchecken von mehreren hundert Events unterbinden.
Diese Maker waren nie darauf ausgelegt, mit vorgegebenen Mitteln, irgendetwas großes durch den Nutzer ausrechnen zu lassen.
Der Patch wird leider kein generelles Laggen durch riesige Maps mit hunderten sich bewegenden Events oder durch ständige Festplattenzugriffe durch unnöttiges <ShowPicture> beheben.
Edit:
Solange man einen Block an ForkConditions + Switches + Variables hintereinanderreiht und vor und nach dem Block Switch[1000] an/ausschaltet, sollte es selbst bei parallel laufenden Events keine Probleme geben.
Geändert von bugmenot (26.03.2014 um 11:21 Uhr)
Die Checkerei wird also bei jeder Aktion durchgeführt, die die Seitenbedingungen betreffen könnte?
Es erschliesst sich mir halbwegs, warum das bei dem Event durchgeführt wird, aus dem der Befehl stammt,
da sich mitten im Frame etwas Wichtiges ändern kann, aber alle überprüfen? Es hätte ja eigentlich gereicht,
wenn diese durchgecheckt werden, sobald sie in der Ausführung im derzeitigen Frame dran sind. òo
Was mit den CommonEvents ist, kann ich nicht genau sagen. Aber bezüglich von MapEvents werden in einer 'for i = 1 to EventAmount'-Schleife die Parameter des jeweiligen Events abgerufen und gleich hinterher die Seitenbedingungen durchgecheckt. Bei jeder solchen Aktion, die ein EventUpdate ausführt. Ohne irgendwo mittendrin zu warten.
Sagt mal Leute, wäre es möglich eine Art eigene Scene zusammenzubauen?
Also ich meine ein komplett eigenes Menü, aber im Standardstil, ohne Pictures etc. zu verwenden. Dass man das ganze praktisch hardcoded?
Könnten wir nicht die UpdateEvents-Funktion so umbauen, dass sie nur ein Flag setzt, und am Ende der Eventverarbeitung in einem Frame das eigentliche UpdateEvents ausführen, wenn das Flag gesetzt ist? Ich seh momentan keinen Grund warum man mehr als 1x pro Frame die Events aktualisieren sollte, was meinst du?
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT
Der Einfall ist mir vor vier Monaten auch in den Sinn gekommen. Mir war aber kein freier Platz in den Pointern bekannt (ohne groß zusammenfassen + anpassen zu müssen) um die Flag unterzubringen, und keine Funktion bekannt, welche jeden Frame nur 1 mal abgerufen wird.
Das lässt sich beides doch extern in einer DynRPG-Routine unterbringen?
...und die loop in loc_4AB8C5 verlassen, solange Flag = true (nach Durchlauf der Schleife setzen) und das ding/flag halt nach jedem Frame per externe Funktion auf false (= do not block EvUpdate) flippen. Warum brauchst du dafür meinen Konsens?
P.S.
Mir ist etwas eingefallen:
download MapInMenu
Keine Ahnung, was ein transparentes F9-Menü bringen soll. Credits an Cherry's erste 2k3 Version.
Geändert von bugmenot (05.09.2014 um 23:15 Uhr)
Ich würd mir meinen eigenen Platz für das Flag suchen, z.B. 4CE100, oder irgendwo ein unbenutztes Byte klauen, wie z.B. Offset 5 (nach der Scene, die nur als Byte und nicht als DWord verwendet wird) in TLcfgSystem, also [[4CDC7C]]+5.
Dann würde ich das richtige UpdateEvents (wenn nötig) einfach bei 4903AB machen, also nachdem die Scene geupdated, aber noch nicht gedrawt wurde (weil letzteres vom Maker ja auch geskipt werden kann wenn ersteres zu lange gedauert hat).
Ich werd das bei Gelegenheit mal einbauen, wenn du es noch nicht gemacht hast bis dahin.
Deinen Konsens: Naja, weil du den AntiLagSwitch gemacht hast, dich also schon mit den Auswirkungen auseinandergesetzt hast, wenn man UpdateEvents nicht aufruft, und daher, sollte meine Idee fehlerhaft sein, was gesagt hättest
@all: Kann mir mal wer ein Spiel verlinken was derbe laggt (und zwar nicht wegen Show Picture)? Ein Real Life Example wär praktisch.
Btw, ich frag mich ja auch woran es liegt, dass das Rotieren von größeren Pictures so extrem laggt. Ich vermute ja, dass sich der Frameskip-Mechanismus da selber ein Ei legt, sobald das Updaten länger dauert als 1/60 Sekunde (weil es das ja jedes Frame braucht).
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT
Geändert von Cherry (06.09.2014 um 06:34 Uhr)
... du meinst sicher das Byte neben der GameScene, welche durch den [MainPtr]+4 dargestellt wird?
Wenn nicht, dafür sind die 90 90 da. GameScene auf [+4] wird sowieso überall als BytePtr gesetzt/abgefragt bzw. mit zero extend für jmp off_4...[eax*4] ausgelesen.
Eine nicht so schwachsinnige Version.
UpdateEvents setzt eine Byte_flag und in sub_4A35D0 wird dann die flag wieder = false gesetzt und das eigentliche UpdateEvents durchgeführt (ohne nach dem ersten EventBefehl zu blockieren).
Frag mal Itaju, ob er noch den Downloadlink der semi-aktuellen Version von AtV hat.
Oder copy&paste dir ein paar dutzend Events mit 100 EventPages (zählt dann als ca. 50 Events) zusammen und einige hundert mal inc(Var1) in einem parallel process.
Geändert von bugmenot (09.09.2014 um 10:24 Uhr)
Ja, sollte alles beschreibbar sein... was crasht da bei dir?
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT
Alone - Cold Winter und Eternal Legends 2. Allerdings ist ersteres mit Molebox verschlüsselt (deswegen auch die Ruckler) und bei letzterem kommt es auf den PC an, von welchem es gestartet wird. Bei einigen laggt es sich langsam bis zur Unspielbarkeit, bei anderen passiert garnix.Zitat von Cherry
Ansonsten fallen mir keine Spiele ein, die stark ruckeln.
--Elektra Kingdom v.4.12 Vollversion in der Mache, Zeitlimit bis zum 31.12.2024 *click
Offizieller Blog zum Spiel News, Links, Screenshots, etc. *click
Tanalin Integer Scaler Fullscreen Tool für RPG Maker 2000 / 2003 Spiele *click
VirtualMIDISynth Fix für kaputte MIDI Musik *click
Windows Photo Viewer Fix für unscharfe Windows Fotoanzeige *click
RPG Maker Ultimate (rpg2009) von Cherry: 1 Million Switches/Variablen, 125 Kästchen für BattleAnimationen, beliebige Picture-Größen importieren *click für DL & *click für 100.000 Pictures
RPG Maker 2000 / 2003 (Steam) Korrektes Vollbild , Performance+ & Ultimate *click
Weiß zwar nicht genau worums geht, aber mein Spiel (Legend of the Silverstone) ruckelt im Gebirge (MarcLMaps-->GebirgeTeilLinks/GebirgeRECHTSunten) ziemlich stark, da sind auf den Maps ~1000-2000 Events? und dann noch PPs... Wenn man den alten AntiLag einschaltet, geht es merklich schneller, aber ich müsste erstmal kucken, worauf ich dann noch achten müsste, damit sonst von der Technik alles hinaut (man muss das Teil ja zu bestimmten Zeiten wieder ausschalten bzw. resetten oder so....)
-----------------------------------------------------------
muh...
Das.
Edit:
...
Die Festlegung des Datenbereiches mit einem FF FF FF FF 01 00 00 00 fehlt?
Geändert von bugmenot (07.09.2014 um 11:27 Uhr)
4ACB17 ist ja mitten im Code-Segment, das ist natürlich nicht beschreibbar... drum hatte ich ja zwei Vorschläge im Datensegment respektive in einem zur Laufzeit allozierten beschreibbaren Speicherbereich gebracht.
See also: http://msdn.microsoft.com/en-us/library/ms809762.aspx
Und FF FF FF FF 01 00 00 00 hat damit nix zu tun, das ist nämlich keine "Festlegung eines Datenbereiches" sondern gibt die Stringlänge (und das ist kein String) an.
Kleiner Exkurs zu Delphi-Strings, falls es dich interessiert: Delphi-Strings sind nämlich ein relativ geniales Konzept: Sie sind quasi erweiterte C-Strings. C-Strings sind ja einfach nullterminierte Strings ohne Längenangabe, d.h. da steht dann z.B. "Hello World" + ein 00-Byte im Speicher, letzteres gibt das Ende des Strings an. Das heißt natürlich im Umkehrschluss, dass ein String selber kein 00-Byte enthalten kann, und dass jedes mal die Bytes im String durchgezählt werden müssen wenn man dessen Länge rausfinden will. Delphi hängt davor noch zwei DWords an (davor, weil man dann den eigentlichen Stringpointer genauso Delphi- und C-/WinAPI-Funktionen geben kann und es funktioniert). Und zwar Reference Counter und Länge. Angenommen, eax ist gerade ein Pointer auf den eigentlichen String (also quasi auf das "H"-Byte in "Hello World"), dann kann man mit [eax-4] die Länge des Strings und mit [eax-8] den Reference Counter auswählen. Der Reference Counter wird für zur Laufzeit erstellte Strings verwendet - dadurch kann derselbe String mehrfach verwendet werden, ohne jedes mal neu erzeugt zu werden, solange bis ihn keiner mehr verwendet, dann wird der Speicher freigegeben. Nun sind aber hardgecodete Strings im Code-Segment anders, weil sie eben nicht zur Laufzeit erstellt worden sind, können sie auch keinen Reference Counter haben (er wäre ohnehin nicht beschreibbar weil Code-Segment). Deshalb ist der Wert des Reference Counters bei Stringkonstanten -1 (FF FF FF FF), als "Special Value" quasi. Leere Strings werden übrigens gar nicht gespeichert, sondern durch einen Nullpointer repräsentiert.
See also: http://www.codexterity.com/delphistrings.htm (runterscrollen zu AnsiString)
EDIT:
Sag mal, was machst du denn da eigentlich? Wieso baust du so viel Code um, an nichts damit zu tun habenden Stellen, sodass andere Patches oder Offsetsuchprogramme daran verzweifeln, anstatt eine vernünftige Codecave an einer unbenutzen Stelle zu verwenden? Da ist so viel nicht verwendet...
Um nicht alles unnötig zu verkomplizieren, würde ich dich dringend bitten, nur mehr minimale Änderungen am Code vorzunehmen, und zwar da, wo es auch logisch hingehört. Wir müssen unsere Codecaves natürlich koordinieren, deshalb wird ich sagen, du kannst im 2k3 446D30-449DD3 haben. (Da sind Funktionen für Kontextmenüs, aber es gibt ja keine im Spiel, kann man also überschreiben). 442600-443A6F und 45CDF4-45D84B bitte nicht anrühren, das ist für DynRPG, und irgendwo in der Nähe von 433XXX hab ich noch Zeugs für PicPointerPatch, wenn ich mich Recht erinnere. Die Zone nach dem Ende des Codes ab 4C9D10 ist auch schon belegt, BetterAEP z.B.
Beim 2k kannst du 432CAC-436FE3 haben.
Ist das OK für dich?
Ich hätte noch eine große Bitte an dich... ich hab mir nämlich mit meinem Vorschlag, wo du den Code der 1x pro Frame ausgeführt wird, hintun sollst, selber ein Ei gelegt. Genau die Stelle brauche ich nämlich in meinem neuen Projekt, einem Debugger, und ich habe eh überlegt ob ich eine andere Lösung finde, aber es ist mir fast unmöglich, mit deiner Änderung da noch vernünftig zu arbeiten. Also bitte sei so nett und lege den Code stattdessen auf 4A35D0, das ist der Anfang der Routine die 1x pro Frame die Map updated. Sollte für dich denselben Effekt haben, ohne dass dann mein Debugger bei keinen Projekten mit AntiLagSwitch+ funktioniert! Vielen lieben Dank!
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT
Geändert von Cherry (07.09.2014 um 19:16 Uhr)
download AntiLag(Fast)
Jetzt sollten eigentlich alle Fehler raus sein.
download ALS DePatch
(entfernt den AntiLagSwitch Patch restlos, wenn man ihn nicht im Ordner DynPatches hatte, sondern direkt auf die RT gepatcht hat).
CodeCaves:
432CAC..432D02 (2k v1.07 )
446D30..446D85 (2k3 v1.08 )
Ich stell heute noch welche für 2k v1.51 Value! und 2k3 v1.09 raus. Wer was anderes benutzt bitte laut rufen.
Da hat eine gewisse Person vor knapp 17 Monaten etwas anderes behauptet.
1. ...hat sich erledigt... (DePatch)
2. Generell: wenn einem gesagt wird, dass in der RPG_RT kein Platz mehr ist, dann macht man sich Platz. Ohne vorher raten zu müssen, welche Funktionen im Programm nie ausgeführt werden.
Geändert von bugmenot (12.09.2014 um 15:42 Uhr)
Ja, du hast Recht, ich hab vor 17 Monaten echt was anderes geschrieben (da kannte ich diese Stelle auch noch nicht, aber das ist jetzt egal). Und wenn ich jetzt meinen Satz von vorher lese, nämlich den da: "Sag mal, was machst du denn da eigentlich? Wieso baust du so viel Code um, an nichts damit zu tun habenden Stellen, sodass andere Patches oder Offsetsuchprogramme daran verzweifeln, anstatt eine vernünftige Codecave an einer unbenutzen Stelle zu verwenden?", dann denke ich mir "WTF, klingt das unfreundlich". Dafür möchte ich mich wirklich entschuldigen, weil es nicht deine Schuld war, ich glaube ich war gestern gerade prinzipiell weniger guter Laune, was nicht an dir lag, und hab mich dann darüber geärgert dass plötzlich mein Zeugs mit deinem Patch nicht mehr ging und ich dann auch noch selber dir die Adresse gesagt habe. Ich hätte auf mich selber sauer sein sollen, also vergiss es bitte einfach, es tut mir Leid. Danke, dass du dir überhaupt die Arbeit machst a) diese Patches zu machen und b) noch meinen Bitten nachzukommen.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!Now all new and shiny:CherryShare | Patches und Tools | Programmwunschthread | www.cherrytree.at | Cherry = CherryDT
Also ich hab nicht probiert, ob das mit diesem neuen Antilag-Patch Probleme verursacht, aber eine Situation würde mir einfallen, wo man zwischendurch neu evaluieren muss:
Ausgabe muss sein: AC, das parallele Event bricht sofort ab, sobald eine andere Bedingung erfüllt ist.
Wenn Seite 1 nen anderer Typ ist, ist die Ausgabe immer "ABC".
Das Verhalten weicht übrigens beim XP und neuer ab, da ist die Ausgabe auch bei parallelen Events "ABC", ist also ne 2k/3-Besonderheit.
Ohne Patch: AC
Mit Patch: ABC
Mit Patch mit [0.0 Wait] vor B: AC
Inwiefern?
Wieder zum Ausgangszustand des "alle Events abklappern, wo Eventbedingungen erfüllt sein könnten und viele Frameeinbrüche verursachen" zurück?
Einen CommentCommand @Update für einen erzwungenen Eventupdate einführen? (wovon ältere Spiele dann nichts haben)
Sich darüber aufregen wie dämlich es sich anhört, den Code für irgendeine Funktion auf mehrere EventPages zu verteilen statt irgendwo intern zu verschachteln oder <CallEvent> richtig zu nutzen?
Edit:
"EventUpdate(Global)" = 1x je Frame, updatet jedes Event auf der Map nach einem Eventbefehl
und
"EventUpdate(Local)" = nach jedem einzelnen Eventbefehl, updatet nur das Event, aus dem der Befehl hervorgeht (+eigene EventPages)
?
Geändert von bugmenot (08.09.2014 um 20:03 Uhr)
Also eigentlich wollte ich mich nicht in die Diskussion einmischen, sondern Cherry ein Beispiel bringen, wo die Annahme nicht funktioniert, weil ihm spontan keins einfiel.
Die einfachste Lösung wäre natürlich nur 1x neu zu evaluieren. Würde ich auch persönlich für die sauberste halten, als so ein rumgefrickel wie @Update oben hinzuschreiben. Vorm patchen sollte sich nur der Entwickler bewusst sein, dass seine parallelen Events im Spiel sich anders Verhalten, wenn der von mir genannte Fall eintritt.