私は32ビットOSGEarthプロジェクトで作業しています。ここでは、選択したイメージを1つの大きなイメージにモザイク化する必要があります。 64ビットへの切り替えはオプションではありません。32ビット以上のヒープメモリを割り当てることができます
イメージは256x256タイルの集合としてメモリに格納されます。 問題は、ユーザーが多くのタイルから1つのイメージを作成しようとしたときに、OSGEarthが内部的に32ビットシステムより多くのメモリを割り当てようとしたときに発生します。
私はこの制限を回避するために、それぞれ1025バイトのサイズのデータをいくつか割り当てます。その後、1025バイト目は次のチャンクの先頭に「ポイント」し、最後のバイトはnullptrになります。
これは私が現在、(私は将来的にはより多くを割り当てる予定)やっているものです:私は実際に起こっている起こることを期待していたらどう
unsigned char* start = new unsigned char[1025];
unsigned char** head = &start;
unsigned char** tail = head + 1025;
for (unsigned int i = 0; i < 3; ++i)
{
auto c = new unsigned char[1025];
*tail = &c[0];
tail = &c + 1025;
}
memset(head, 'C', 1025 * 4);
はしかし、私はいくつかの予約を持っています。メモリは本当に1つの連続したブロックに割り当てられていますか?もしそうでなければ、私のmemsetは割り当てられていないデータを書き込んでいます。これは悪い可能性があります。
32ビットの制限はありますか?
* 64ビットに切り替えることはオプションではありません。* - 石から血を搾り取ることはできません。多分それを再考する時でしょうか? – PaulMcKenzie
"OSGEarth [...]が32ビットシステムよりも多くのメモリを割り当てようとすると、問題が発生します。"あなたは3GiB以上の意味ですか? – ysdx
私は地球の高解像度地図を使って作業しています。画像そのものは小さくなる傾向がありますが、OSGが求めているデータは実際にはギガバイト単位で増加しています。 – Acorn