Как реализовать высокоскоростную анимацию? - PullRequest
2 голосов
/ 25 августа 2009

Я пытаюсь написать приложение (winforms), которое может продемонстрировать, как два колеблющихся цвета приведут к третьему цвету. Для этого мне нужно очень быстро переключаться между двумя цветами (> 50 кадров в секунду). Я действительно надеюсь сделать это в управляемом коде.

Сейчас я рисую два небольших прямоугольных растровых изображения сплошным цветом друг на друге. Использование GDI + DrawImage с двумя растровыми изображениями в памяти в элементе управления с двойной буферизацией не обрезает его и приводит к мерцанию / разрыву на высокой скорости. Таймер, подключенный к ползунку, запускает переключение.

  1. Это разумный подход?
  2. Будут ли лучше GDI и BitBLT?
  3. WPF работает лучше?
  4. А как насчет DirectX или других технологии?

Буду очень признателен за отзыв, TIA!

Ответы [ 3 ]

2 голосов
/ 25 августа 2009

Мне никогда не везло с GDI в создании высокоскоростной графики, поэтому я использовал DirectX, но MS отказалась от поддержки Managed DirectX, поэтому вам может потребоваться сделать это в неуправляемом C ++.

Просто напишите свой контроллер на C #, а затем создайте очень тонкий слой управляемого C ++, который просто обращается к неуправляемой C ++ DLL с поддержкой DirectX.

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

Если вы используете более старую версию DirectX, такую ​​как DirectX 9.0c, которая все еще может поддерживать .NET, и я использовал ее, чтобы получить частоту кадров для музыкальной программы около 70 кадров в секунду.

1 голос
/ 25 августа 2009

Это будет работать с GDI, но вы не сможете управлять мерцанием, так что об этом не может быть и речи. Direct X может быть лишним пухом только для показа двух не мерцающих изображений. Возможно, SDL будет работать достаточно хорошо? Это кроссплатформенный, и вы можете буквально кодировать этот эффект менее чем за 30 строк кода.

http://cs -sdl.sourceforge.net / index.php / SimpleExample

1 голос
/ 25 августа 2009

Мерцания следует избегать при использовании подхода с двойной буферизацией (и под этим I не подразумевается просто установка свойства DoubleBuffered элемента управления рендерингом в True - по иронии судьбы, это не повлияет на мерцание).

С помощью слежения можно справиться через DirectX, но только если вы синхронизируете частоту кадров с частотой обновления монитора. Это может быть невозможно, особенно если вам нужно достичь определенной частоты кадров (а это не частота обновления вашего монитора).

Я не думаю, что WPF справится с фундаментальной проблемой разрыва (но я могу ошибаться).

...