代码之家  ›  专栏  ›  技术社区  ›  oliver

鼠标滞后与触摸屏连接,几乎没有滞后没有

  •  0
  • oliver  · 技术社区  · 6 年前

    我有一个触摸屏(lg 23et83v,如果重要的话),我想为我3岁的女儿写一个非常基本的油漆应用程序:没有她不在乎的带有豪华工具的广泛工具面板(我不喜欢tuxpaint)。只是素描而已。这就是我的动机。

    但在下面的代码中,我观察到以下奇怪的行为:

    1. 在目标机器上(windows 10 pro,6核amd,2014年左右),我用手指画画时有一个小延迟(大约0.5秒?)画在我手指后面的位置。只有当我把手指放好后,绘图的位置才能赶上手指的位置。

    2. 当我用鼠标画画的时候,滞后会让人印象深刻(~2-4秒!)为了更长的动作。如果我停止鼠标移动,绘图位置最终会跟上。看起来鼠标生成的鼠标移动事件的速率并不比在Bullet 1中移动手指时的触摸控制器高。

    3. 当我断开屏幕触摸控制器的USB电缆时,鼠标滞后几乎消失。嗯,它仍然很明显,但可以接受(比如说~0.25秒)

    4. 当我在开发机器上用鼠标画图时(2008年左右的英特尔Q6600四核),我没有看到任何鼠标延迟。

    如果它是硬件或驱动程序相关的,我可能是运气不好。但在我看来,这似乎是Windows试图通过平均数个连续鼠标位置来平滑触摸移动。如果这是真的,我能控制平均值吗?关于这个问题的原因还有什么其他想法吗?

    PS:当我在显示上述问题的机器上使用MS油漆时,我看不到任何延迟。所以这个问题一定是由一些与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 回复  |  直到 6 年前
        1
  •  0
  •   oliver    6 年前

    可惜没人知道这个问题的原因。虽然我没有一个真正的解决方案,但我使用了以下解决方法(为任何想和我一样做的人提供帮助,例如为小孩子画画):

    我现在已经求助于gimp,它允许更多或更少的儿童友好定制:

    1. 主工具箱可以用来隐藏除画笔和橡皮擦以外的所有工具
    2. 设置在色轮上的“颜色”可停靠工具栏非常适合儿童使用,否则使用同一工具栏,可以访问带有彩虹色的自定义调色板,甚至更适合儿童使用;将浮动工具栏调整为合理的大小
    3. 我唯一使用的另一个工具栏是画笔工具栏,除了最基本的圆形高斯画笔之外,我删除了所有画笔(奇怪的是,其他画笔只能在文件系统中删除)
    4. 以全屏模式启动应用程序

    不幸的是,即使在这个简单的设置中,仍然有一些句柄/菜单/手势会给不稳定的儿童手指带来意想不到的效果,例如,取消停靠/移动工具栏、交换前景/背景色等。但它至少和一个小孩子的绘画程序一样接近。