C# 图像检测优化
我正在写一个脚本来自动化游戏中无聊的部分。基本上,我有一个多玩家可以使用的游戏不同部分的复选框。如果勾选了复选框,则脚本将截图,如果位置可用,则我的角色可以单击该位置并在其他玩家之前跳到该特定位置,如图1所示 现在,我的角色最多可以访问18个可能的位置(只要另一个角色不在那里)。如果我选中了所有18个框,那么我的脚本将开始运行所有18个位置,直到找到一个打开的位置。它基本上由图1的复制/粘贴表示,但在图2中进行了调整 我有一个计时器,每5秒启动一次,检查屏幕是否已更改,以检查是否需要采取行动。然而,它没有使用大量的CPU/内存,有时它会停止响应,这是不好的。此外,每5秒(即执行屏幕检查时),电源使用量就会跳到非常高的水平。我如何优化它,使其更有效?是否有更好的方法检查屏幕更改 --图1--C# 图像检测优化,c#,C#,我正在写一个脚本来自动化游戏中无聊的部分。基本上,我有一个多玩家可以使用的游戏不同部分的复选框。如果勾选了复选框,则脚本将截图,如果位置可用,则我的角色可以单击该位置并在其他玩家之前跳到该特定位置,如图1所示 现在,我的角色最多可以访问18个可能的位置(只要另一个角色不在那里)。如果我选中了所有18个框,那么我的脚本将开始运行所有18个位置,直到找到一个打开的位置。它基本上由图1的复制/粘贴表示,但在图2中进行了调整 我有一个计时器,每5秒启动一次,检查屏幕是否已更改,以检查是否需要采取行动。然
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已经在线程上运行。通过使用后台工作程序,您可以在单独的线程上执行图像检测代码。这将有望解决滞后问题。