Хобрук: Ваш путь к мастерству в программировании

GLES20.glReadPixel слишком медленный

Это старый вопрос, но я хотел бы получить ответ с кодом.

Следующее слишком медленно для реального времени. Я намерен использовать его позже с совместным использованием экрана OpenTOK. Любая быстрая замена?

ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
bb.order(ByteOrder.nativeOrder());
GLES20.glReadPixels(0, 0, width, height, GL_RGBA,
        GL10.GL_UNSIGNED_BYTE, bb);

int pixelsBuffer[] = new int[screenshotSize];
bb.asIntBuffer().get(pixelsBuffer);
final Bitmap bitmap = Bitmap.createBitmap(width, height,
        Bitmap.Config.RGB_565);
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width,
        0, 0, width, height);
pixelsBuffer = null;

short sBuffer[] = new short[screenshotSize];
ShortBuffer sb = ShortBuffer.wrap(sBuffer);
bitmap.copyPixelsToBuffer(sb);

for (int i = 0; i < screenshotSize; ++i) {
    short v = sBuffer[i];
    sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11));
}
sb.rewind();
bitmap.copyPixelsFromBuffer(sb);

PS: я уже пробовал GL_RGB и GL_BGRA, но это все еще медленно, и я получаю только черный экран.



Ответы:


1

Во-первых, glReadPixels не является причиной замедления вашего кода. Все выделение буферов и конвертация изображения в другой формат есть.

Повторное использование буферов. Выделите их один раз и используйте повторно.

ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
bb.order(ByteOrder.nativeOrder());

С этим битом проблем нет.

GLES20.glReadPixels(0, 0, width, height, GL_RGBA,
        GL10.GL_UNSIGNED_BYTE, bb);

Теперь вы готовитесь к преобразованию в другой формат, который имеет много накладных расходов. Придерживайтесь полученного формата. И снова вы выделяете буферы вместо повторного использования.

Однако растровое изображение можно выделить один раз и использовать повторно.

int pixelsBuffer[] = new int[screenshotSize];
bb.asIntBuffer().get(pixelsBuffer);
final Bitmap bitmap = Bitmap.createBitmap(width, height,
        Bitmap.Config.RGB_565);
bitmap.setPixels(pixelsBuffer, screenshotSize - width, -width,
        0, 0, width, height);
pixelsBuffer = null;

short sBuffer[] = new short[screenshotSize];
ShortBuffer sb = ShortBuffer.wrap(sBuffer);
bitmap.copyPixelsToBuffer(sb);

Тогда вам не понадобится это ненужное преобразование.

for (int i = 0; i < screenshotSize; ++i) {
    short v = sBuffer[i];
    sBuffer[i] = (short) (((v & 0x1f) << 11) | (v & 0x7e0) | ((v & 0xf800) >> 11));
}

Затем можно использовать copyPixelsFromBuffer(), если ваш Bitmap имеет тот же формат.

bitmap.copyPixelsFromBuffer(bb);

Как правило, растровые изображения Android имеют тот же формат, что и GL_RGBA, поэтому маловероятно, что вам потребуется конвертировать. Вышеприведенное сводит все к простому чтению и копированию.

24.05.2017
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..