Как обойти проблемы с производительностью с Buffer.put () и Android OpenGL - PullRequest
3 голосов
/ 09 августа 2010

Это вообще проблема с Java, хотя в данном конкретном случае я использую Vertex Arrays в Android для OpenGL. Чтобы использовать эту базовую систему GL, вы должны использовать систему Java Buffer в собственном режиме выделения. Это очень медленно на Java. И примерно 40-50% времени всего моего приложения тратится внутри buffer.put ().

Есть ли способ ускорить это, оставаясь в Java (т. Е. Не использовать нативный SDK)?

Ответы [ 3 ]

1 голос
/ 19 августа 2010

Я столкнулся с аналогичной проблемой при интеграции Java и JOGL - мое решение состояло в том, чтобы управлять ресурсами буфера в C и использовать JNI для передачи указателя на буфер в Java с помощью метода

jobject NewDirectByteBuffer(JNIEnv * env, void * address, jlong capacity); 

найдено в jni.h. Когда вам нужно обновить смещение в буфере, используйте отражение, чтобы вручную изменить поле «адрес», найденное в java.nio.Buffer. Если добавление большего количества элементов приведет к превышению емкости буфера в C, используйте список массивов в C и укажите точку прямого буфера для массива, поддерживающего список.

0 голосов
/ 18 августа 2010

Избегайте выделений в целом. Используйте пул буферов и манипулируйте ими по мере необходимости. Вы можете иметь несколько стандартных размеров и тратить несколько байтов в конце в обмен на производительность. Кроме того, при использовании OpenGL вам обычно не нужно переписывать свои буферы каждый кадр (разве вы не делаете обширные скины или анимации?). Обычно у вас есть предварительно запеченные массивы, преобразующие объекты с использованием матриц, и все.

0 голосов
/ 17 августа 2010

Единственное, что вы можете сделать на самом деле, - это пакетировать свои задания и надеяться, что реализация в телефоне будет достойной, поскольку штраф за блокировку и разблокировку.Если вы делаете пакетные звонки, водитель должен заблокировать и разблокировать один раз.Если вы сделаете это «самопроизвольно», вы будете все время блокировать и разблокировать, что даст вам здоровенный удар по производительности.Если водитель недостаточно умен, чтобы отображать буферы в оперативную память только один раз, а не для каждого колла, лучше всего просто минимизировать количество путов.

...