私のおすすめ
小さいPNGが多すぎると、多くのネットワークオーバーヘッドが追加されます(HTTPリクエストのサイズだけでなく、PNGヘッダー、そしておそらくさらに重要なことに、効率的に圧縮できないため)。一方、非常に大きなPNGには、ロードに時間がかかり、連続したメモリチャンクでメモリ(10,000タイルで40メガバイト)を永続的に保持する必要があるという欠点があります。
私は中間的な場所をお勧めします:いくつかの適度なサイズのPNG、例えばサイズ32×32の1024タイル。テーマごとにグループ化することもできます(たとえば、森林タイルのあるPNG、山タイルのあるPNG、都市タイルのあるPNG-ゲームのテーマはわかりませんが、アイデアはわかります)。
キャッシュ効率に関する注意
メモリアクセスの効率のため、スプライトシートの幅を広げすぎないでください。128×8192画像からのタイルのブリットは、8192×128画像からのブリットよりも常に高速です。
8192×128の画像の最初のタイルをブリットすることを想像してください。簡単にするために、1ピクセルが1バイトであると仮定します。最初の2行のピクセルは次のように配置されます(セルのメモリにはバイト番号が含まれます)。
┌────┬────┬───┬────┬──────────┬─────┐
│ 0 │ 1 │...│ 31 │ .... │ 8191│ 1st line of pixels: bytes 0 to 8191
├────┼────┼───┼────┼──────────┼─────┤
│8192│8193│...│8223│ .... │16383│ 2nd line of pixels: bytes 8192 to 16383
├────┼────┼───┼────┼──────────┼─────┤
│ .. │ .. │...│ .. │ .... │ ... │
したがって、最初のタイトルの最初の行をblitするために、ブラウザエンジンはにバイト0
を31
取得します。2行目をblitするには、バイト8192
を8223
取得する32行目までバイト253952
を253983
取得します。
処理されるバイトの総数は32×32です。ただし、合計メモリ範囲は253984バイトを超えています。最新のCPUでは、これは32または33のキャッシュストールを意味します。対照的に、イメージが128×8192の場合、メモリ範囲は4000バイトのみであり、キャッシュストールが2つ以下であることを意味します。
今日のCPUは非常に高速であるため、キャッシュストールは非常に高価であり、計算がハングします。そのため、少なくとも理論的には、8192×128画像の代わりに128×8192画像を使用すると、潜在的に8倍高速になります。実際には、これはブリットの実装方法に依存します。基礎となるエンジン自体が画像をタイルに分割して問題を軽減する可能性があります。
これを正確に説明するのは簡単ではなく、あまり詳しく説明することも期待していませんでした。それが理にかなっていることを願っています!