Delphi 6: может ли собственный Delphi создавать плавную графику, такую ​​как Flash?

У меня есть собственный Delphi TFrame, который имитирует программу просмотра облака тегов Cumulus Tag Cloud, плагин 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?


person Robert Oschler    schedule 10.10.2010    source источник
comment
У вас есть DoubleBuffering, AllPaintingInWmPaint, SupportsTransparentBackColor и UserPaint? Их использование при рендеринге GDI в форме предотвратит мерцание.   -  person Nowayz    schedule 10.10.2010
comment
Новайз. У меня нет мерцания. Джиттер позиционный, а не из-за перерисовок.   -  person Robert Oschler    schedule 10.10.2010
comment
Ответ однозначно да. Но если вам нужна действительно гладкая трехмерная графика, процессор не будет достаточно быстрым. Вам нужно использовать графический процессор, используя OpenGL.   -  person Andreas Rejbrand    schedule 10.10.2010
comment
Процессор достаточно быстрый. Винда просто недостаточно штатная :-)   -  person Marco van de Voort    schedule 10.10.2010
comment
Оказывается, я получаю намного лучше выглядящий фрейм, используя библиотеку Graphics32, на которую я ссылаюсь в своем вопросе. Мне пришлось переключиться с ресамплера ядра на черновой ресэмплер, потому что даже на моем четырехъядерном Intel i5 я не мог получать более 4 кадров в секунду без проблем с производительностью. С черновым ресамплером мне не нужно ограничивать частоту кадров, и он определенно выглядит намного лучше, чем без него. Теперь мне просто нужно выяснить, почему я получаю странное мерцание на моих суб-изображениях, и все готово. У меня никогда раньше не было мерцания при записи во временное растровое изображение, а затем BitBlt () в Canvas.   -  person Robert Oschler    schedule 10.10.2010
comment
Вы не думали попробовать SDL?   -  person Kenneth Cochran    schedule 11.10.2010


Ответы (2)


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

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

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

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

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

person Lerc    schedule 30.01.2012
comment
я считаю, что шрифт GDI с ANTIALIASED_QUALITY (msdn. microsoft.com/en-us/library/dd183499(v=vs.85).aspx) не будет привязан к сетке, что позволяет избежать проблемы прыгающих символов. - person Ian Boyd; 30.01.2012

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

person Community    schedule 10.10.2010
comment
Написать приложение OpenGL Delphi очень просто, потому что есть модуль OpenGL.pas. Написать приложение DirectX Delphi не так-то просто. - person Andreas Rejbrand; 10.10.2010
comment
Мой опыт работы с Direct3D показывает, что когда он работает, он отлично работает, но когда у вас есть проблема, особенно из-за проблемы с кодеком где-то в цепочке фильтров, жизнь может очень быстро стать очень болезненной. Вот почему я так стараюсь, чтобы этого избежать. Я еще не устал от OpenGL и определенно хочу. - person Robert Oschler; 10.10.2010
comment
Я просто имел в виду, что, будучи DirectX, встроенной передовой графической платформой Windows, она лучше поддерживается. MS показала, что им не нравится OpenGL - person ; 10.10.2010
comment
@Robert: Direct3D не выполняет цепочки фильтров и не имеет кодеков. Не путайте это с DirectShow, это совершенно другой зверь. - person Paul-Jan; 10.10.2010
comment
Хорошее замечание Пол-Ян. Я смешал эти два вместе, и это не то же самое, как вы указали. - person Robert Oschler; 11.10.2010