когда я рисую несколько значков с падением производительности большого размера - PullRequest
1 голос
/ 16 января 2020

Я делаю 3D-приложение, используя javascript и webgl. FPS равен 60, когда я рисую 1000 иконок с размером 32x32 пикселя, но когда я рисую 1000 иконок с размером 256x256 пикселей, fps равен 10, выполняю перетаскивание.

Что мне нужно сделать, чтобы увеличить FPS, рисуя значок 1000 размером 256x256?

1 Ответ

1 голос
/ 16 января 2020

Графические процессоры привязаны к скорости заполнения. Это означает, что существует ограничение максимального количества пикселей, которое они могут нарисовать на кадр со скоростью 60 кадров в секунду. Каждый графический процессор отличается, но приложение работает медленно, если оно рисует слишком много пикселей.

Так что если вы рисуете 1000 квадратов 32x32, то это около 1 миллиона пикселей. Если вы рисуете 1000 квадратов 256х256, то это около 65 миллионов пикселей, что в 65 раз больше работы.

Некоторые вещи, которые вы можете сделать.

  1. Включите тест глубины и проведите фронт в назад

    Это работает только в том случае, если ваши иконки непрозрачны на 100% или, возможно, имеют прозрачные пиксели на 100%, и вы используете discard, чтобы не рисовать эти пиксели. Если у вас есть различные уровни альфа (вы смешиваете), то вы не можете использовать эту технику.

    Это поможет нарисовать меньше пикселей, но все же намного больше, чем в случае 32x32.

  2. Попытайтесь выяснить, какие квады вам не нужно рисовать.

    На 4K-дисплее только 8 миллионов пикселей, так зачем рисовать 65 миллионов пикселей? Это означает, что в среднем каждый пиксель перезаписывается 7 раз!

    Если вы все равно знаете, что вы можете пропустить некоторые квадраты, пропустите их.

  3. Убедитесь, что вы используете mips, если текстуры больше их размера Рисуем.

    Медленнее рисовать квад 2x2, используя текстуру 1024x1024 без мипов, чем с. Причина в том, что без мипов графическому процессору приходится прыгать далеко между пикселями, что, вероятно, будет кешем sh. С помощью mips он получит соответствующий уровень mip, а пиксели рядом друг с другом будут в кеше.

В качестве примера на моем Macbook Air конца 2018 года с Intel UHD Graphics 617 я могу рисует только около 5 миллионов пикселей на кадр со скоростью 60 кадров в секунду в WebGL.

...