OpenGL VBO из массива на SD-карте (Android) - PullRequest
0 голосов
/ 06 июля 2011

Я анализирую двоичный файл облака точек и получаю большие массивы точек и их свойства.Они чаще всего не исчерпывают память при распределении по VBO перед рисованием.Мне нужно решение, которое решает проблему с памятью, но все еще достаточно быстро, чтобы заполнить буферы.Поскольку область памяти приложения слишком мала, могу ли я как-то записать «файл» на SD-карту и оттуда заполнить буферы по частям?Я не могу разобрать файл более одного раза.

Сбой строки:

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

1 Ответ

3 голосов
/ 06 июля 2011

Вы смотрели на использование MappedByteBuffer ? Это должно позволить вам один раз проанализировать файл и записать двоичную версию, оптимизированную для памяти, на 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 - это (делимый) размер, который не приводит к сбою приложения. Обратите внимание, что это однопоточное решение, и может быть возможно амортизировать ваши затраты, используя несколько потоков, считывающих меньшие буферы одновременно. Кроме того, хотя на практике это может показаться столь же эффективным, как и поиск и чтение, оно дает гораздо более элегантный и поддерживаемый код. Также вполне возможно, что отображаемые в память файлы могут обеспечить повышение производительности на многих машинах.

Надеюсь, это поможет.

...