Pull to refresh

Comments 10

Galaxy Nexus 4.1

1. Главный поток, ускорения нет 14fps нет нет
2. Дополнительный поток, ускорения нет 16fps нет нет

1. Главный поток, ускорение есть 57fps есть есть
2. Дополнительный поток, ускорение есть 16fps есть нет
Тема интересная. Спасибо за статью.
Могу поделиться своей практикой.
Я как раз занимался разработкой достаточно большого по размерам (ну например 10000х5000 пикселей) cusotm view дата грида и столкнулся с проблемой недостаточной производительности отрисовки (само представление меняется не часто, разговор больше о скроллинге).
Первый вариант был самым простым — элемент рисовался полностью, но был помещен в контейнер позволяющий скроллить в двух направлениях. Включение апаратного ускорения давало видимый результат, но скорость все равно было недостаточной.
Поэтому было решено перенести ответственность за скроллинг на сам контрол, что дало существенный выигрыш в скорости за счет отрисовки только того, что находиться в «видимом окне». Скорость отрисовки стала сравнима с Google Maps. В принципе остается возможность еще повысить скорость за счет использования bitmap кеша, но пока и этого достаточно. Включение апаратного ускорения в данном случае не давало видимых результатов.
Я, конечно извиняюсь, но если SurfaceView заменить на обычный View, а onDraw на draw, то в SingleThread режиме мы получим нормальную скорость, примерно на 15% медленнее многопоточного режима (41 fps vs 48 на HTC Desire). Если не нужно выжать из устройства максимум, то это вполне разумный компромисс, не говоря о простоте кода и отсутствии синхронизации.
Update: был не совсем прав. Если таймер вызывать не каждую миллисекунду, а с шагом 16 (макс. FPS ~= 60), то получаем всего на 1-2 FPS меньше, чем в AnotherThreadActivity, что говорит о диком флуде сообщениями postInvalidate в изначальном SingleThreadActivity и перечеркивает вообще весь бенчмарк. Извините, но это факт, могу выложить исходники.
Спасибо! Действительно, если заменить SurfaceView на View, то производительность очень сильно возрастает, и показывает, как вы отметили, всего на 1-2 FPS меньше. Про игру с таймером такого не скажу — не заметил разницы между задержками в 1-10-16-30 мс. Надо будет еще поэкспериментировать…
я хоть и android кодер но данную статистику считаю очень полезной и думаю ее надо выносить в отдельную табличку хотя бы на википедию если некуда
А что по поводу ускорения OGL ES (как Вы написали)? Это реально вообще?
Как я понимаю рисование на канвасе ускоряется за счет отрисовки графики на видеокарте через OGL.
Получается в первом случае ускорять уже нечего…
Если перечитать начало статьи, то про ускорение OpenGL ES там не упомянуто (прошу прощения, если ввел в заблуждение). Сама же имплементация OGL на телефонах уже изначально аппаратно ускорена, т.ч. тут может помочь только оптимизация ресурсов и шейдеров. Если производительность все-равно хромает, то тут уже прямая дорога в C/C++. С использованием Ogre3D или PowerVR SDK, можно добиться весьма неплохих результатов.
По канвасу — да, он ускоряется за счет работы с OGL. Об этом также в логах видно при старте активности с флагом ускорения:

07-19 20:48:50.000: D/libEGL(2045): loaded /system/lib/egl/libGLES_android.so
07-19 20:48:50.000: D/libEGL(2045): loaded /system/lib/egl/libEGL_tegra.so
07-19 20:48:50.020: D/libEGL(2045): loaded /system/lib/egl/libGLESv1_CM_tegra.so
07-19 20:48:50.020: D/libEGL(2045): loaded /system/lib/egl/libGLESv2_tegra.so
07-19 20:48:50.030: D/HAL(2045): [HAL] hw_get_module:share library path:/system/lib/hw/gralloc.tegra.so
07-19 20:48:50.030: D/OpenGLRenderer(2045): Creating OpenGL renderer caches
07-19 20:48:50.040: D/OpenGLRenderer(2045): Enabling debug mode 0
07-19 20:48:50.040: D/OpenGLRenderer(2045): Layers will be composited as regions

В моем случае все несколько сложнее… OGL отрисовывается в прозрачном окне поверх системы. Само приложение не тормозит, сделано все через GLSurfaceView, но тормозит система под ним. Я догадываюсь что из-за блендинга полупрозрачного слоя приложение со слоем интерфейса. Что можно сделать в данном случае?
Я думаю может с выходом 4.1 станет получше, но пока не на чем тестировать на скорость.
Only those users with full accounts are able to leave comments. Log in, please.