C# 닷넷7 으로 프로그램을 만들었습니다.
opencvsharp 사용하여 이미지 구별하는 프로그램입니다.
잘 작동되는 프로그램이었습니다. 근대 새로운 기능을 넣기 위해서 특정함수를
넣었는데 랙이 발생하네요. 물론 하드웨어 용량은 충분합니다. CPU 사용률 30%, 메모리 사용률 30% 정도입니다. 아무리 생각해봐도 병목현상 원인을 모르겠습니다.
그래서 새로운 기능을 위한 특정함수 코드를 적어보겠습니다.
꼭 알려주세요.
public static async Task ExecuteCMDAsync(string text1, string text2, string text3, string text4)
{
ProcessStartInfo pri = new ProcessStartInfo();
Process pro = new Process();
pri.FileName = @"cmd.exe";
pri.CreateNoWindow = true;
pri.UseShellExecute = false;
pri.RedirectStandardInput = true;
pri.RedirectStandardOutput = true;
pri.RedirectStandardError = true;
pro.StartInfo = pri;
pro.Start();
await Task.Delay(9000);
await pro.StandardInput.WriteLineAsync(text1 + Environment.NewLine);
await Task.Delay(9000);
await pro.StandardInput.WriteLineAsync(text2 + Environment.NewLine);
await Task.Delay(9000);
await pro.StandardInput.WriteLineAsync(text3 + Environment.NewLine);
await Task.Delay(9000);
await pro.StandardInput.WriteLineAsync(text4 + Environment.NewLine);
await Task.Delay(9000);
pro.StandardInput.Close();
string resultValue = await pro.StandardOutput.ReadToEndAsync();
await pro.WaitForExitAsync();
pro.Close();
}
public static async Task ExecuteADBAsync(int num)
{
int nnum = 5555 + 10 * num;
string portnum = nnum.ToString();
await ExecuteCMDAsync("adb connect 127.0.0.1:" + portnum,
"adb -s 127.0.0.1:" + portnum + " shell am force-stop com.xxx.xxxx.xxx",
"adb -s 127.0.0.1:" + portnum + " shell am start -n com.xxx.xxxx.xxx/com.toast.android.gamebase.activity.MainActivity",
"adb disconnect 127.0.0.1:" + portnum);
await Task.Delay(5000);
}
public static async Task IsStoppedAsync(int num)
{
OpenCvSharp.Rect rect = new OpenCvSharp.Rect(390, 322, 8, 5);
if (stoppedMat[num] == null)
{
Mat sscreenMat = new Mat();
gameCapture[num].CopyTo(sscreenMat);
Cv2.CvtColor(sscreenMat, sscreenMat, ColorConversionCodes.BGR2GRAY);
Mat roiMat = sscreenMat.SubMat(rect);
if (stoppedMat[num] == null)
{
stoppedMat[num] = new Mat();
}
roiMat.CopyTo(stoppedMat[num]);
sscreenMat.Dispose();
roiMat.Dispose();
}
else if (스톱반복횟수[num] >= 50)
{
Mat findimg = new Mat();
stoppedMat[num].CopyTo(findimg);
Mat ScreenMat = new Mat();
gameCapture[num].CopyTo(ScreenMat);
Mat grayImage = new Mat();
Cv2.CvtColor(ScreenMat, grayImage, ColorConversionCodes.BGR2GRAY);
Mat roiImage = grayImage.SubMat(rect);
double acc = 0;
using (var res = roiImage.MatchTemplate(findimg, TemplateMatchModes.CCoeffNormed))
{
double minval, maxval;
OpenCvSharp.Point minloc, maxloc;
Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
acc = maxval;
}
if (acc >= 0.97)
{
await ExecuteADBAsync(num);
await Task.Delay(10000);
}
stoppedMat[num] = null;
스톱반복횟수[num] = 0;
findimg.Dispose();
ScreenMat.Dispose();
grayImage.Dispose();
roiImage.Dispose();
GC.Collect();
}
스톱반복횟수[num]++;
}
앱플레이어가 만약 정지되어 있다면 adb 로 연결해서 앱플레어내의 앱을 강제종료 시키고 재실행하는 코드입니다. 이게 왜 렉이 걸릴까요? 2주 정도 생각해보고 여러가지 해봐도 도무지 이해를 못하겠네요.
C# 초보를 도와주세요.