Comments 8
Спасибо за статью, можете выложить бенчмарки двух систем для сравнения?
Очень круто, но не повышает ли это нагрузку на ГПУ в таком случае?
Естественно, любой шейдер повышает нагрузку на гпу, по скольку на нём и исполняется. Здесь скорее дело в эффективности. На экране 1000 частиц, у каждой по 4 вершины, для каждой вершины нужно сделать расчёт положения. У процессоров нет столько ядер, чтобы параллельно их обработать. А видеокарта может.
Конечно может быть такая ситуация, что у вас распределён бюджет на кадр. Цель 60 фпс, значит один кадр видеокарта и процессор не должны обрабатывать дольше 16 милисекунд(по отдельности, грубо говоря). И так вышло, что видекарта уже занята все 16 милисекунд, тогда конечно нет выбора, исполняем на цп. Просто на цп это займёт больше времени, вот и всё.
Как я понимаю, этот код работает попиксельно для каждого пикселя сообщения, и смещает его в bitmap'е. Выглядит как действительно большое колличесто операций, при худшем сценарии, когда сообщение занимает почти весь экран.
В телеграмме, мне кажется, не так много операций на процессоре, как в юнити, где надо постоянно обсчитывать физику, плюс каждый кадр проверяется каждый monobehavior и исполняется его код в update. Но из относящегося чисто к графике, каждый кадр надо рассчитвать: матрицы преобразования из 3д в экранное 2д, затем Particle System повершинно рассчитывает положение для частиц в 3д (гравитация, вращение, энерция, размер(это всё разные функции)), цвет, uv, применяет матрицы преобразования и делает draw call после расчёта всех вершин. Колличество итераций той функции из телеграмма здесь заменяется сложностью каждой. Ну и на практике, уже при 10к частиц на среднем телефоне могут быть серьёзные просадки, и вам нужно оставаться в пределах пары тысяч, чтобы везде шло плавно. Это не так много, вы вполне можете упереться в этот лимит.
На больших платформах, для сравнения, на среднем цп 300к частиц в пустой сцене подарят почти кинематографический эскпириенс в 40 кадров. В то время как уже довольно старенькая gtx 1080 обрабатывает 5 миллионов частиц в VFX graph в 47 кадров. (см видео https://www.youtube.com/watch?v=0deXRHX9C08&ab_channel=Brackeys )
Так что разница есть, и в зависимости от сложности поведения частиц она может быть довольно разительной. И на мобильных устройствах приходиться использовать любые ухищрения, чтобы повысить fps.
У вас в любом случае после того, как процессор посчитал расположение частицы, она уходит потом на GPU, и рисуется шейдером. Вся разница в том, где именно вы считаете её положение, на CPU и отправляете только положение, или и положение тоже на GPU в собственном шейдере
VFX Система в одном шейдере