Metaseqoiaしかり、Colladaしかり、バイナリじゃなくて、テキストファイルなんですね。
なので、読みやすいという利点はあるんですが、逆に容量が増えがち(アニメーション入れると平気で2~3Mにはなる)
Androidには何気にファイル容量制限があって、機種によっては1Mを超えたくらいでオープンできなくなるし(経験則なので、実際のところは不明)
なので、荒業で「Zip圧縮したファイルを展開しながら読む」って事ができないかなーーと。
JavaにはもともとZipInputStreamという素敵なストリームクラスがあるので、リソース読むにもAssetsから直接読むにも、ZipInputStreamを挟むだけ。
というわけで、Meshクラスのロード部分抜粋
/**
* Assetsフォルダ内のzipファイルからMeshを作成
* @param zipName zip圧縮されたファイル
* @param loader 使用するローダー
* @return
* @throws IOException
*/
public static Mesh getFromAssetsZip(String zipName,MeshLoader loader) throws IOException{
int resID = zipName.hashCode();
//既に読み込まれている
if (meshMap.containsKey(resID)) {
return meshMap.get(resID);
}
ZipInputStream zis = new ZipInputStream(Global.view.getContext().getAssets().open(zipName));
zis.getNextEntry(); //これやらないと、ファイルが読み込めないよ。 1zipに複数ファイル入れないでね。
Mesh newMesh = loader.load(zis);
meshMap.put(resID, newMesh);
return newMesh;
}
/**
* リソースに登録されたzipからMeshを作成
* @param resID リソースID
* @param loader 使用するローダー
* @return
* @throws IOException
*/
public static Mesh getResZip(int resID,MeshLoader loader) throws IOException{
//既に読み込まれている
if (meshMap.containsKey(resID)) {
return meshMap.get(resID);
}
ZipInputStream zis = new ZipInputStream(Global.view.getResources().openRawResource(resID));
zis.getNextEntry(); //これやらないと、ファイルが読み込めないよ。 1zipに複数ファイル入れないでね。
Mesh newMesh = loader.load(zis);
meshMap.put(resID, newMesh);
return newMesh;
}
気をつけるのは getNextEntry(); をやってあげないと、zip内が1ファイルだとしても読み込み準備ができないということ。
ちなみに複数ファイルを圧縮しちゃった場合は知らんぜよ。
これによって、2MぐらいのColladaファイルも圧縮したら200kぐらいになってくれたので、今まで読めなかったファイルも読めるようになったりしました。
いや、もう、Colladaはアニメーションで挫けたので今更ではあるんですが。
0 件のコメント:
コメントを投稿