最適なdatafile形式で読み込み、ゲームコンソール
-
19-09-2019 - |
質問
い負荷の大規模なモデルやその他の構造のバイナリデータは、古いCD-ゲームコンソールなどが可能です。何をしていきますか?これらのデータから輸出されたPythonます。このかわいらしい精巧な趣味。
Requierements:
- ない信頼を完全規格に準拠したSTL-iを利用する場合がありまuSTLものです。
- 小架しています。を目指し、溶液の方が良さそうですね。ることができるのPlaystationいとして奈良時代初期、東北の政治行政とが可能です。
- な傾互換性が必要です。
- コピーの大きな塊の周り好ましくはファイルの読み込みロ背景に、すべての大きな塊から直接アクセスがあります。
- できるとは限らないの対象が同じになることendiannessは、アライメント、すなわちCのプラグインは、Pythonにおける堆積場、その構造体をディスクとなるものではない非常に良い方法がありました。
- べきである移動ロードされたデータは、個々のファイルの1/3程度のメモリの断片化が課題です。なMMUをしています。
- 頑健性はボーナスとして注目のスパンが非常に短い、すなわちい変化省の一部のコードを忘れての負荷はその逆で、少なくとも拠を保護いいですね。
- 交換性の間にロードデータおよび実行時の生成がないとデータ実行時の頭のな厳しいメモリ管理の問題ができます。
そういうのってセミ-プランの解析にPythonの些細な、限定-書式]Cヘッダを使用構造体とのオフセットの代わりにポインタ、ラッパー構造体/授業をメインにアプリとsetterかるように変換す-オフセットが正しく入力ポインタ/を参照してしまいましたが、まず私がお聞かせ下さいたします。
解明:申請の主としてデータの載荷枠組みおよびメモリ管理の問題です。
解決
これは一般的なゲーム開発パターンです。
の通常のアプローチは、オフライン前処理ステップでデータを調理することです。得られたブロブは、最小限のオーバーヘッドでストリーミングすることができます。塊は、プラットフォームに依存しており、ターゲットプラットフォームの適切なアライメント&エンディアンが含まれている必要があります。
実行時には、あなたは、単にメモリ内のBLOBファイルへのポインタをキャストすることができます。あなたにも、ネストされた構造を扱うことができます。あなたはブロブ内のすべてのポインタ値にオフセットして目次を続ける場合は、その後、修正アップすることができますポインタを適切なアドレスを指すように。これは、DLLの読み込みがどのように機能するかに似ています。
私は、私がデータを調理するために使用することは、バーベキューに、ルビーライブラリに取り組んできました私のiphoneゲーム。
ここで私はブロブのヘッダに使用するメモリレイアウトです:
// Memory layout
//
// p begining of file in memory.
// p + 0 : num_pointers
// p + 4 : offset 0
// p + 8 : offset 1
// ...
// p + ((num_pointers - 1) * 4) : offset n-1
// p + (num_pointers * 4) : num_pointers // again so we can figure out
// what memory to free.
// p + ((num_pointers + 1) * 4) : start of cooked data
//
ここで私は、バイナリブロブファイルをロードし、ポインタを修正方法は次のとおりです。
void* bbq_load(const char* filename)
{
unsigned char* p;
int size = LoadFileToMemory(filename, &p);
if(size <= 0)
return 0;
// get the start of the pointer table
unsigned int* ptr_table = (unsigned int*)p;
unsigned int num_ptrs = *ptr_table;
ptr_table++;
// get the start of the actual data
// the 2 is to skip past both num_pointer values
unsigned char* base = p + ((num_ptrs + 2) * sizeof(unsigned int));
// fix up the pointers
while ((ptr_table + 1) < (unsigned int*)base)
{
unsigned int* ptr = (unsigned int*)(base + *ptr_table);
*ptr = (unsigned int)((unsigned char*)ptr + *ptr);
ptr_table++;
}
return base;
}
私のバーベキューのライブラリは、プライムタイムのためにかなり準備ができていないが、それはあなたにいくつかのアイデアを与えることができますpythonで1を自分で作成する方法についてます。
グッドラック!
他のヒント
プラットフォームのようなゲームキューブのように、3Dモデルは通常の保管が非常にシンプルでカスタムフォーマット:
- 簡単なヘッダを含む、マジック番号を特定するファイルの頂点数分の数が存在,以下の二つの条件を考慮等 オプションとしてのチェックサムのデータのヘッダ(Adler-32,CRC-16です。
- それよりも圧縮のリストの32ビット浮動小数点の3タプルを各ベクターおよび正常です。
- それよりも圧縮のリストの縁やます。
- すべてのデータは、ネイティブエンディアン形式についての情報を表示します.
- 圧縮形式がしばしば自明な(ハフマン)、(算数)、または標準(gzip).すべての手続きを行うことが求められ非常に少ないメモリ計算ます。
などに連れて行くことができォているようであるが、これはcue:これはコンパクトに表現。●
私の提案は使用形式に最も類似するお-メモリデータ構造を最小限にとどめ、後処理およびコピーができその手段を作成する形式で、自分でできます。い極端なご要望にお応えできるように極端な対策が必要です。
したがってもご説明いをお願いしたい"プログラムのしやすさ".:-)
このように、ここのえんどをこの:
データのあるべきと同じディスクフォーマットでこのメモリは、できるだけ引用途にでも便からディスクメモリのないreformattingます。によってどのくらい自由にいてもメモリ、用途にでも便"の全ファイル、またはできる小さなビット以内でかわからないお客様のデータは十分に示唆する方法subdivideいものと考えることができます。できないな自然のendiannessとアライメントをホストする必要がありますの少ない翻訳も書くときのファイルをホスト側が、少なくともこのようにする必要があるのはさんは、移転なります。
を提供するためにビットの保証は、対象となる側と宿主側のコードの試合も書きする場合に提供する単一のデータの説明としての世代のコードを生成するの両方を対象側のCコードをホスト側のPythonコードからです。きものをお持ちの発電機を生成する小さなランダム"バージョン"の工程では、ホスト側のコードを書くこのファイルにヘッダー及び対象者側のチェックしてもらい、ときにエラーに決めなければならない。ポイントをランダムな値は、情報ビットがすべてがかわいいをいただきました値です。)
SQLiteのDBでBLOBとしてデータを保存することを検討してください。 SQLiteのは非常にポータブルでlighweightある、ANSI Cは、C ++とPythonの両方のインターフェースを有しています。これには、大きなファイルのケア、高速アクセスとノー断片化、可変長レコード、およびがかかります。残りはこれらのBLOBへの構造体の単なる直列化されます。