Так что, если я правильно понимаю, ваш код работает, но вам нужно его оптимизировать. Возможно, вы захотите дать полное описание того, что вы пытаетесь достичь, чтобы получить несколько идей, но из вашего кода может быть несколько указателей. Убедитесь, что вы сами создали тестовый сценарий с измеримыми результатами, чтобы увидеть, какая процедура оптимизировала ваш код и насколько.
Звонок на glReadPixels
может занять очень много времени, поэтому постарайтесь максимально уменьшить его. Вы используете его в цикле for, который, если я правильно читаю, читает весь размер буфера, смещенный на x
, y
, что означает, что он переполнен рядом с другими вещами. Я считаю, что вы пытались сделать: GLES20.glReadPixels(x, y, 1, 1
, который читает один пиксель в определенной позиции. Это должно дать вам прирост производительности, но, как упоминалось в комментарии @ Rabbid76, есть подозрение, что вы получите производительность, прочитав весь буфер, а затем перебирая пиксели.
Некоторые процедуры могут быть выгружены непосредственно в графический процессор, и проверка того, какой пиксель является «самым большим», выглядит прямо как одна из них. Вы можете создать FBO (объект кадрового буфера) и продолжать перерисовывать одну и ту же текстуру в буфер, который в два раза меньше размера каждого измерения, используя шейдеры для сохранения больших значений. В конце вы получите буфер с одним пикселем, который содержит ваше значение, но проблема в том, что вы потеряли позицию этого пикселя (где он был изначально).
Чтобы немного объяснить процедуру перерисовки текстуры, представьте, что у вас есть текстура 2x2, которая будет перерисована в буфер 1x1. Фрагментный шейдер выберет 4 ближайших пикселя и выведет самый большой, как в:
gl_fragColor = vec4(max(t1.r, max(t2.r, max(t3.r, t4.r))), max(t1.g, max(t2.r, max(t3.g, ...
, где tN
- образцы в (0.25, 0.25)
, (0.75, 0.25)
, (0.25, 0.75)
, (0.75, 0.75)
.
Это будет выполняться только для одного фрагмента, но предыдущий вызов будет с тем же шейдером, перерисовывающим текстуру 4x4 в буфер 2x2, имеющий 4 фрагмента. То же самое 16x16 перерисовывается в 4x4 ... Так что все, что вам действительно нужно было сделать, - это преобразовать эти константы в шейдере в униформу и вычислить их.
Вы должны иметь возможность даже поместить эту работу в отдельный поток и пропускать кадры, если это разрешено и необходимо, когда это слишком дорого. Затем видео должно воспроизводиться без перерывов.