オンラインゲーム「コンカーオンライン」のOCRボットを作りました。
正常に動作しますが、動作が非常に遅くなります。
i7 は 250,000 ピクセルをスキャンするのに問題はないと考えました。特に、実行中のピクセルあたりの命令数が 100 未満の場合はそうです。
厄介なことに、ボットは画面のスキャンごとに約 5 秒かかりますが、わずかミリ秒しかかからないはずです。
次のコードを含め、コード全体に大量のデバッグ ステートメントを挿入しました。
public bool searchScreenCoord(Point screenCoord, Bitmap printscreen, List<Point> blacklistedPixels, List<LootableItem> lootableItems,
List<AttackableMonster> attackableMonsters, ClickTracker ct, bool chkGreens, bool chkBlacks, bool chkLoot)
{
Color pixel = printscreen.GetPixel(screenCoord.X, screenCoord.Y);
#if DEBUG_Time
DateTime pixelStartTime = DateTime.Now;
#endif
if (chkGreens)
{
#if DEBUG_Time
if ((DateTime.Now.Subtract(pixelStartTime).Ticks > 500))
{
File.AppendAllText("C:\\ocr\\stats\\pixelStats.csv",
"green.Checked:" + DateTime.Now.Subtract(pixelStartTime).Ticks.ToString() + "\r\n");
pixelStartTime = DateTime.Now;
}
#endif
定義からわかるように、chkGreens は doMonsters メソッド/スレッドから渡された bool であり、GUI スレッドへのアクセスが原因で問題が発生した可能性のある chkGreenMonsters.Checked への呼び出しではありません。私の問題を解決するために、繰り返されるクロススレッド呼び出しを排除しました。
私のデバッグファイルには以下が含まれています:
black.Checked 10000
green.Checked 10001
green.Checked 10000
black.Checked 10000
get black word 30001
black.Checked 10001
black.Checked 10001
get black word 10001
私が考えることができる理由はありませんが、スレッドは、日付時刻を宣言してから渡された bool をチェックするまでの間、10,000 ティックの間スリープします。
ただし、searchScreenCoord が呼び出されるたびに発生するわけではありません。たぶん 25 または 50 回の呼び出しごとに 1 回です。
これは、頻繁に 10,000 ティックを要求する不正なプロセスによるタイム スライスである可能性があると思いますが、その説明は大げさなようです。
なぜこれが私に起こっているのか誰か知っていますか?
アプリが取っている恐ろしい 10,000 回のティック ナップをなくすことができるアドバイスをいただければ幸いです。
ありがとう。