Разработка GUI на C++ — растровое и векторное использование ЦП

В настоящее время я занимаюсь проектированием и разработкой графического интерфейса для некоторых аудиоприложений, созданных на C++ (с использованием фреймворка Juce).

До сих пор я играл с использованием растровой графики для создания настраиваемых ползунков и циферблатов, используя изображения в стиле «киноленты» для анимации компонентов (это означает, что когда пользователь взаимодействует с ползунком, он запускает метод, который изменяет смещение пленки -strip image для изменения внешнего вида компонентов). В зависимости от размера исходного изображения и количества «кадров» уровень загрузки процессора меняется довольно сильно.

Во-первых, какой формат файла растрового изображения будет наиболее эффективным с точки зрения потребления ЦП? На данный момент я использую изображения PNG.

Во-вторых, не будет ли эффективнее использовать векторную графику для такого рода графических компонентов? Я понимаю основные различия между растровой и векторной графикой, но я не нашел никакой информации об уровне использования их ЦП в отношении взаимодействия с графическим интерфейсом.

Или использование ЦП будет зависеть от конкретных используемых методов/функций/библиотек/фреймворков?

Спасибо!


person Liam Lacey    schedule 02.09.2011    source источник


Ответы (4)


Или потребление ЦП будет зависеть от конкретных используемых методов/функций/библиотек/фреймворков?

Любая из этих вещей может повлиять на это.

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

При этом я определенно не ожидал, что ваш выбор типа изображения окажет какое-либо влияние на его производительность. Поскольку вы не предоставили пример кода, трудно рассуждать дальше этого.

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

person Tom Kerr    schedule 02.09.2011

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

Вы пробовали использовать двойную буферизацию?
Это когда вы записываете в буфер в памяти, пока дисплей (графический процессор) загружает другой.

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

Поддерживает ли ваш графический процессор "блиттинг"? Блиттинг — это когда графический процессор может скопировать прямоугольную область в памяти (растровое изображение) и отобразить ее вместе с применением дополнительных операций перед отображением (таких как XOR с существующими битами).

Резюме: чтобы повысить скорость рендеринга, конвертируйте изображения из файла в растровую форму только один раз. Храните это где-нибудь. При необходимости обращайтесь к этому преобразованному растровому изображению. Затем исследуйте и внедрите двойную буферизацию. Наконец, исследуйте и используйте бит-блиттинг или блиттинг.

Здесь также применяются другие правила оптимизации, такие как просмотр дизайна, удаление требований, развертывание цикла, передача изображений с помощью указателя вместо их копирования и сокращение операторов «если» с использованием логической логики и карт Карно (sp?).

person Thomas Matthews    schedule 02.09.2011
comment
Насколько я понимаю вопрос, это обычное аппаратное обеспечение ПК (определенно поддерживает ускоренное копирование), но он использует преобразование перевода + отсечение для выбора части кинопленки, а не непосредственное копирование соответствующего прямоугольника. Блиттинг вполне может быть быстрее. - person Ben Voigt; 02.09.2011
comment
Некоторые графические процессоры могут выполнять блит и клип за одну операцию. Операция клипа будет предоставляться либо как альфа-канал, либо как матрица. - person Thomas Matthews; 02.09.2011

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

Вы, вероятно, должны сделать некоторые профилирования. Возможно, вы перерисовываете намного чаще, чем необходимо. Или, возможно, PNG декодируется каждый раз, когда вы пытаетесь его нарисовать. (Я не знаком с Джусом.)

Для прямого приложения Windows я, вероятно, один раз при запуске визуализировал бы векторную графику в растровое изображение, зависящее от устройства, а затем просто переносил бы растровое изображение на экран. Использование вектора дает вам независимость от DPI, а копирование из растрового изображения, зависящего от устройства, — это самый быстрый способ рисования блока пикселей. Я считаю, что сопоставление цветов выполняется при рендеринге в растровое изображение, зависящее от устройства, поэтому у вас даже нет накладных расходов ICM на отрисовку экрана.

person Adrian McCarthy    schedule 02.09.2011

От векторной графики давно отказались — растровая графика более производительна. Дело в том, что вы можете отправить растровое изображение на GPU один раз, а затем рендерить его вечно путем простой копии.

Во-вторых, GPU использует собственное сжатие текстур. Думаю, DirectX — это DXT5, но когда GPU видит текстуру, ему все равно, откуда вы ее загрузили.

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

person Puppy    schedule 02.09.2011
comment
Растровые изображения хорошо подходят для статической графики. Для динамической графики растровые изображения работают нормально с одной степенью свободы, но как только вам нужно больше, предварительный рендеринг графики быстро становится чрезмерно дорогим с точки зрения требований к памяти. - person Ben Voigt; 02.09.2011
comment
@Ben Voigt: Для случая использования, который описывает OP, достаточно просто переместить растровое изображение. - person Puppy; 03.09.2011