Производительность GPU: найти ограничение
Проверяйте конкретную причину: пиксели, геометрию, команды отрисовки или первые появления материалов.
Сначала зафиксируйте условия
Запишите рендерер, разрешение, устройство, конфигурацию сборки и воспроизводимый фрагмент игры. Сравнивайте одинаковую камеру и содержимое. При ограничении FPS или VSync одинаковый FPS может скрывать разницу стоимости; смотрите также время кадра.
CPU готовит кадр и команды, GPU исполняет работу. Снижение числа Entity не гарантирует уменьшение стоимости пикселей; уменьшение текстуры не устраняет автоматически дорогую игровую логику. Один FPS не объясняет, какая часть ограничивает кадр.
Один эксперимент — одна причина
| Изменить в копии тестовой сцены | Что проверяете | Чего это не доказывает |
|---|---|---|
| Уменьшить размер 3D Viewport при той же камере | Зависимость от числа пикселей и экранных эффектов | Что вся проблема исключительно на GPU |
| Временно убрать прозрачные слои | Перекрытие пикселей, смешивание, сортировку | Что вся прозрачность недопустима |
| Упростить сетку без смены материала | Геометрию и работу vertex-шейдера | Что текстуры и fragment-шейдер бесплатны |
| Сократить одинаковые отдельные объекты через группы | Стоимость подготовки и отправки повторяющейся геометрии | Что большой MultiMesh всегда выгоднее |
| Повторить первое появление материала | Отличие холодного появления от повторного | Готовность всех вариантов на другом устройстве |
После каждого изменения проверьте картинку: удалённый эффект или исчезнувшая стая не являются корректной оптимизацией прежнего результата.
Пример повторяющейся геометрии
В запускаемой стае 2048 экземпляров отрисованы без 2048 Entity. Проверено также, что VisibleInstanceCount=0 скрывает геометрию, а положительное значение рисует префикс. Это проверка поведения, не сравнительный замер ускорения.
MultiMesh сокращает отдельные объекты, но сохраняет работу над вершинами и видимыми пикселями. Несколько материалов, теневые проходы, виды и поверхности могут давать дополнительные команды. Не обещайте «ровно один draw call для всей игры» из самого факта инстансинга.
Снять правильное измерение
Для подробного распределения CPU-работы C# используйте отдельные измерения. CPU elapsed time не является GPU timer. Для GPU-времени нужен подходящий инструмент и поддержка выбранного графического API. Замеры на одной настольной карте не сертифицируют телефон, Web или минимальный компьютер.