Neuer SZS-Algorithmus mit geringerer Dateigröße

      Neuer SZS-Algorithmus mit geringerer Dateigröße

      Hallo zusammen,

      vor einiger Zeit gab es ja auf Wiimmfi den ersten Custom-Wettbewerb von Sniki, ein weiterer von Sucht steht auch schon bereit und weitere sollen auch noch entwickelt werden. Ein Problem, worauf Sniki und ich beim Erstellen von "Blätterwald rückwärts" dauerhaft gestoßen sind, ist das Dateigrößenlimit von 20.480 Bytes für den Wettbewerb, also ca. 20.400 Byte für die SZS-Datei.

      Mit mehreren Tricks (leere KMP-Bereiche per Hex-Editor löschen und nicht leer lassen, Texturen runterskalieren, speziell angepasste Version von wszst [danke @Wiimm] mit geringfügig besserer Kompression genutzt) haben wir es dann endlich geschafft, die Dateigröße unter das Limit zu bekommen.

      Wiimm und ich haben in den letzten Tagen am Wettbewerbs-System für Wiimmfi gearbeitet und wollen in Zukunft das Erstellen und Testen von Custom-Wettbewerben vereinfachen - und dabei ist mir der Gedanke gekommen: Eigentlich muss das doch noch besser komprimiert werden können - schließlich sind die Original-Nintendo-Dateien immer noch kleiner als das Ergebnis vom Spezial-wszst.

      Es muss also eine bessere Komprimierung geben.
      Und die habe ich gesucht und gefunden.

      Ich habe mir irgendein Yaz0-Komprimier-tool aus dem Internet geladen (ich hätte auch den Source code von wszst nehmen können, aber das ist schwerer zu bearbeiten als ein stand-alone-tool). Dann habe ich erstmal mit ein paar Dateien getestet, wie sich das unmodifizierte Tool im Vergleich zu den SZS-Tools von Wiimm und den proprietären Tools von Nintendo schlägt: Es war etwas besser als die SZS-Tools (also immerhin schonmal ne Verbesserung), aber immer noch schlechter (größere Dateien) als die Originaldateien von Nintendo. Also habe ich angefangen, mich in die Kompression eingelesen und eine halbe Ewigkeit am Code rumgebastelt. Am Ende kam zwar nur kleinere Änderungen hier und da bei raus (der "generelle" Algorithmus ist ja gleich - lange Blöcke finden, die sich wiederholen), aber die rauszufinden, hat ewig gedauert - immer mehr Versuche mit SZS-Dateien, die entweder defekt (Datei packen -> wieder entpacken -> entspricht nicht bytegenau der Ursprungsdatei) oder deutlich größer waren.

      Und was ist das Ergebnis? Die neue Komprimierung dauert zwar ewig (wszst: ca. 5 Sekunden, mein tool: ca. 2-3 Minuten pro Datei), aber die entstehende Datei ist nicht nur kleiner als die von wszst erzeugte, sondern sogar kleiner als die Originaldateien von Nintendo - der neue Algorithmus ist also sogar besser als der von Nintendo. Ich habe zwar keine Ahnung, wie lange die Nintendo-Prozesse bei der Entwicklung des Spiels gebraucht haben, um eine SZS-Datei zu erzeugen, aber da die SZS-Dateien ja nicht so oft neu erzeugt werden müssen, zumindest bei den Wettbewerben, ist der Zeitverlust ja relativ egal - hat ja keiner vor, diese Monster-Kompression für Wiimms MKW Fun mit ~250 Strecken einzusetzen (2 Minuten pro Datei, 250 Strecken mit je zwei Dateien => 1000 Minuten => 16 Stunden).

      Ein paar Vergleichswerte:

      Common.szs: Originalgröße 1.180.527 B, wszst (Stufe 10): 1.181.289 B (100,06 % der Nintendo-Dateigröße), neues Tool: 1.179.576 (99,91 % der Nintendo-Größe)
      Vulkangrollen: Originalgröße 3.402.114 B, wszst (Stufe 10): 3.410.456 B (100,25 % der Nintendo-Dateigröße), neues Tool: 3.387.791 (99,58 % der Nintendo-Größe)
      Rainbow Road Originalgröße: 2.244.260 B, wszst (Stufe 10): 2.246.491 B (100,10 % der Nintendo-Dateigröße), neues Tool: 2.242.187 (99,90 % der Nintendo-Größe)

      (EDIT: Habe auch mal einen Nintendo-Wettbewerb (6660 B Nintendo, 6660 B wszst (identisch), 6651 B neues Tool (9 Byte gespart)) und einen Custom-Wettbewerb (18420 B wszst, 18323 B neues Tool, 97 Byte gespart)

      Eine Ersparnis von höchstens 0,7 Prozent (Vulkangrollen, Vergleich wszst - neues Tool) klingt jetzt nicht so besonders, aber da wir wie gesagt schon am Rand der Dateigröße kratzen ist da jedes einzelne Byte wichtig - und jetzt haben wir bis zu 100-200 Byte zusätzliche Dateigröße (also, einen bis zu soundsoviel Byte übergroßen Wettbewerb kriegt mein Tool noch (je nach Kompressionsfaktor) unter das Limit.

      Falls jemand das Tool mal testen möchte, entweder zum Ausprobieren oder um einen eigenen Custom Track noch ein bisschen zu komprimieren, habe es mal für Linux (32/64), Windows (32/64), Raspberry (ARM) kompiliert. Ist ein Kommandozeilentool (wie wszst), braucht als Parameter ne U8-Datei. Wszst kann ne SZS-Datei zu ner U8 konvertieren mit wszst decompress file.szs. Mein Tool hat nur die Kompressionsroutinen und packt kein U8-Archiv selber zusammen. Windows-Varianten sind ungetestet, Rückmeldung erwünscht.

      Irgendwann schreibe ich mal noch ein Script, welches mal alle SZS-Dateien im ganzen Spiel entpackt, mit wszst und meinem Tool neu packt und die Ergebnisse vergleicht. Bisher habe ich keine Datei gefunden, bei der wszst oder Nintendo besser als dieses Tool war.

      Fragen zu dem Programm können gerne hier gestellt werden.

      Leseratte

      EDIT 27.06., 21:20: Raspberry-Version war kaputt, kleines Update.
      Dateien

      DevkitPro Archiv (alte Versionen / old versions): wii.leseratte10.de/devkitPro/
      Want to donate for Wiimmfi and Wii-Homebrew.com? Patreon / PayPal

      Dieser Beitrag wurde bereits 0 mal editiert, zuletzt von Leseratte ()

      Ich habe gewonnen ;)

      Mein alter Code, mit dem ich vor Jahren eine Optimierung versucht habe, aber dann nicht weiterentwickelt habe, ist schneller und meist auch besser als der neue von Leseratte. Dazu musste ich nur eine Ersetzung durchführen:

      Quellcode

      1. # Ersetze das hier ...
      2. if ( found_len2 > found_len + 2 )
      3. # ... durch dass hier
      4. if ( found_len2 > found_len)
      Entdeckt habe ich diese Optimierung beim Optimieren von Leserattes Codes. Diesen hatte ich gestern in meine Tools integriert und dabei festgestellt, dass beide Algos dieselbe Strategie verfolgen, nur etwas anders umgesetzt.

      Leseratte wird gleich ein paar Tests veröffentlichen, die mich hoffentlich nicht als Lügner entlarven.

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Und hier sind die Tests, mit den gleichen Dateien wie im ersten Post:

      Common.szs - Nintendo 1.180.527 B, mein Tool 1.179.576 B, mit Wiimms Anpassungen 1.179.173 B (99,89 % der Nintendo-Größe)
      Rainbow Road - Nintendo 2.244.260 B, mein Tool 2.242.187 B, mit Wiimms Anpassungen 2.242.049 B (99,90 % der Nintendo-Größe)
      Vulkangrollen - Nintendo 3.402.114 B, mein Tool 3.387.791 B, mit Wiimms Anpassungen 3.386.882 B (99,55 % der Nintendo-Größe)

      DIe Änderung ist nicht viel, aber je kleiner, desto besser für die Wettbewerbe.

      Ich denke mal, Wiimm wird das neue wszst in naher Zukunft veröffentlichen.

      EDIT: Eins hab ich noch vergessen: Die neue Komprimierung war nach weiteren Optimierungen von mir mittlerweile auch schneller (~35 Sekunden statt 2 Minuten)

      DevkitPro Archiv (alte Versionen / old versions): wii.leseratte10.de/devkitPro/
      Want to donate for Wiimmfi and Wii-Homebrew.com? Patreon / PayPal

      Dieser Beitrag wurde bereits 0 mal editiert, zuletzt von Leseratte ()

      Ich habe fünf (hier nameslose) Quellen unterschiedlicher Größen nach jeweils fünf verschiedenen Algorithmen kompriiert:

      A: Mein alter Standard-Algorithmus --compr=9
      B: Mein alter Ultra-Algorithmus --compr=10
      C: Leserattes neue Entwicklung
      D: Meine Optimierung zu C
      E: Mein neuer Ultra-Algorithmus (ausgetauschte Zeile)

      Quellcode

      1. ------------------------------------------
      2. modus ms size compr-file
      3. ------------------------------------------
      4. A: 26 11206 09-course.kmp
      5. B: 50 11122 10-course.kmp
      6. C: 76 11037 91-course.kmp
      7. D: 44 11037 92-course.kmp
      8. E: 51 11034 90-course.kmp
      9. ------------------------------------------
      10. A: 34 15328 09-map.mdl
      11. B: 64 15258 10-map.mdl
      12. C: 107 15215 91-map.mdl
      13. D: 64 15215 92-map.mdl
      14. E: 66 15209 90-map.mdl
      15. ------------------------------------------
      16. A: 3169 2847990 09-rid.u8
      17. B: 4982 2835027 10-rid.u8
      18. C: 14182 2823691 91-rid.u8
      19. D: 4567 2823668 92-rid.u8
      20. E: 5056 2823074 90-rid.u8
      21. ------------------------------------------
      22. A: 5971 5520024 09-f.king.u8
      23. B: 9246 5506400 10-f.king.u8
      24. C: 40610 5476187 91-f.king.u8
      25. D: 8262 5476153 92-f.king.u8
      26. E: 9462 5475204 90-f.king.u8
      27. ------------------------------------------
      28. A: 11541 11127369 09-wch.wdf
      29. B: 22211 11067264 10-wch.wdf
      30. C: 80270 11039820 91-wch.wdf
      31. D: 18385 11039582 92-wch.wdf
      32. E: 23021 11037610 90-wch.wdf
      33. ------------------------------------------
      Alles anzeigen

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.
      Nächste Verbesserung:

      Quellcode

      1. Common.szs:
      2. Nintendo 1.180.527 B
      3. Wiimm (alt) 1.179.173 B
      4. Wiimm (neu, Stufe 10) 1.176.892 B
      5. Wiimm (neu, Stufe 15) 1.176.892 B (2 min)
      6. Wiimm (neu, Stufe 20) 1.176.892 B (38 min)
      7. Rainbow Road:
      8. Nintendo 2.244.260 B
      9. Wiimm (alt) 2.242.049 B
      10. Wiimm (neu, Stufe 10) 2.235.288 B
      11. Wiimm (neu, Stufe 15) 2.235.288 B (4 min)
      12. Wiimm (neu, Stufe 20) 2.235.288 B (110 min)
      13. Vulkangrollen:
      14. Nintendo 3.402.114 B
      15. Wiimm (alt) 3.386.882 B
      16. Wiimm (neu, Stufe 10) 3.374.278 B
      17. Wiimm (neu, Stufe 15) 3.374.279 B (6 min, 1 Byte schlechter ...)
      18. Wiimm (neu, Stufe 20) 3.374.276 B (160 min, 2 Byte besser als Stufe 10)
      Alles anzeigen
      Der Algorithmus unterstützt bis Stufe 30, aber die höheren Stufen dauern *ewig* und bringen kaum was.
      Wiimm bastelt aber immer noch weiter.

      DevkitPro Archiv (alte Versionen / old versions): wii.leseratte10.de/devkitPro/
      Want to donate for Wiimmfi and Wii-Homebrew.com? Patreon / PayPal

      Dieser Beitrag wurde bereits 0 mal editiert, zuletzt von Leseratte ()

      Jede neue Stufe bedeutet theoretisch 2x soviel Möglichkeiten und damit 2x Rechenzeit. Durch einig Optimierungen und auslassen von kompletten Zweigen ist der Aufwand wesentlich geringer, aber immer noch exponentiell zur Stufenanzahl.

      Ich habe aber noch 2 andere Algorithmen im Kopf!

      WIT: Wiimms ISO Tools
      Verwaltet Plain ISO, WDF, WIA, CISO, WBFS, FST: kann Extrahieren, Erstellen, Patchen, Mischen und Überprüfen

      SZS: Wiimms SZS Tools
      Verwaltet SZS-, BRRES-, U8-, BMG-, BREFT-Dateien uvm.



      PN ohne persönlichen Charakter werden ignoriert. Support-Anfragen gehören ins Forum.