0

バイナリポイントクラウドファイルを解析し、ポイントとそのプロパティの大きな配列を取得します。これらは、描画する前にVBOに割り当てるときに、メモリが不足しないことがよくあります。メモリの問題を処理するソリューションが必要ですが、それでもバッファにフィードするのに十分な速度です。アプリケーションのメモリスペースが小さすぎるので、どういうわけか「ファイル」をSDカードに書き込み、そこから区分的にバッファにデータを入力できますか?ファイルを複数回解析できません。

クラッシュライン:

-->ByteBuffer vbb = ByteBuffer.allocateDirect(lasVertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(lasVertices);
vertexBuffer.position(0);
4

1 に答える 1

3

MappedByteBufferの使用を検討しましたか?これにより、ファイルを1回解析し、メモリに最適化されたバイナリバージョンをsdcardに書き込んで、チャンクで高速に読み戻すことができます。

// Open the file here, store it in a field
RandomAccessFile file = null;
try {
    mFile = new RandomAccessFile("/sdcard/reallyLargeFile.dat", "r");
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

レンダリングしたい場所で、これを行います:

for (int offset = 0; offset < POINTS_SIZE; offset += BLOCK_SIZE)
if (file != null)
    try {
        MappedByteBuffer buffer = file.getChannel().map(FileChannel.MapMode.READ_ONLY, offset, BLOCK_SIZE);
        vertexBuffer.put(buffer);

        vertexBuffer.position(0);

        // Render here
    } catch (IOException e) {
        e.printStackTrace();
    }

ここで、POINTS_SIZE=ポイントの総数*4(=フロートのサイズ)およびBUFFER_SIZEは、アプリケーションをクラッシュさせない(分割可能な)サイズです。これはシングルスレッドソリューションであり、より小さなバッファを同時に読み取る複数のスレッドを使用することでコストを償却できる可能性があることに注意してください。また、これは実際には一連のシークと読み取りと同じくらい効率的であることが判明するかもしれませんが、はるかにエレガントで保守可能なコードを生成します。また、メモリマップトファイルが多くのマシンのパフォーマンスを向上させる可能性もあります。

お役に立てれば。

于 2011-07-06T15:04:34.383 に答える