Возможно ли ускорить выполнение данного кода с паралельными вычислениями, либо перенести вычисления на видеокарту
Возникла проблема со скоростью. Все паралельные вычисления занимают 5 секунд, что достаточно много и хотелось бы попробывать ускорить процесс либо перенести вычисления на видеокарту, так как она более успешно должна справляться с подобными задачами. Возможно ли это сделать и если да, то как? Я только начал в этом развиваться, поэтому простите за громосткий и неаккуратный код.
Код создающий потоки:
private void button1_Click(object sender, EventArgs e)
{
//захват окна для дальнейших скринов
var process = Process.GetProcessesByName("GenshinImpact").FirstOrDefault();
var hwnd = process.MainWindowHandle;
GetWindowRect(hwnd, out var rect);
for (int round = 1; round != 16; round++) //выполняется 15 раз
{
myThread t1 = new myThread("1");
myThread t2 = new myThread("2");
myThread t3 = new myThread("3");
myThread t4 = new myThread("4");
myThread t5 = new myThread("5");
myThread t6 = new myThread("6");
myThread t7 = new myThread("7");
myThread t8 = new myThread("8");
myThread t9 = new myThread("9");
myThread t10 = new myThread("10");
myThread t11 = new myThread("11");
myThread t12 = new myThread("12");
myThread t13 = new myThread("13");
myThread t14 = new myThread("14");
myThread t15 = new myThread("15");
myThread t16 = new myThread("16");
myThread t17 = new myThread("17");
myThread t18 = new myThread("18");
myThread t19 = new myThread("19");
myThread t20 = new myThread("20");
myThread t21 = new myThread("21");
myThread t22 = new myThread("22");
myThread t23 = new myThread("23");
myThread t24 = new myThread("24");
myThread t25 = new myThread("25");
myThread t26 = new myThread("26");
myThread t27 = new myThread("27");
myThread t28 = new myThread("28");
myThread t29 = new myThread("29");
myThread t30 = new myThread("30");
for (; Pass.pass != 30;) { } //Ожидание завершения всех потоков
if (Status.status == 1)
{
using (var image = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top))
{
using (var graphics = Graphics.FromImage(image))
{
var hdcBitmap = graphics.GetHdc();
PrintWindow(hwnd, hdcBitmap, 0);
graphics.ReleaseHdc(hdcBitmap);
}
image.Save(@"C:\Users\Sans\Desktop\1.png", ImageFormat.Png);
}
MessageBox.Show(
"Легендарка обнаружена",
"AccCheck",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly);
break;
}
else
{
Pass.pass = 0;
MyMouseMove(rect.Left + 710, rect.Top + 690);
PlayerMove("lmb");
}
}
if (Status.status == 0)
{
MessageBox.Show(
"Легендарка не обнаружена",
"AccCheck",
MessageBoxButtons.OK,
MessageBoxIcon.Information,
MessageBoxDefaultButton.Button1,
MessageBoxOptions.DefaultDesktopOnly);
}
}
Код выполняющийся потоками (отличаются проверяемые пиксели в зависимоти от названия):
class myThread
{
Thread thread;
public myThread(string name) //Конструктор получает имя функции и номер до кторого ведется счет
{
//status = 0;
var process = Process.GetProcessesByName("GenshinImpact").FirstOrDefault();
var hwnd = process.MainWindowHandle;
GetWindowRect(hwnd, out var rect);
thread = new Thread(this.func);
thread.Name = name;
thread.Start();//передача параметра в поток
}
void func()//Функция потока, передаем параметр
{
if (Thread.CurrentThread.Name == "1")
{
var process = Process.GetProcessesByName("GenshinImpact").FirstOrDefault();
var hwnd = process.MainWindowHandle;
GetWindowRect(hwnd, out var rect);
Color colr = Color.FromArgb(255, 189, 105, 50);
int weight = 452;
int height = (rect.Bottom - rect.Top) + -163;
if (Pass.pass < 30)
{
using (var image = new Bitmap(rect.Right - rect.Left, rect.Bottom - rect.Top))
{
using (var graphics = Graphics.FromImage(image))
{
for (Color pixel = Color.FromArgb(0, 0, 0, 0); colr != pixel;)
{
var hdcBitmap = graphics.GetHdc();
PrintWindow(hwnd, hdcBitmap, 0);
graphics.ReleaseHdc(hdcBitmap);
pixel = image.GetPixel(weight, height);
if (colr == pixel)
{
Status.status = 1;
Pass.pass = 30;
}
height = height - 6;
if (height < 184)
{
height = (rect.Bottom - rect.Top) + -163;
if (Status.status == 0)
{ Pass.pass++; }
break;
}
}
}
}
}
}
}
}