3

オンラインゲーム「コンカーオンライン」の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 回のティック ナップをなくすことができるアドバイスをいただければ幸いです。

ありがとう。

4

2 に答える 2