Я работаю над компонентом визуализации WPF / Silverlight (и вскоре WP7) в реальном времени, и я ищу лучшее решение для перерисовки всего компонента в стиле Game-loop.Перерисовка должна производиться по требованию, но я не хочу создавать резервные копии сообщений с помощью перерисовки вызовов.Большая часть рисования в моем компоненте выполняется с использованием не-WPF-примитивов (например, Bitmap Interop, Direct2D), поэтому мой код не использует InvalidateVisual, и в результате в настоящее время выглядит так
// Pseudocode, doesnt compile, just to convey the meaning
public void InvalidateElement()
{
if (CurrentlyDrawing)
return;
Dispatcher.BeginInvoke(() =>
{
CurrentlyDrawing = true;
DoDrawInternal();
CurrentlyDrawing = false;
}
}
Хорошо, так чтоотлично.Если я звоню InvalidateElement много раз, я получаю хорошую отзывчивость.Однако я хочу, чтобы я мог как можно быстрее передавать данные в свой компонент визуализации, но рисовать только тогда, когда компонент способен рисовать, и не продолжать рисовать, чтобы догнать данные после завершения входного потока.
Нет, я не могу переопределить OnRender, я использую не WPF-рисование внутри WPF; -)
По сути, мне нужно что-то вроде старого Invalidate () / OnPaint в WindowsForms,или, что еще лучше, игровой цикл в DirectX.
В настоящий момент я получаю ситуацию, когда, если у меня есть внешний поток, который с высокой скоростью передает данные в компонент визуализации, то, если я перестаю отправлять данные, я получаю обновления еще на 20 секунд, прежде чемкомпонент перестает рисовать.Я хочу прекратить рисование, как только данные поступят.
Еще одна идея, которая у меня возникла, заключалась в обработке CompositionTarget.Rendering в компоненте визуализации, а затем в реализации некоторой элементарной очереди для передачи данных, и событие Rendering потребляет это.данные так быстро, как это возможно.
Вкратце
С учетом компонента визуализации WPF, V, и источника данных, который передает данные каждые 1 мс, D, как я могу гарантировать, что независимо от данныхD, V рисует данные со скоростью 30 кадров в секунду (или что-то еще) и обновляется в виде фрагментов, что делает цикл рендеринга игры в DirectX?
Когда данные останавливаются, V должен перерисовать все, что у него было до сих пор, за один раз.Когда данные слишком быстрые, V рисует большие куски за раз, чтобы компенсировать это.
Если вам нужна дополнительная информация, я буду рад поделиться ею.Сейчас я только что опубликовал краткий обзор, чтобы оценить, есть ли какие-либо быстрые исправления, но более полный Q с примерами кода может быть предоставлен по запросу.
С уважением,