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:
im klartext zu speichern könntest du folgendes machenZitat:
<Layer>
<MapTiles Tiles="4:1,4:1,5:1, ....
Um die Map zu erhalten dann sowas wie:Zitat:
<layer encoding="base64" compression="zlib" width="500" height="500">
eJzt2kEKAjEMheGizkXUk6gw97+R2QiZUgjUFDLJv/gW7eLRt3C.. <-- die codierten Tile IDs
</layer>
Zip die Map mal, dann siehst du wieviel du in etwa verschwendest. 994kb werden auf ca. 6kb komprimiert.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];
Falls du aus irgendeinen Grund nicht darauf verzichten willst, würde ich trotzdem einige Dinge überdenken. Sowas wie:
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 wieZitat:
<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
Bei AnimationDatabase.xml ist es ähnlich.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>
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:
<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>
Die Frame zeiten werden dann mit frame_times[sprite.t] ausgelesen.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>
Na ja, das viel mir so auf. Hab mir aber auch nicht alles angeschaut.

