Оптимизация 2D-активов
Оптимизация изображений, используемых компонентами Texture в вашей сцене, может существенно улучшить производительность вашего приложения как при запуске, так и во время выполнения, а также визуальное качество в некоторых ситуациях.
Мотивация
Неоптимизированные изображения могут негативно сказаться на производительности вашего приложения несколькими способами:
- Большое изображение требует больше пропускной способности памяти при использовании в качестве текстуры.
- Сжатые изображения PNG и JPG должны быть распакованы перед отправкой в графическую систему.
- Неправильно подобранные размеры изображений ухудшают производительность и качество при запуске.
- Отправка нескомпрессированных изображений в графическую систему занимает больше времени, и они занимают больше графической памяти при использовании.
Кроме того, выбор подходящего размера для ваших изображений и использование mip-картирования может предотвратить проблемы с алиасингом, если ваше изображение будет отображаться существенно меньше в некоторых моментах.
Сокращение размеров изображения
Примечание: Сделайте изображение маленьким, но с размерами, которые являются степенью двойки.
Первое, что вам нужно сделать, — это изменить размер вашего изображения до почти минимально возможного размера. Более мелкие изображения могут загружаться графической системой быстрее, так как им требуется меньше пропускной способности и памяти. Подумайте о максимальном размере, который ваше изображение будет иметь, и измените размер изображения до этого размера. Если ваша текстура будет повторяться с шагом около 32 пикселей, не сохраняйте ее в формате 1024×1024.
Однако обратите внимание, что как горизонтальный, так и вертикальный размер вашего изображения должны быть степенью двойки (POT), чтобы их можно было хранить в GPU. Большинство современных GPU поддерживают текстуры с нецелыми размерами (NPOT), но многие исследования показывают, что использование NPOT-текстур снижает производительность примерно на 30%. Если вам нужно использовать NPOT-текстуры, мы рекомендуем делать размеры кратными 4. Это может помочь вашему GPU эффективно использовать память и кэш, а в конечном итоге повысить производительность.
Примечание: Если вы используете mip-картирование, существуют дополнительные ограничения на размеры изображения.
Использование mip-картирования
Примечание: Используйте mip-картирование, когда ваше изображение может отображаться меньше, чем исходный размер, включая части в перспективе.
Включение mip-картирования создает много меньших копий изображения, увеличивая использование памяти на 1/3. Размеры каждой mip-карты уменьшаются вдвое по сравнению с предыдущей, и масштабирование выполняется в инструменте редактирования изображений с хорошим пересчетом изображения. В результате ускоряется рендеринг, уменьшается время, затрачиваемое GPU на поиск текстуры, а также уменьшаются артефакты алиасинга, такие как мозаичность или подвыборка текстур.
Для создания mip-карт во время сборки текстура должна быть в контейнерном формате, например KTX, так как стандартные форматы изображений не имеют возможности хранить mip-карты.
Возможна генерация mip-карт во время выполнения, установив свойство Texture::generateMipmaps в true.
Примечание: mip-карты требуют определенных размеров изображения для правильной работы на всех уровнях, в зависимости от используемого кодирования.
Mip-карты и размеры изображений
Если исходные размеры изображения представлены значениями width, height, и depth, количество уровней mip-карт будет 1 + floor(log2(max(width, height, depth))), а размеры каждого уровня будут max(1, width_prev >> 1), max(1, height_prev >> 1), и max(1, depth_prev >> 1).
Сохранение альфа-каналов
В большинстве случаев при работе с изображениями, содержащими полупрозрачные области, проще использовать прозрачные слои в инструменте редактирования изображений при их редактировании. Если вы выберете сжатое кодирование, которое поддерживает альфа-канал, прозрачные области вашей сцены должным образом используются для хранения информации об альфа-канале.
Однако в некоторых случаях вам необходимо управлять значениями RGB полностью прозрачных пикселей. В частности, вы можете увидеть визуальные артефакты, если:
- Любая часть вашего изображения будет отображаться размером больше, чем сохраненный.
- У вас есть полностью прозрачные пиксели на изображении рядом с достаточно непрозрачными пикселями.
В этом случае интерполяция текстуры между полностью прозрачным пикселем и его соседними несколько непрозрачными пикселями смешивает значения RGB между этими двумя. Если вы используете прозрачные слои в инструменте редактирования изображений, значения RGB для некоторых прозрачных пикселей сохраняются как белый цвет, и вы увидите белую окантовку по краям ваших прозрачных областей.
В таких случаях вместо создания полупрозрачного слоя в инструменте редактирования изображений создайте слой без прозрачности, задав значение RGB для каждого пикселя, который вас интересует. Затем сохраните информацию об альфа-канале в четвертом канале.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.0/quick3d-asset-conditioning-2d-assets.html