0

このアプリケーションは、幾何学的座標の大きなstd :: vector <>を割り当てます
。これは、モデルを描画するために最終的にOpenGLに送信されるため、ベクトル(連続していることを意味します)である必要があります。
また、OpenGLは連続したデータを処理します。
ある時点で割り当てが失敗します。これは、メモリを予約するとstd::bad_alloc例外がスローされることを意味します。ただし、現時点ではまだ多くのメモリが空いています。
問題は、隣接するブロックを割り当てることができないことです。
したがって、最初の2つの質問は次のとおりです。

  • CRTがメモリを割り当てる方法を制御する方法はありますか?またはそれを最適化する方法(クレイジーなアイデア))。

  • おそらく、実行時に何らかのサイズのメモリのブロックを割り当てることができるかどうかを確認する方法があります(try / catchを使用しない)。

上記の問題は、この1つの大きなベクトルを複数のベクトルにフラグメント化し、それぞれに対してOpenGLを1回呼び出すことで部分的に解決されました。
ただし、それぞれの小さいベクトルのサイズを定義する方法にはまだ疑問があります。かなり小さいサイズのベクトルがたくさんある場合は、ほぼ確実にメモリに適合しますが、OpenGLの呼び出しが多くなり、視覚化が遅くなります。

4

2 に答える 2

1

32ビットアドレス空間で最大600MiBの連続メモリを超えることはできません。64ビットとしてコンパイルし、64ビットプラットフォームで実行して、これを回避します(できれば永遠に)。

とはいえ、このような厳しいメモリ要件がある場合は、カスタムアロケータを調べる必要があります。ベクターにはメモリベースのストレージとして表示されるディスクベースの割り当てを使用できます。OpenGLのファイルをmmapできます。

于 2012-05-04T07:19:29.333 に答える
0

ヒープの断片化が本当に問題であり、Windows で実行している場合は、 http ://msdn.microsoft.com/en-us/library/windows/desktop/aa366750(v =vs.85).aspx

于 2012-05-04T06:31:11.190 に答える