Войти
ПрограммированиеФорумГрафика

Отсутствие прироста производительности между Snapdragon 801 и 855

Страницы: 1 2 3 Следующая »
#0
(Правка: 14:36) 14:33, 9 окт. 2019

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

Был у меня телефон OnePlus One с Snapdragon 801, и на нём 10 миллионов частиц на FullHD выдавали 7 FPS.
Сейчас у меня OnePlus 7 Pro с Snapdragon 855, и на нём те же 10 миллионов частиц выдают... 4 FPS! Если понизить разрешение до FullHD+, получаются те же 7 FPS. Если уменьшить разрешение ещё в два по обеим осям, то становится 11 FPS.
Прошло 5 лет, сменилась куча поколений процессоров, я ожидал значительный прирост, но нет никакого прироста совсем. Почему? Может какие-то принципы работы новых GPU поменялись и overdraw стал ещё более невыгодным? Или всё упирается в скорость RAM и она за 5 лет так и не выросла?
Есть у кого-нибудь какие-нибудь идеи?
Или может это какая-то особенность именно моего телефона или прошивки? Если у вас есть устройства Snapdragon 8xx, просьба протестировать и написать, какой у вас FPS.


#1
14:40, 9 окт. 2019

Xiaomi Mi9(855):
Fullres: 5 fps
Halfres: 9-11 fps

#2
14:59, 9 окт. 2019

gammaker
> Или может это какая-то особенность именно моего телефона или прошивки? Если у
> вас есть устройства Snapdragon 8xx, просьба протестировать и написать, какой у
> вас FPS.
Ориентируйся на грубую статистику флопс для GPU https://gflops.surge.sh/
adreno 330 ~160 gflops
adreno 640 ~1000 gflops
То есть бутылочное горлышко явно не в GPU которое стало мощнее в разы. Проблема может быть в cpu/fillrate/где-то ещё.

#3
17:14, 9 окт. 2019

Если там используется блендинг, то ничего удивительного. Ну и то что тайл ждет когда ты отправишь все полигоны на отрисовку прежде чем начинать рисование на гпу, это не очень хорошо, но с этим мало что можно сделать. На синтетических тестах овердроу раза в 2 снижал производительность на мобилках.

#4
19:39, 9 окт. 2019

Che@ter
Спасибо за тест. Теперь понятно, что дело скорее всего не в устройстве и прошивке.

Заодно, если не затруднит, буду благодарен за отзыв или оценку :)

Kripto289
> То есть бутылочное горлышко явно не в GPU которое стало мощнее в разы. Проблема
> может быть в cpu/fillrate/где-то ещё.
Точно не CPU, потому что там всего несколько сотен вызовов GLES 2.0 на кадр и нет никаких расчётов. Все вычисления делает вершинный шейдер. Так как есть зависимость от разрешения, видимо дело в fillrate. Но она не прямо пропорциональна, потому что много частиц размером в 1 пиксель. Но непонятно, почему fillrate не вырос за всё это время совсем. Понятно, что скорость памяти растёт медленнее, чем флопсы, но растёт же?

/A\
> Ну и то что тайл ждет когда ты отправишь все полигоны на отрисовку прежде чем
> начинать рисование на гпу
Вот эта часть непонятна. Я не очень хорошо разбираюсь с тем, как работают мобильные GPU с их тайлами. У меня по сути есть один неизменяемый VBO и я его много раз отправляю на отрисовку с разными значениями uniform. CPU по сути ничего не делает. А тайл чего тогда ждёт?

#5
20:05, 9 окт. 2019

Странно, на Pixel 1 (Snapdragon 821, 1920x1080):
Fullres: 10-11 fps
Halfres: 10-11 fps
То есть переключение на 0.5x не прибавляет производительности (хотя картинка становится хуже).
Все настройки по умолчанию кроме количества, которое 10 млн.

#6
(Правка: 20:19) 20:19, 9 окт. 2019

gammaker
> А тайл чего тогда ждёт?
Тайл в скринспейссе, если ты меняешь матрицу, если считаешь анимации в вершинном шейдере, то он будет ждать пока все завершиться, чтоб иметь полный список треугольников, которые будут рисоваться в тайле.
То есть фрагментные шейдеры не запустятся пока не отработают все вершинные шейдеры.
Есть еще вендорские оптимизации, когда они выполняют часть вершинного шейдера, чтоб получить позицию, а все остальное расчитывается потом, уже в тайле, например анимация текстурных координат, цвета и тд.

#7
21:22, 9 окт. 2019

Apfel1994
> Странно, на Pixel 1 (Snapdragon 821, 1920x1080):
Я тоже сейчас проверил на планшете Galaxy Tab S4 (Snapdragon 835, 2560x1600) и там 11-12 FPS как в полном, так и в половинном разрешении. Интересно, как поведёт себя Snapdragon 845?

/A\
> Тайл в скринспейссе, если ты меняешь матрицу, если считаешь анимации в
> вершинном шейдере, то он будет ждать пока все завершиться, чтоб иметь полный
> список треугольников, которые будут рисоваться в тайле.
Он ждёт завершения дипа или всего кадра? У меня размер дипа 16384 частиц = 16384 вершин (point sprites). Стоит ли увеличить или сделать меньше?
Или может другие траектории с большей локальностью частиц будут считаться быстрее? Или лучше по-любому сделать не получится?

#8
21:33, 9 окт. 2019

gammaker
Не знаю, тут надо экспериментировать, с частицами сложно предположить как лучше.

#9
(Правка: 21:49) 21:47, 9 окт. 2019

gammaker
> Может какие-то принципы работы новых GPU поменялись и overdraw стал ещё более
> невыгодным? Или всё упирается в скорость RAM и она за 5 лет так и не выросла?
Эх, небольшая ремарка о мобильном прогрессе, а точнее его странному течению.
Вот идёт обсуждение топовых Adreno 640, а тем временем 30% устройств до сих пор сидят на opengl 2.0 и ублюдском mali 400/450. Напоминаю, мобильный gpu чип 2008 года. Ему 11 лет. И эту парашу до сих пор ставят в последние процессоры. У меня дико горит от этого производителя.
Например приставки xiaomi box недавнего выпуска на mali 450.
Это прямо какой-то сюр. Почему на пк никто никогда не будет выпускать видеокарты старого поколения? А уж тем более 11 - летней давности.
В дополнение, тесселяцию и геометрические шейдера, которым лет 10 уже, завезли 1-2 года назад в opengles 3.2.
К чему это я? К тому что бутылочным горлышком может быть что угодно. Хрен их знает этих производителей и opengles писателей. В телефонах куча ограничений fps, оптимизаций потребления, парковки ядер, тайловые рендеры, низкая шина памяти и т.д. И узкое горлышко может быть в чём угодно, включая баги прошивок.

ps Лично тестил lineage 7.0 vs стоковый android 4.4 vs 5.0 на xperia Z.
Фпс на 4.4 был в 2-3 раза выше чем на lineage 7.0. А на 5.0 был примерно на 50% меньше

#10
22:09, 9 окт. 2019

Kripto289

Вот идёт обсуждение топовых Adreno 640, а тем временем 30% устройств до сих пор сидят на opengl 2.0 и ублюдском mali 400/450.

Ну это ещё зависит от целевой аудитории, наверное.
Меня тоже беспокоило засилье OpenGL ES 2.0 устройств, но по текущей статистике CAD Assistant'a это уже не такая уж проблема:
OpenGL ES 2.0:    2.27%
OpenGL ES 3.0:    12.95%
OpenGL ES 3.1:    20.69%
OpenGL ES 3.2:    84.05%

Тут есть неприятность в устройствах с OpenGL ES 3.0.
По моему личному опыту, эти устройства имеют очень кривые драйвера, которые ведут к разного рода проблемам при попытке использовать это самое 3.0 (в первую очередь в шейдерах), а не 2.0 - вплоть до того, что тот же самый шейдер без изменений с версией 100 es работает нормально, а с версией 300 es выводит какой-то бред. Устройства с OpenGL ES 3.1+ уже более адекватны в этом плане.

Сорри за оффтоп...

#11
(Правка: 22:37) 22:32, 9 окт. 2019

gkv311
> Ну это ещё зависит от целевой аудитории, наверное.
> Меня тоже беспокоило засилье OpenGL ES 2.0 устройств, но по текущей статистике
> CAD Assistant'a это уже не такая уж проблема:
Есть более актуальные статы
https://developer.android.com/about/dashboards
https://www.khronos.org/opengles/

GL 2.0  21.1%
GL 3.0  29.8%
GL 3.1  13.6%
GL 3.2  35.5%

Это же беспредель, импосибле. Opengles 3.0 вышел 7 лет(!) назад. До сих пор в 2019 году 21% устройств поддерживают только opengl 2.0.
Напомню что телефоны так долго не живут и это новые модели на opengles 2.0.

Одно радует, под такое говно никто не ориентируется, потому что mali 450 больше чем пару кубиков отрендерить не в состоянии.
Но вот тесселяция поддерживается только на 35% устройств. Как же долго идёт прогресс. API устаревает быстрее, чем его начинают поддерживать хотя бы половина устройств.
Гугл мог давно заставить последние версии прошивок работать с минимальными требования для opengles. Это исключило бы говно-450 от мали в 2019 году и прогресс шел бы быстрее.

#12
(Правка: 22:50) 22:50, 9 окт. 2019

Kripto289
> Есть более актуальные статы
Это статистика по всей платформе.
Мои данные - такие же актуальные, но по одному конкретному приложению.
Но 20% OpenGL ES 2.0 по платформе в целом, конечно, печалят...

#13
23:13, 9 окт. 2019

Kripto289
> Одно радует, под такое говно никто не ориентируется, потому что mali 450 больше
> чем пару кубиков отрендерить не в состоянии.
В целом Mali 4xx мои частицы тянет, пусть и с большим трудом. Поэтому я решил ограничиться GLES 2.0, благо я придумал метод их рендеринга и расчёта на GPU, который при этом работает на GLES 2.0 без transform feedback и вычислительных шейдеров.

Я как-то попробовал поставить миллиард частиц на старом телефоне HTC с Mali 450 MP6 и он просто взял и отрендерил кадр с миллиардом частиц, при этом даже не зависнув! На это ушло несколько минут, да, но интерфейс Android'а при этом работал около 3 кадров в секунду и позволял спокойно выйти из приложения.
А OnePlus One на гораздо более мощном Adreno 330 уже на 100 миллионах частиц перезагружается. А если их поставить на живые обои, можно заработать бутлуп без рута и каких-либо разрешений со стороны приложения. Я так сделал и меня спас только кастомный рекавери, через который я смог удалить установленный APK из системы. Без него пришлось бы сбрасываться к заводским настройкам.
Новый телефон OnePlus 7 Pro просто убивает моё приложение на 100 миллионах частиц и выше.

#14
5:34, 10 окт. 2019

помоему, могу ошибаться, ты делаешь чтото не совсем правильно
как по мне показательным является количество полноэкранных draw-call-ов которые может дать GPU, например для ПК 9xx-1xxx серия Nvidia дает меньше 30 ФПС уже при 500 отрисовках на весь экран за кадр
вот как пример в браузере(webgl1 на мобилках тоже должно работать) делает на x10 больше полноэкранных draw-call-ов каждое нажатие на Ок, вангую что мобилка больше 1000 не сможет(десктопные 9xx крашат драйвер на 10000)

а у тебя миллионы и миллиарды частиц,когда я не могу 10тыщ отрендерить без падения ФПС до 10 на десктопных ГПУ...

просто ради интереса, предполагаю что у тебя частицы не полупрозрачные и отрисовываются без сортировки(тоесть рендерятся за один draw-call)
если так то количество частиц больше чем пикселей на экране не имеет смысла(остальные прокрутят пустоту)

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика