Delphi 6: Может ли родной Delphi создавать плавную графику, такую ​​как Flash? - PullRequest
5 голосов
/ 10 октября 2010

У меня есть встроенный Delphi TFrame, который эмулирует просмотрщик облаков тегов Роя Танка, плагин WordPress Flash. Этот плагин создает трехмерную сферу слов, которая вращается на поверхности «виртуальной» сферы. Вы можете увидеть это в действии здесь:

http://www.roytanck.com/2008/03/06/wordpress-plugin-wp-cumulus-flash-based-tag-cloud/

В моей структуре приложения каждое слово имеет свой собственный TBitmap, и для рендеринга сферы я печатаю все растровые изображения слова на временном TBitmap, а затем BitBlt (), который временно помещает TBitmap на Canvas видимого TPaintBox. Операция рендеринга происходит с событием таймера TTimer, которое происходит каждые 50 миллисекунд.

Однако, как бы я ни старался, в движении слов есть заметный «джиттер», особенно по сравнению с плавным плавным движением Flash-плеера. Я подумал, что может помочь увеличение частоты кадров, и я даже попытался использовать мультимедийный таймер, который обновлялся каждые 10 миллисекунд с правильной блокировкой и разблокировкой всех холстов из-за многопоточной природы таймера MM. Все еще нервный. Единственное, что я могу понять, это то, что вычисления, которые я делаю, приводят к дискретным позициям пикселей для каждого слова для рендеринга, и это вызывает дрожание. В противоположность этому, и это предположение, возможно, что Flash потенциально выполняет сглаживание для облегчения рендеринга «между пикселями» или, возможно, сглаживание в реальном времени, и поэтому оно не дрожит?

В любом случае, возможно ли получить плавное плавное движение, которое я ищу, используя нативный код Delphi? Или единственный способ сделать это - пойти к чему-то вроде решения Direct3D или OpenGL? Я не хочу тратить время на настройку этой штуки до смерти, если это проигрышная битва. С другой стороны, если у вас есть какие-либо советы, я бы хотел их услышать. Я предполагаю, что если мне действительно нужно идти по пути Direct3D / OpenGL, это большая работа и кривая обучения, поэтому, если бы я мог найти способ сделать это в нативном коде Delphi, мне бы это понравилось.

ПОСЛЕДУЮЩЕЕ РЕДАКТИРОВАНИЕ: поможет ли печать в гораздо более крупный «виртуальный» растр, а затем использовать метод повторной выборки, подобный приведенному здесь, для печати «вниз» до фактического видимого холста?

Хорошо масштабировать изображение в Delphi?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Я написал несколько игр на Delphi.Это, безусловно, выполнимо.Есть несколько вещей, за которыми нужно следить.

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

Если необходима субпиксельная точность без зависимости от графического процессора, я бы порекомендовал Антигрейновая геометрия или его кузен Паскаль AGGPAS для Delphi.

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

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

1 голос
/ 10 октября 2010

ИМХО правильный путь - это Direct3D (или OpenGL, но, учитывая, что Delphi - Windows, только Direct3D лучше). Он был введен именно потому, что GDI не справляется с такими задачами. Flash поддерживает как векторную, так и растровую графику и, следовательно, может обрабатывать такие приложения лучше, чем старый простой GDI.

...