Разработка графического интерфейса на C ++ - использование растровых и векторных изображений - PullRequest
3 голосов
/ 02 сентября 2011

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

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

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

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

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

Спасибо!

Ответы [ 4 ]

2 голосов
/ 02 сентября 2011

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

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

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

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

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

0 голосов
/ 02 сентября 2011

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

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

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

0 голосов
/ 02 сентября 2011

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

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

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

0 голосов
/ 02 сентября 2011

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

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

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

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

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

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

...