У меня есть сенсорный экран (LG 23ET83V, если это имеет значение), и я хотел написать чрезвычайно простое приложение для рисования для моей 3-летней дочери: нет обширных палитр инструментов с роскошными инструментами, о которых она не заботится (я не заботился)Tuxpaint в этом отношении).Просто рисовать.Так много для моей мотивации.
Но с помощью приведенного ниже кода я наблюдаю следующее странное поведение:
На целевой машине (Windows 10 Pro, 6 ядер AMD с 2014 годаили около того), когда я рисую пальцем, есть небольшое отставание (~ 0,5 секунды?) картины за позицией моего пальца.Только после того, как я положил палец, позиция рисования совпадает с позицией моего пальца.
Когда я рисую с помощью мыши, задержка становится впечатляющей (~ 2-4 секунды!)для более длинных движений.Если я остановлю движение мыши, то положение рисования в конечном итоге зацепится.Не выглядит ужасно, что мышь генерирует более высокую частоту событий MOUSE_MOVE, чем сенсорный контроллер при перемещении моего пальца в пуле 1.
Когда я отсоединяю USB-кабель отсенсорный контроллер экрана, лаг мыши практически исчезает.Ну, это все еще заметно, но приемлемо (скажем, ~ 0,25 с)
Когда я рисую с помощью мыши на компьютере разработчика (четырехъядерный процессор 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>