2009-08-24 3 views
2

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

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

  1. Является ли это разумным подходом?
  2. Будет ли GDI и битBLT лучше?
  3. Работает ли WPF лучше?
  4. Что касается DirectX или других технологий ?

Я бы очень признателен за отзыв, TIA!

ответ

2

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

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

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

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

+0

Я не написал C++ в годы (начиная с колледжа на самом деле), но если я могу уйти с минимумом кода C++, это было бы здорово. – chriscena

+0

К сожалению, если вы использовали более новую версию DirectX, вы бы сделали намного больше C++, поэтому просто ищите версию, о которой я упоминал. –

+0

Поздняя обратная связь, но в любом случае: это оказалось решением, из-за некоторых проблем с разрывом я не смог найти быстрое решение для SDL. Нашел версию DirectX 9.0c, создал элемент управления winform, который сделал графическую магию.Чтобы избежать дополнительной установки DirectX, я просто связал DLX-файлы MDX, необходимые в решении для приложений. Благодарю. – chriscena

1

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

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

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

+0

Спасибо за ваши отзывы. – chriscena

1

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

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

+0

Я забыл о SDL. Определенно собираюсь протестировать это, поскольку имеется библиотека .NET. Это может быть просто решением. – chriscena