皆さん返信ありがとうございます。
>>ディスクのアクセス速度に依存しますが、少なくともメインメモリへのアクセスよりかなり遅くなります。
そうですか、であればファイルの読み込みを頻発させるのはやめた方がいいですね。
>>Yuoさん
うーん、やはりメモリの使用量を減らす方針で考えた方が良さそうですね。
>>「SQLite」はデータベースです。大きなデータから絞り込んだ情報を検索して取り出し利用するためのモノですので、大きな情報をメモリに読み込むためのものではありません。
>>SQLiteはインメモリDBとしても動作させることができます。と言ってもプロセスが同じなのでメモリの上限を超えることはできませんが。
なるほど、読み込みに関しては他のファイルと変わらないという事ですね。
>>なぜそんなに大きなデータを扱うのか、その種類によって適切な解決策は異なると思います。
>>まぁ、wasawasa さんが返答してくれないと目的もわからないのですが。
>>なんのために「プログラムを作成している途中でint型のデータを記憶する領域を大量に確保しなくてはいけなくなり」となったのか
記憶領域を大量に確保する目的は、不特定多数のデータを取り扱うためです。
詳しい経緯をお話ししますと、まず私はマップ型アクションゲーム用のマップをマップチップを使って作成するエディターのようなアプリを作りたいと思いました。
そこでアクションゲームのマップにはどんなデータが必要かを考えた時に、
1.マップにどのマップチップをどういう配置で使用するかというマップデータ
2.移動制限領域などの座標による判定に使用するための判定データ
以上の二つのデータが必要だと考えました。
次にこれらのデータを表す方法として、
マップデータ:マップチップに番号を割り当て、それを元に配列でマップチップの配置を表現する
判定データ:各マップチップに判定データを設定し、設定した判定データとマップ上のマップチップの配置から計算する
以上の方法を考えました。
そしてこれらの表現方法を前提にマップを作成するエディターの基本システムとして、
1.アプリ起動時に特定のフォルダから複数のマップチップを1枚の画像に保存した「オートタイル」「ノーマルタイル」、マップの背景として使用する「パノラマ」、マップの前面にアクセントとして配置する「フォグ」、以上の4種類の画像ファイルを素材として読み込み、それらのファイル名と画像ハンドルを取得する(これらの4種類のファイルはそれぞれ複数存在するとする)
2.「オートタイル」「ノーマルタイル」に対して判定条件をペイントソフトの図形描画のような操作で設定する
3.判定を設定した「オートタイル」「ノーマルタイル」と読み込んだ「パノラマ」「フォグ」データの中から「オートタイル」7種類と「ノーマルタイル」「パノラマ」「フォグ」各1種類からなるグループを「タイルセット」として定義し、「パノラマ」「フォグ」の表示方法に関するパラメータを設定する(同一の素材データを複数のタイルセットで指定できるものとする)
4.「タイルセット」から一つを選択し、そのデータを元にマップを作成する
5.マップのデータ、タイルセットのデータ、オートタイルとノーマルタイルに設定した判定のデータを画像ファイル名と紐付して出力する(マップを1枚ずつ書いて描画するのではなく、ゲーム内で使用するマップを全て作成した後にまとめて出力する)
以上のような仕様を手持ちのRPG用ゲーム作成ツールを見ながら考えました。
以上の方針でアプリを作成する過程で判定データ込の素材ファイルのデータやタイルセットのデータ、マップのデータ等を保存する領域が必要となったので下記のように定義したところ、やはりというべきか999×5×250000の配列となったマップデータを保存する配列で容量オーバーのエラーが発生してしまったという経緯になります。
もちろん、読み込むファイルや作成するマップの上限として設定する数値を少なくすればエラーは出なくなる事は分かっているのですが、そういった方法でエラーを回避しても後で読み込むファイルの種類を増やすなどの変更を加えた時にまた同じようなエラーが発生してしまいますし、上限を減らし続けた結果作成するものが手持ちのツールの下位互換となってしまうようであれば作成する意義自体が無くなってしまうと思ったので上限を減らす以外に何か方法は無いかと模索しているところです。
これを見て代案を提示して頂けるというのであれば幸いです。
コード:
#define FileNameMAX 256//ファイル名の字数上限(このくらいあれば足りるだろう)
#define FileKindMAX 256//種類ごとのファイルを読み込む上限(このくらいあれば略)
#define HanteiLineMAX 3000//1つの画像ファイルに対する判定図形数上限(マップチップ1000種類分の画像に単位マップチップあたり平均3個を最大と仮定)
#define HanteiKindMAX 10//判定の種類上限(四角形、三角形、円形、…etc 後から変更する可能性大)
#define TileSetNumberMAX 999//タイルセットパターン数上限(このくらいあれば略)
#define MapNumberMAX 999//マップ最大数(このくらいあれば略)
#define MapAreaMAX 250000//マップ最大面積(500×500を最大面積として想定)
#define MapLayerMAX 5//マップレイヤー最大数(最低5層は欲しい)
//---ファイル取扱い基本構造
struct FileBasicPal{
char name[FileNameMAX];//ファイル名[文字列]
int pic;//画像ハンドル
int use;//マテリアルとして使用するファイルかどうか(Yes:1 No:0)
};
//---判定生成用座標データ
struct Jpoint{
int x;
int y;
};
//---判定データ構造
struct JudgeData{
struct Jpoint p1;//第一指定座標
struct Jpoint p2;//第二指定座標
struct Jpoint p3;//第三指定座標
int Jkind;//判定形種類(1:四角形 2:直角三角形 3:円)
};
//---マテリアルタイル構造
struct MaterialTilePal{
char name[FileNameMAX];//ファイル名[文字列]
int pic;//画像ハンドル
struct JudgeData hantei[HanteiKindMAX][HanteiLineMAX];//判定線
int use;//マテリアルとして使用するファイルかどうか(Yes:1 No:0)
};
//---タイルセットフォグ構造
struct TileSetFogPal{
int fogNo;//使用画像番号
int sx;//x速度
int sy;//y速度
int alpha;//透明度
int zoom;//拡大率
int forces;//合成方法
};
//---タイルセットパノラマ構造
struct TileSetPnrPal{
int pnrNo;//使用画像番号
int sx;//x速度
int sy;//y速度
int zoom;//拡大率
};
//---マテリアルデータ
struct InportData{
struct MaterialTilePal ATile[FileKindMAX];//オートタイル
struct MaterialTilePal NTile[FileKindMAX];//ノーマルタイル
struct FileBasicPal Panorama[FileKindMAX];//パノラマ
struct FileBasicPal Fog[FileKindMAX];//フォグ
};
//---タイルセットデータ
struct TileSetData{
int ATileNo[7];//使用オートタイル番号
int NtileNo;//使用ノーマルタイル番号
struct TileSetFogPal Fog;//フォグデータ
struct TileSetPnrPal Panorama;//パノラマデータ
};
//---マップデータ
struct MapData{
int TileSetNo;//タイルセット番号
int MapX;//マップx長
int MapY;//マップy長
int TilePat[MapLayerMAX][MapAreaMAX];//マップ配列
};
struct MapData MapData[MapNumberMAX];
struct TileSetData TileSetData[TileSetNumberMAX];
struct InportData InportData;