Плавная текстовая анимация (текстовый эффект Marquee) с использованием QT - PullRequest
4 голосов
/ 31 октября 2009

У меня есть вопрос о том, как сделать текст выделенного текста гладким (используя Qt 4.5.3) на не мощном оборудовании (Atom N270 + Intel 945GSM). Мой подход заключается в следующем:

  1. Я рисую свой текст (36px Arial bold) на QPixmap (внеэкранное устройство рисования)
  2. Я установил таймер для сдвига контента в 1 пиксель влево каждые 30 мс.
  3. Когда запускается событие onTimer, я делаю выделение QPixmap и печатаю эту часть на холсте окна.

Вообще говоря, он движется плавно. Однако чем больше текста я создаю, тем больше загружается ЦП. Когда текст может заполнить 50% экрана (1920x1680), загрузка процессора составляет около 70-80%. Текстовая анимация становится немного мерцающей. Если я установлю интервал таймера на 50 мс или больше, он будет плавным. Но текст движется слишком медленно.

Мой подход неэффективен? Должен ли я использовать OpenGL? Любая подсказка приветствуется и заранее спасибо ^^)

1 Ответ

6 голосов
/ 02 ноября 2009

Вы должны заглянуть в каркас графического представления. Вы можете добавить объекты QGraphicsTextItem в QGraphicsScene и установить координаты вида (масштабирование и перевод), чтобы ваш текст двигался и отображался в любом размере, в том числе с тем, чтобы часть текста была «вне экрана» (вне вида) , Я ожидал бы, что это будет намного эффективнее, чем копирование и рисование (изменяющегося размера) части QPixmap при каждом событии таймера.

В документации говорится, что платформа Graphics View оптимизирована для одновременной обработки множества объектов. Если это окажется не лучше, вы можете попробовать 4.6 бета. Для рендеринга графического представления предусмотрены оптимизации.

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

...