Возможно ли ускорить выполнение данного кода с паралельными вычислениями, либо перенести вычисления на видеокарту

Возникла проблема со скоростью. Все паралельные вычисления занимают 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;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Ответы (0 шт):