C# 图像检测优化

C# 图像检测优化,c#,C#,我正在写一个脚本来自动化游戏中无聊的部分。基本上,我有一个多玩家可以使用的游戏不同部分的复选框。如果勾选了复选框,则脚本将截图,如果位置可用,则我的角色可以单击该位置并在其他玩家之前跳到该特定位置,如图1所示 现在,我的角色最多可以访问18个可能的位置(只要另一个角色不在那里)。如果我选中了所有18个框,那么我的脚本将开始运行所有18个位置,直到找到一个打开的位置。它基本上由图1的复制/粘贴表示,但在图2中进行了调整 我有一个计时器,每5秒启动一次,检查屏幕是否已更改,以检查是否需要采取行动。然

我正在写一个脚本来自动化游戏中无聊的部分。基本上,我有一个多玩家可以使用的游戏不同部分的复选框。如果勾选了复选框,则脚本将截图,如果位置可用,则我的角色可以单击该位置并在其他玩家之前跳到该特定位置,如图1所示

现在,我的角色最多可以访问18个可能的位置(只要另一个角色不在那里)。如果我选中了所有18个框,那么我的脚本将开始运行所有18个位置,直到找到一个打开的位置。它基本上由图1的复制/粘贴表示,但在图2中进行了调整

我有一个计时器,每5秒启动一次,检查屏幕是否已更改,以检查是否需要采取行动。然而,它没有使用大量的CPU/内存,有时它会停止响应,这是不好的。此外,每5秒(即执行屏幕检查时),电源使用量就会跳到非常高的水平。我如何优化它,使其更有效?是否有更好的方法检查屏幕更改

--图1--

private void Form1_Load(object sender, EventArgs e)
{
   //reference picture in resource folder
   ImageName = new LockBitmap(Properties.Resources.ImageName);
   ImageName.LockBits();

  //ImageDetection
private LockBitmap ImageName;
    private void RunImageName()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
   //Argument
   if (ImageName01.Checked)
        {
            RunImageName();
            RunImageNameIcon();
        }
}
private void Form1_Load(object sender, EventArgs e)
{ 

 //reference picture in resource folder
ImageName1 = new LockBitmap(Properties.Resources.ImageName1);
ImageName1.LockBits();
ImageName2 = new LockBitmap(Properties.Resources.ImageName2);
ImageName2.LockBits();
ImageName3 = new LockBitmap(Properties.Resources.ImageName3);
ImageName3.LockBits();
}
//ImageDetection

private LockBitmap ImageName1;
    private void RunImageName1()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName1);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

private LockBitmap ImageName2;
    private void RunImageName2()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName2);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

private LockBitmap ImageName3;
    private void RunImageName3()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName3);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

}

private void timer1_Tick(object sender, EventArgs e)
{

//Argument
if (ImageName01.Checked)
        {
            RunImageName1();
            RunImageNameIcon();
        }
if (ImageName02.Checked)
        {
            RunImageName2();
            RunImageNameIcon();
        }
if (ImageName03.Checked)
        {
            RunImageName3();
            RunImageNameIcon();
        }
}
--图2--

private void Form1_Load(object sender, EventArgs e)
{
   //reference picture in resource folder
   ImageName = new LockBitmap(Properties.Resources.ImageName);
   ImageName.LockBits();

  //ImageDetection
private LockBitmap ImageName;
    private void RunImageName()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
   //Argument
   if (ImageName01.Checked)
        {
            RunImageName();
            RunImageNameIcon();
        }
}
private void Form1_Load(object sender, EventArgs e)
{ 

 //reference picture in resource folder
ImageName1 = new LockBitmap(Properties.Resources.ImageName1);
ImageName1.LockBits();
ImageName2 = new LockBitmap(Properties.Resources.ImageName2);
ImageName2.LockBits();
ImageName3 = new LockBitmap(Properties.Resources.ImageName3);
ImageName3.LockBits();
}
//ImageDetection

private LockBitmap ImageName1;
    private void RunImageName1()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName1);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

private LockBitmap ImageName2;
    private void RunImageName2()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName2);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

private LockBitmap ImageName3;
    private void RunImageName3()
    {
        var handle = GetWindowsHandle();
        using (var screenshot = new LockBitmap(CaptureClient(handle)))
        {

            screenshot.LockBits();
            //Extensions menthod
            //screenshot.DoesImageExist(playbutton);
            var location = screenshot.GetFirstLocation(ImageName3);

            if (location != Point.Empty)
            {
                var topleft = GetProcessWindowPoint(handle);
                var clickpoint = new Point(topleft.X + location.X, topleft.Y + location.Y);
                User32.SetCursorPos(clickpoint.X, clickpoint.Y);
                User32.mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                Thread.Sleep(50);
                User32.mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

            }
        }
    }

}

private void timer1_Tick(object sender, EventArgs e)
{

//Argument
if (ImageName01.Checked)
        {
            RunImageName1();
            RunImageNameIcon();
        }
if (ImageName02.Checked)
        {
            RunImageName2();
            RunImageNameIcon();
        }
if (ImageName03.Checked)
        {
            RunImageName3();
            RunImageNameIcon();
        }
}

尝试使用后台工作程序。当您在与UI相同的线程上运行计算时,会产生瓶颈,导致UI冻结,有时还会执行其他奇怪的操作。这里有一个可能有用的链接。

您认为使用后台工作程序(1个用于UI,1个用于执行图像检测和if语句)可以防止UI锁定吗?它对系统资源有什么作用?不,用户界面不需要后台工作程序。我建议通过后台工作程序执行图像检测代码。UI已经在线程上运行。通过使用后台工作程序,您可以在单独的线程上执行图像检测代码。这将有望解决滞后问题。