Отставание мыши с подключенным сенсорным экраном, почти без запаздывания - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть сенсорный экран (LG 23ET83V, если это имеет значение), и я хотел написать чрезвычайно простое приложение для рисования для моей 3-летней дочери: нет обширных палитр инструментов с роскошными инструментами, о которых она не заботится (я не заботился)Tuxpaint в этом отношении).Просто рисовать.Так много для моей мотивации.

Но с помощью приведенного ниже кода я наблюдаю следующее странное поведение:

  1. На целевой машине (Windows 10 Pro, 6 ядер AMD с 2014 годаили около того), когда я рисую пальцем, есть небольшое отставание (~ 0,5 секунды?) картины за позицией моего пальца.Только после того, как я положил палец, позиция рисования совпадает с позицией моего пальца.

  2. Когда я рисую с помощью мыши, задержка становится впечатляющей (~ 2-4 секунды!)для более длинных движений.Если я остановлю движение мыши, то положение рисования в конечном итоге зацепится.Не выглядит ужасно, что мышь генерирует более высокую частоту событий MOUSE_MOVE, чем сенсорный контроллер при перемещении моего пальца в пуле 1.

  3. Когда я отсоединяю USB-кабель отсенсорный контроллер экрана, лаг мыши практически исчезает.Ну, это все еще заметно, но приемлемо (скажем, ~ 0,25 с)

  4. Когда я рисую с помощью мыши на компьютере разработчика (четырехъядерный процессор Intel Q6600 от ~ 2008 или около того), я не вижуотставание мыши вообще.

Если это связано с аппаратным обеспечением или драйвером, мне, вероятно, не повезло.Но мне как-то кажется, что Windows пытается сгладить движения касания путем усреднения нескольких последовательных положений мыши.Если это правда, могу ли я контролировать усреднение?Любые другие идеи относительно причины проблемы?

PS: когда я использую MS Paint на машине, которая показывает вышеупомянутую проблему, я не вижу никакой задержки вообще.Таким образом, проблема должна быть вызвана тем, что связано с C # или связано с тем, как я использую API.

public partial class MainWindow : Window
{
    WriteableBitmap bitmap;

    public MainWindow()
    {
        InitializeComponent();

        // create bitmap the size of whole screen
        int bitmapWidth = Convert.ToInt32(SystemParameters.PrimaryScreenWidth);
        int bitmapHeight = Convert.ToInt32(SystemParameters.PrimaryScreenHeight);

        bitmap = new WriteableBitmap(bitmapWidth, bitmapHeight, 96, 96, PixelFormats.Bgra32, null);

        canvasImage.Source = bitmap;
    }

    void plot(int x, int y, uint value)
    {
        // just draw one pixel for barebones testing
        uint[] valueArray = new uint[1];
        valueArray[0] = value;
        bitmap.WritePixels(new Int32Rect(0, 0, 1, 1), valueArray, 4, x, y);
    }

    Point previousPosition;

    void imageMouseMove(object sender, MouseEventArgs e)
    {
        Point currentPosition = e.GetPosition(canvasImage);

        if (e.LeftButton == MouseButtonState.Pressed)
        {
            int x2 = (int)Math.Floor(currentPosition.X * canvasImage.Source.Width / canvasImage.ActualWidth);
            int y2 = (int)Math.Floor(currentPosition.Y * canvasImage.Source.Height / canvasImage.ActualHeight);
            int x1 = (int)Math.Floor(previousPosition.X * canvasImage.Source.Width / canvasImage.ActualWidth);
            int y1 = (int)Math.Floor(previousPosition.Y * canvasImage.Source.Height / canvasImage.ActualHeight);

            plot(x2,y2, 0xFF800000);
        }

        previousPosition = currentPosition;
    }

    void button1_Click(object sender, RoutedEventArgs e)
    {
        Close();
    }
}

Разметка:

<?xml version="1.0" encoding="utf-8"?>
<Window
    x:Class="Paintuition.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Paintuition"
    ResizeMode="NoResize"
    WindowState="Maximized"
    WindowStyle="None">
    <Grid>
        <Image
            x:Name="canvasImage"
            MouseMove="imageMouseMove" />
        <Button
            Content="X"
            x:Name="button1"
            Click="button1_Click"
            Background="Red"
            BorderBrush="#FFFFBFBF"
            FontFamily="Arial"
            Foreground="White"
            FontWeight="ExtraBold"
            FontSize="54"
            Width="66"
            Height="65"
            Grid.Column="0"
            Grid.Row="0"
            HorizontalAlignment="Right"
            VerticalAlignment="Top"
            Margin="0,42,34,0" />
    </Grid>
</Window>

1 Ответ

0 голосов
/ 18 ноября 2018

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

Я прибег к Gimp сейчас, что позволяет использовать более или менее удобные для детей настройки:

  1. основной набор инструментов можно сделать, чтобы скрыть все инструменты, кроме кисти и ластика
  2. панель цветных закрепляемых панелей инструментов, настроенная на цветовое колесо, довольно удобна для детей, в противном случае с этой же панелью инструментов можно получить доступ к пользовательской палитре с некоторыми цветами радуги, что делает ее еще более удобной для детей; изменить размер плавающей панели инструментов до разумного размера
  3. единственная другая панель инструментов, которую я использую, это панель инструментов кистей, где я удаляю все, кроме самых основных круговых гауссовых кистей (как ни странно, другие кисти можно удалить только в файловой системе)
  4. запуск приложения в полноэкранном режиме

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

...