2013-07-09 3 views
1

Я пытаюсь закодировать пользовательскую графику курсора для Windows 8. Я буду использовать его для приложения, которое использует одно или любое число Wiimotes для отправки сенсорного ввода Windows, что означает, что мне нужно отображать несколько cursors. Я не могу использовать сборку в cursor для прикосновения, потому что их очень сложно увидеть, когда она просматривается издалека.Как переместить графику в окна без латентности?

В настоящее время я использую отдельное прозрачное окно для каждого курсора, на котором я рисую курсор графику с DirectX, но для фактического повторного позиционирования cursor переместить окно в текущий cursor положения с помощью win32 методов SendMessage и SetWindowPos. Это приведет к почти нулевой задержке для повторного позиционирования, но будет использовать необоснованное количество времени процесса. Иногда рядом с 30% при одновременном перемещении нескольких курсоров.

Первоначально я пытался рисовать в прозрачное окно, охватывающее весь экран. Я пробовал и окно WPF с повторным позиционированием фигур на холсте, и чертеж непосредственно на D3DDirectX экземпляр Desktop Window Manager и перестановку путем изменения преобразования matrixes. Это приведет к некоторым очень раздражающим миллисекундам латентности.

Как нарисовать на экране, cursor, который будет двигаться с низкой задержкой и низким CPU?

+0

Можете ли вы не просто использовать одно прозрачное окно, которое накладывает весь экран? –

+0

Да, это то, что я сделал по своим «другим методам», но я не знаю, как я могу переместить графику (предпочтительнее сглаженную и полупрозрачную) без латентности. – Simphax

ответ

3

Если вы используете D3D/DirectDraw.

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

Это означает, что у вас будет разрыв в 20 мс между входными событиями.

Балансировка с двойным/триплом обычно не является проблемой, потому что VSYNC блокирует на 2000% время, необходимое для отображения экрана.

Потому что обычно требуется 1-2 мс для отображения экрана, но 17-24 мс ждет VSYNC.

Например [C++]:
- Посмотрите here.

+0

Я использую D3D. Из того, что я вижу, возможно, двойная буферизация - это моя проблема, а не мое решение? Цитата из первой ссылки «Больше буферов может сгладить частоту кадров, но они также могут вызвать задержку ввода (задержка между тем, когда пользователь нажимает клавишу и когда видит результаты)». что именно я пытаюсь избежать (входное отставание). – Simphax

+0

@ Симфакс Я неправильно прочитал ваш вопрос. Я серьезно думал, что вы говорили о растрескивании при перемещении курсора. Во всяком случае, двойная буферизация действительно вызывает задержку ввода, тройные причины еще больше. –

+0

@Simphax Проверьте ответ еще раз :). –

Смежные вопросы