Mein Vorschlag
Zu viele kleine PNGs verursachen einen hohen Netzwerk-Overhead (aufgrund der Größe der HTTP-Anforderungen, aber auch des PNG-Headers und wahrscheinlich, was noch wichtiger ist, der Unfähigkeit, eine effiziente Komprimierung durchzuführen). Andererseits hat eine sehr große PNG den Nachteil, dass das Laden einige Zeit in Anspruch nimmt und dauerhaft im Speicher (40 Megabyte für 10.000 Kacheln) in einem zusammenhängenden Speicherblock verbleiben muss.
Ich empfehle den Mittelweg: mehrere PNGs von angemessener Größe, zum Beispiel 1024 Kacheln der Größe 32 × 32 . Vielleicht nach Themen gruppiert (zum Beispiel eine PNG mit Waldkacheln, eine mit Bergkacheln, eine andere mit Stadtkacheln - ich kenne das Thema Ihres Spiels nicht, aber Sie haben die Idee).
Hinweis zur Cache-Effizienz
Wegen der Effizienz des Speicherzugriffs sollten Sie Ihre Spritesheets niemals zu breit machen. Das Ausschneiden von Kacheln aus einem 128 × 8192-Bild ist immer schneller als das Ausschneiden aus einem 8192 × 128-Bild.
Stellen Sie sich vor, Sie möchten die erste Kachel in einem 8192 × 128-Bild aufteilen. Der Einfachheit halber wird angenommen, dass 1 Pixel 1 Byte ist. Die ersten beiden Pixelzeilen sind so angeordnet (Zellen enthalten ihre Bytenummer im Speicher):
┌────┬────┬───┬────┬──────────┬─────┐
│ 0 │ 1 │...│ 31 │ .... │ 8191│ 1st line of pixels: bytes 0 to 8191
├────┼────┼───┼────┼──────────┼─────┤
│8192│8193│...│8223│ .... │16383│ 2nd line of pixels: bytes 8192 to 16383
├────┼────┼───┼────┼──────────┼─────┤
│ .. │ .. │...│ .. │ .... │ ... │
Also, um das blitten ersten Zeile des ersten Titels, wird der Browser - Engine abrufen Bytes 0
zu31
. Um die blitten zweite Zeile , wird es abrufen Bytes 8192
auf8223
, und so weiter , bis der 32. Zeile , in Bytes 253952
zu253983
werden abgerufen.
Die Gesamtzahl der verarbeiteten Bytes beträgt 32 × 32. Der gesamte Speicherbereich beträgt jedoch mehr als 253984 Byte. Auf einer modernen CPU bedeutet dies 32 oder 33 Cachestände . Im Gegensatz dazu würde der Speicherbereich bei einem Bild von 128 × 8192 nur 4000 Byte betragen, was bedeutet, dass nicht mehr als zwei Cachestände vorhanden sind.
Da die heutigen CPUs sehr schnell sind, sind Cache-Stalls sehr teuer und hängen Berechnungen. Die Verwendung eines 128 × 8192-Bilds anstelle eines 8192 × 128-Bilds ist also theoretisch potenziell mindestens achtmal so schnell. In der Praxis hängt dies davon ab, wie das Blitting implementiert wird: Es ist möglich, dass die zugrunde liegende Engine selbst Bilder in Kacheln aufteilt, um das Problem zu verringern.
Das ist nicht leicht zu erklären und ich habe nicht damit gerechnet, viel näher darauf einzugehen. Ich hoffe es macht Sinn!