Clash of Clans(COC)リソースパッケージに関するテクニック


Clash of Clansは、COCと略称され、中国語名の「部族衝突」はiOSプラットフォームでかなり人気のある戦闘戦略ゲームで、開発者はフィンランドのSuperCellで、日本の収入は百万ドル以上で、手遊び史上の神話を作ったという.
画質、遊び方、操作体験、プレイヤーのインタラクション、バランスなどの面で、COCはかなり究極的で、普通の手遊び開発者には及ばない.
では、くだらない話はここまでで、今日は主にそのリソースのパッケージに関するテクニックを共有します.
COCのインストーラの総サイズは約50 M(v 4.120版)で、そのうちリソースは約35.6 Mで、ローエンドのiphone、ipadデバイス、網膜スクリーンのデバイスにかかわらず、画質はかなり優れています.その中にはいったいどんな技術が採用されているのだろうか.下を見てください.
iOS版COCインストーラをダウンロードし、拡張子ipaをzipに変更し、解凍します.リソースファイルはres/scディレクトリのscファイル(このscはSuperCellの略と推定されます)です.ファイル名から、COCはbuildingsとハイビジョンの2つのリソースを採用していることがわかります.scとbuildings_lowres.sc,その中には_が含まれているlowresは普清バージョンで、ハイビジョンバージョンは含まれていません.
ハイビジョン版がある以上、なぜ一般的なデバイスで直接ハイビジョン版でスケールしないのかと聞かれるかもしれません.そうすると、リソース量が小さくなります.
ローエンドデバイスではメモリが限られているため、ハイビジョングラフィックスサイズ2048 px*2048 px、一般グラフィックスサイズ1024 px*1024 px、すなわち、一般グラフィックスサイズがハイビジョングラフィックスの1/4である場合、2048 px*2048 px RGBA 8888フォーマットのビットマップをロードすると、理論的には16 Mメモリが占有され、同じフォーマット1024 px*1024 pxのメモリは4 Mメモリしか必要とせず、一般グラフィックスを使用すると多くのメモリを節約できることが明らかになった.これはローエンドデバイスではかなり大きい.
実際には、1つのリソースだけでなく、ローエンドデバイスでメモリを節約する方法もあります.すなわち、ハイビジョン図のみを用いて、ハイビジョンデバイス上で直接使用し、普清デバイス上で初めて起動すると、プログラムは自動的にハイビジョン図に基づいて縮小してキャッシュディレクトリに保存し、その後、キャッシュディレクトリの下の普清図を直接使用する.
 
scファイルは圧縮ファイルで、修正されたLZMA圧縮アルゴリズムを使用して圧縮されています.もしかすると、LZMA圧縮アルゴリズムを知らないかもしれませんが、7-zipという圧縮ツール、あるいはlinuxの下で新興の高圧縮比のxz圧縮ツールを知っているはずです.実際、7-zipの圧縮のデフォルトはLZMA圧縮アルゴリズムを採用しています.linuxの下のxzはLZMAのアップグレード版に相当します.標準的なLZMA圧縮ファイルのファイルヘッダは5+8バイトで構成され、上位5バイトには圧縮方式、辞書サイズなどの情報が格納され、後8バイトは圧縮前のファイルサイズである.COCで使用される修正後のLZMAアルゴリズムは、ファイルヘッダが5+4バイトで構成されており、標準アルゴリズムと比較して圧縮前のファイルサイズを示す8バイトのみを4バイト(ゲームリソースでは4バイトで表示できるファイルサイズで十分)に変更することで、標準的なLZMA圧縮アルゴリズムの解凍ツールを使用し、すべて正常に解凍することができなくて(ほとんどの場合取り出した圧縮前のファイルの大きさがかなり大きいため)、このようにして、簡単な修正を通じて、ゲームの資源を比較的によく圧縮することができて、また比較的に良い保護の資源は他の人に直接解凍されないで、本当にとても上手です.
標準LZMAアルゴリズムの解凍ツールを用いるCOC中の資源を正確に解凍するには、9バイト目の後にloadingのような4つの0バイトを挿入すればよい.scファイルの最初の13バイトは以下の通りです.
0x5D 0x00 0x00 0x04 0x00 0x2F 0xC9 0x42 0x00 0x00 0x07 0xFF 0xFD
9バイト目の後に0バイトを4つ挿入し、次の形式にします.
0x5D 0x00 0x00 0x04 0x00 0x2F 0xC9 0x42 0x000x00 0x00 0x00 0x00 0x00 0x07 0xFF 0xFD
保存すると、7-zipなどのツールで解凍できます.
解凍されたファイルは、合計約195 Mで、圧縮比は18.26%に達し、LZMA圧縮アルゴリズムを自分のプロジェクトに適用するのは、良い選択です.
このように解凍したファイルは、まだビットマップではないので、直接見ることはできません.
 
解凍されたファイルフォーマットはscファイルフォーマットと呼ばれ、その構造は以下の通りです.
タイプ1
長さ1
データブロック1
タイプ2
長さ2
データブロック2
...
...
...
タイプn
長さn
データブロックn
ここで、タイプは1バイトで、データ・ブロックがどのタイプで、長さが4バイトであるかを識別し、その後のデータ・ブロックのバイト長を表します.
 
タイプ1はテクスチャ(texture)であり、そのデータブロック構造は以下の通りである.
テクスチャフォーマット(Texture Format)
テクスチャの幅(Texture Width)
テクスチャの高さ(Texture Height)
テクスチャデータ
ここで、フォーマットは1バイト、幅は2バイト、高さは2バイトです.
フォーマット3はRGBA 8888フォーマットで、ビットマップを得るには、必要な学生が自分でコードを書いて実現しましょう.ここでは提供しません.
 
簡単なPHPの解凍コードを添付します.
<?php
define('DS', DIRECTORY_SEPARATOR);

function fixFile($filename) {
    echo "Begin fix {$filename} ... 
"; $dataStr = file_get_contents($filename); $newDataStr = substr($dataStr, 0, 9) . "\x00\x00\x00\x00" . substr($dataStr, 9); $newFilename = str_replace('.sc', '.lzma', $filename); file_put_contents($newFilename, $newDataStr); echo "Fix {$filename} OK!

"; } // $dir = dirname(__FILE__); // ? $dir = substr(__FILE__, 0, -1 * (strlen(basename(__FILE__)) + 1)); $zipFileArr = glob($dir . DS . 'Clash of Clans*.ipa'); foreach ($zipFileArr as $zipFile) { echo "Begin extract {$zipFile} ...
"; $zip = new ZipArchive(); if ($zip->open($zipFile) === TRUE) { $extractPath = str_replace('.ipa', '', $zipFile); if (!file_exists($extractPath)) { mkdir($extractPath); } $zip->extractTo($extractPath); $zip->close(); echo "Extract to {$extractPath} OK!

"; $scPath = $extractPath . DS . 'Payload' . DS . 'Clash of Clans.app' . DS . 'res' . DS . 'sc'; $scFileArr = glob($scPath . DS . '*.sc'); foreach ($scFileArr as $scFile) { // fixFile($scFile); } $exePath = 'D:\Program Files (x86)\7-Zip\7z.exe'; if (file_exists($exePath)) { $cmd = sprintf('"%s" e -y -o"%s" "%s"', $exePath, $scPath, $scPath . DS . '*.lzma'); echo "{$cmd}
"; passthru($cmd); } $cmd = "%SystemRoot%\explorer.exe /e,{$scPath}"; passthru($cmd); } else { echo "Extract {$zipFile} fail!
"; } }

COCのipaインストールファイルをスクリプトのあるディレクトリに配置し、7-zipをインストールする必要があります.具体的なディレクトリはコードを参照してください.