Seite 2 von 2 ErsteErste 12
Ergebnis 21 bis 33 von 33

Thema: Simple-2D-Engine

  1. #21
    Ich hab mir das Map Format mal angeschaut. Ist noch ein wenig "unschön" gelöst, wie man es auch an der Dateigröße merkt. Damit meine ich vorallem die 500er Map.. die knapp 1MB groß ist. 100 Maps == 100MB? Ich weiß das wäre eher der worst-case, aber schau dir als gutes Beispiel mal das Tiled .tmx (eigentlich .xml) Format an. Tiled Map Editor. Dort wird zlib Kompression + base64-encoding verwendet. Anstatt also:
    Zitat Zitat
    <Layer>
    <MapTiles Tiles="4:1,4:1,5:1, ....
    im klartext zu speichern könntest du folgendes machen
    Zitat Zitat
    <layer encoding="base64" compression="zlib" width="500" height="500">
    eJzt2kEKAjEMheGizkXUk6gw97+R2QiZUgjUFDLJv/gW7eLRt3C.. <-- die codierten Tile IDs
    </layer>
    Um die Map zu erhalten dann sowas wie:
    Zitat Zitat
    byte[] decoded = Base64.decode(layer.value);

    int[] tileIDs = new int[layer.width * layer.height];
    Zlib.inflate(tileIDs, decoded);

    int tile = tileIDs[x + y * layer.width];
    Zip die Map mal, dann siehst du wieviel du in etwa verschwendest. 994kb werden auf ca. 6kb komprimiert.

    Falls du aus irgendeinen Grund nicht darauf verzichten willst, würde ich trotzdem einige Dinge überdenken. Sowas wie:
    Zitat Zitat
    <MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
    <MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
    <MapTiles Tiles="4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4
    Jeder char im xml Bezeichner ist mal fünfhundert = 500 Byte Verschwendung. Auch das Attributte "Tiles" ist unnötig. Den Tile IDs String kann man auch als value speichern. Also eher sowas wie
    Zitat Zitat
    <tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
    <tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
    <tid> 4:1,4:1,5:1,1:0,3:1,4:1,4:1,4:1,4 ... </tid>
    Bei AnimationDatabase.xml ist es ähnlich.
    Zitat Zitat
    <Frame time_msec="50">
    <Sprite spriteID="11" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
    </Frame>
    <Frame time_msec="50">
    <Sprite spriteID="12" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
    </Frame>
    <Frame time_msec="50">
    <Sprite spriteID="13" posX="0" posY="0" scale="100" rotation="0" opacity="100"/>
    <Sprite spriteID="3" posX="-96" posY="-96" scale="100" rotation="0" opacity="100"/>
    </Frame>
    Anstatt jedesmal ein neuen Tag für die Framezeit zu beginnen könntest du ein int array mit [index] = frametime Wertepaaren verwenden. Außerdem könntest du default-werte einführen. Werte wie posX="0" posY="0" scale="100" rotation="0" opacity="100" braucht man nicht zu speichern, wenn es sie als default gibt. Daraus wird dann sowas wie:
    Zitat Zitat
    <frame_times> 50 50 50 <frame_times>
    <sprites>
    <sprite id="11" t="0" />
    <sprite id="12" t="1" />
    <sprite id="13" t="2"/>
    <sprite id="3" t="2" posX="-96" posY="-96" />
    </sprites>
    Die Frame zeiten werden dann mit frame_times[sprite.t] ausgelesen.

    Na ja, das viel mir so auf. Hab mir aber auch nicht alles angeschaut.

  2. #22
    Bei den Maps bin ich mit dir einer Meinung, diese wollte ich auch in Zukunft zipen.
    Bei den Animationen machst du allerdings den Fehler zu denken, man hat nur ein Sprite pro Frame. Denn genau aus diesem Grund gibt es diesen Tag, damit mehrere Sprites pro Frame benutzt werden können.
    Von den default Werten bin ich kein Freund.

    Aber ich freue mich, das du dir das mal angeguckt hast, auch wenn ich im Moment wenig Zeit habe, daran weiter zu arbeiten

  3. #23
    Ist halt XML, da ist doch Speicherplatzverschwendung und Tag-Bloat by Design .

    Nimm JSON, dann sparst du schon mal alle schließenden Tags ^^

    Nachtrag:
    Solche Optimierungen sollte man übrigens erst machen, wenn das Programm weitesgehend steht. Erstmal alles sauber programmieren und dann schauen was man optimieren kann.

    Geändert von Ghabry (09.08.2013 um 21:36 Uhr)

  4. #24
    Ist auch der Weg, den ich im Moment gehen möchte. Erstmal muss es funktionieren
    Ob ich dann letztendlich xml oder json oder komplett binary mache, ist reine fleiß arbeit.

  5. #25
    Zitat Zitat von Ghabry Beitrag anzeigen
    Ist halt XML, da ist doch Speicherplatzverschwendung und Tag-Bloat by Design .

    Nimm JSON, dann sparst du schon mal alle schließenden Tags ^^

    Nachtrag:
    Solche Optimierungen sollte man übrigens erst machen, wenn das Programm weitesgehend steht. Erstmal alles sauber programmieren und dann schauen was man optimieren kann.
    Finde ich nicht, es handelt sich schließlich nicht um eine micro Optimierung sondern um grundlegende Dinge. Es geht mir nicht speziell um das zippen, sondern um das richtige planen von XML Formaten.
    Ein Programm das so datenabhängig wie ein Game Maker ist, viele Baumstrukturen & Objekte, lebt von gut definierten Formaten.

    Ich kann mir z.B. überhaupt nicht vorstellen warum man die gesamten Tiles einzeln speichern will. Sowas wie "Textures/high-grass/" bottom, top, left, right.
    Es ist nicht nur umständlich zu importieren, sondern auch schwer zu bearbeiten. Was wenn ich das Gras umfärben möchte? Muss ich dann alle Dateien einzeln bearbeiten? Sowas löst man normalerweise mit Tilesets/Spritesheets.. was auch meist der Render Performance zugute kommt, da man auf kostbare Texturewechsel in Spritebatches oder ähnliches verzichten kann. Auch das indizieren und cachen fällt leichter.

    Mir sind beim durchschauen noch einige Sachen ins Auge gefallen.
    Zitat Zitat
    <AutoTileDatabase>
    <prototype ID="1" Name="gras-set" Index0="12" Index1="13" Index2="14" Index3="15" Index4="16" Index5="17" Index6="18" Index7="19" Index8="20" Index9="11"/>
    Für sowas sind XML-Attribute nicht geeignet. Es handelt sich um ein Int-Array. Wieso also nicht:
    Zitat Zitat
    <prototype ID="1" Name="gras-set"> <indices> 12,13,14,15,16 <indices/></prototype>
    Zitat Zitat
    <prototype ID="1" Name="Object1" boundingX="2" boundingY="24" boundingWidth="18" boundingHeight="8" animationSpeed="100" scriptName="">
    Der Prototype Tag ist plötlich auch ein Rectangle? Wieso nicht einen extra Tag einführen?
    Zitat Zitat
    <prototype ID="1" Name="Object1" animationSpeed="100" scriptName="">
    <rect x="2" y="24" width="18" height="8"/>
    Ich wette man wird an anderer Stelle ebenfalls ein Rectangle als Bounding Box benötigen, jedoch ohne animationSpeed oder scriptName Attribut.

    Unnötig lange Bezeichner..
    Zitat Zitat
    <AnimationInfo animationID="1" animationTypeID="1"/>
    Man sieht doch im Tag dass es sich um eine AnimationInfo handelt, das "animation" innerhalb der attribute ist also unnötig.
    Zitat Zitat
    <AnimationInfo ID="1" Type="1"/>
    Solche doppelt und dreifach Bezeichner fallen beim lesen von code eher negativ auf. sprite.spritePosition.spriteX.. ihh.

    Zitat Zitat
    <prototype ID="2" Name="forest" columnCount="3" rowCount="2" x0y0="55" x0y1="56" x1y0="53" x1y1="54" x2y0="51" x2y1="52"/>
    x0y0 usw. Kann man auch als Matrix speichern.

    Zitat Zitat
    <prototype ID="1" Name="gras" FileName="gras.png" Path="" transparent_color="" terraintype="0" passability="15"/>
    <prototype ID="2" Name="stone" FileName="stone.png" Path="" transparent_color="" terraintype="0" passability="0"/>
    Den Bezeichner prototype finde ich etwas fragwürdig. Es handelt sich um ein Tile, wieso also nicht <tile>. Hier könnte man auch einige Dinge anders machen um zukünftige Probleme zu vermeiden.
    Zitat Zitat
    <tile ID="1" Name="gras" transparent_color="">
    <image src="fullpath/image/tile.png"/>
    <collision type="solid" passability="15" action="" />
    <terrain type="0" action="#A102"/>
    </tile>
    Als Beispiel. Etwas mehr OOP im Design. Der <collision type="solid"> Tag ist dann für alle möglichen Kollisionsdaten definiert und kann für andere Objekte wiederverwendet werden. So könnte ein Sprite ebenfalls den Tag verwenden. Es ist auch übersichtlicher wenn man die Daten weiter runterbricht.

    Aber nun gut, muss man ja alles nicht so genau nehmen. Mach wie du lustig bist, sollte nur eine kleine Anregung sein

    Geändert von XRPG (10.08.2013 um 15:21 Uhr)

  6. #26
    Ich verweise mal darauf, dass das ganze hier open source ist, und wenn du lust hast, durchaus mir deine Änderungen zukommen lassen kannst
    Ansonsten, klar bin ich froh, wenn man mir ein paar Anregungen gibt

    mfg

  7. #27
    Open Source? Also irgendwie sind mir die Links zu Google Code, GitHub oder SourceForge entgangen. Wo wird das Projekt denn gehostet?
    Ehrlich gesagt kenn ich mich aber auch zu wenig mit Qt aus um etwas beizusteuern.

  8. #28
    Auf meinem Blog und im wiki Ist der Link zu finden. Hab nicht gedacht, das den jemand hier benötigt Ist alles bei github zu finden.
    Allerdings bin ich seit einiger Zeit mit refactoring und optimieren beschäftigt, deswegen Ist es nicht mehr ganz aktuell.

  9. #29
    Jo, mal wieder was von der Front

    Ich hab mir XRPGs Kritik zu Herzen genommen, und überarbeite gerade meinen In-/Output. Das wird noch ein paar Tage dauern, bis ich da durch bin, aber ich denke es wird sich lohnen.
    Die 2. Entscheidung die ich getroffen habe ist, das ich Maps im Binary Format speichern werde. Das wird den extremen Overhead der XML Dateien vernichten und mit Sicherheit auch einen kleinen Geschwindigkeitsschub bringen.

    Wie bereits im letzten Post beschrieben, gehe ich das Projekt gerade von vorne bis hinten durch und schaue was sich optimieren lässt, und wo ich vielleicht nochmal besser was umschreiben sollte. Ich habe einige solcher Stellen entdeckt, deswegen wird es in nächster Zeit auch keinen großartigen (offensichtlichen) Fortschritt geben.

    mfg

    PS: Wer das Programm noch testen möchte, darf das natürlich weiterhin gerne tun. Allerdings spiegelt das mittlerweile nicht den aktuellen Stand wieder.

  10. #30
    Hallo anti-freak

    Ich beobachte dein Projekt hier schon länger. Irgendwie scheint dein Blog nicht mehr zu funktionieren...
    Jedenfalls, tolle Sache an der du da arbeitest, wollte ich bloss mal loswerden!

    Gruss
    Raoh

  11. #31
    Hallo roah,

    vielen Dank für deinen Kommentar
    Mein Blog funktioniert weiterhin wie gewohn. Hast du es vll am 17.8 so gegen 23:50Uhr versucht? Da hatte google ne 2 minütige Downtime :P
    Hier nochmal der Link: http://antis-proggerground.blogspot.de/

    mfg

  12. #32
    So, für alle die denken, es wäre tot...
    Dem ist nicht so
    Ich hatte wenig Zeit und sehr stumpfe Arbeit vor mir (kompletter rewrite von Database und allem was dazu gehört (also praktisch alles :P )).

    Um mal einen kurzen Überblick zu liefern -> der Editor funktioniert noch nicht, alerdings kann ich den meisten Code wiederverwenden. Die Database an sich funktioniert wieder und das auch besser als vorher und in einem hübscheren Code-Design
    Ich brauche noch ein paar Stunden um auf den alten Stand zurück zu kehren, befinde mich aber auf einem guten Weg.

    Mit freundlichen Grüßen

  13. #33
    Da ich gerade ein wenig Zeit habe und unbedingt meine Fortschritte präsentieren möchte, hier mal ein kleines Video zum MapEditor
    Das Video zeigt die grundlegenden Möglichkeiten, die einem mit dem MapEditor zur Verfügung stehen. Das platzieren der MapObjecte und der Script-Punkte fehlt jedoch noch.
    Ich hoffe ich habe mit den Kommentaren alles wichtige erklärt, wenn nicht, einfach mal nachfragen.


Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •