Skip to content

Commit

Permalink
perf(nurturing): improve training recognize time 0.6s per turn
Browse files Browse the repository at this point in the history
by threading
  • Loading branch information
NateScarlet committed Jul 13, 2021
1 parent 0b07d83 commit d43587d
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 20 deletions.
45 changes: 26 additions & 19 deletions auto_derby/jobs/nurturing.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
# -*- coding=UTF-8 -*-
# pyright: strict
from __future__ import annotations
from auto_derby import mathtools

import logging
import time
from typing import List, Optional
from typing import Optional

from .. import action, template, templates, config, imagetools, terminal
from ..single_mode import Context, Training, choice, race, go_out
import cast_unknown as cast
from concurrent import futures


LOGGER = logging.getLogger(__name__)
Expand Down Expand Up @@ -63,30 +65,35 @@ def _choose_race(ctx: Context, race1: race.Race) -> None:
)


def _handle_training(ctx: Context) -> None:
def _iter_training_images():
rp = action.resize_proxy()
trainings: List[Training] = []

action.wait_image(_TRAINING_CONFIRM)
trainings.append(Training.from_training_scene(template.screenshot()))

for t, pos in zip(
Training.ALL_TYPES,
(
rp.vector2((78, 850), 540),
rp.vector2((171, 850), 540),
rp.vector2((268, 850), 540),
rp.vector2((367, 850), 540),
rp.vector2((461, 850), 540),
),
radius = rp.vector(30, 540)
_, first_confirm_pos = action.wait_image(_TRAINING_CONFIRM)
yield template.screenshot()
for pos in (
rp.vector2((78, 850), 540),
rp.vector2((171, 850), 540),
rp.vector2((268, 850), 540),
rp.vector2((367, 850), 540),
rp.vector2((461, 850), 540),
):
if t in (i.type for i in trainings):
if mathtools.distance(first_confirm_pos, pos) < radius:
continue
action.tap(pos)
time.sleep(0.5) # wait cursor effect finish
action.wait_image(_TRAINING_CONFIRM)
t = Training.from_training_scene(template.screenshot())
trainings.append(t)
yield template.screenshot()


def _handle_training(ctx: Context) -> None:
with futures.ThreadPoolExecutor() as pool:
trainings = [
i.result()
for i in [
pool.submit(Training.from_training_scene, j)
for j in _iter_training_images()
]
]

races_with_score = sorted(
((i, i.score(ctx)) for i in race.find(ctx)),
Expand Down
50 changes: 49 additions & 1 deletion auto_derby/single_mode/training_test.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import time
import timeit
from concurrent import futures
from pathlib import Path

import PIL.Image

from .training import Training
from . import _test
from .training import Training

_TEST_DATA_PATH = Path(__file__).parent / "test_data"

Expand Down Expand Up @@ -172,3 +175,48 @@ def test_update_by_training_scene_issue55():
assert training.guts == 0
assert training.wisdom == 0
assert training.skill == 4


def benchmark_from_training_scene():
RUN_COUNT = 10
img = PIL.Image.open(_TEST_DATA_PATH / "training_scene_5.png").convert("RGB")

def iter_images():
for _ in range(5):
time.sleep(1) # simulate game wait
yield img

def use_sync():
for i in iter_images():
Training.from_training_scene(i)

def use_thread():
with futures.ThreadPoolExecutor() as pool:
[
i.result()
for i in [
pool.submit(Training.from_training_scene, j) for j in iter_images()
]
]

def use_process():
with futures.ProcessPoolExecutor() as pool:
[
i.result()
for i in [
pool.submit(Training.from_training_scene, j) for j in iter_images()
]
]

print("sync:")
print(timeit.timeit(use_sync, number=RUN_COUNT) / RUN_COUNT)
print("thread:")
print(timeit.timeit(use_thread, number=RUN_COUNT) / RUN_COUNT)
print("process:")
print(timeit.timeit(use_process, number=RUN_COUNT) / RUN_COUNT)
# sync:
# 5.7888625
# thread:
# 5.17410499
# process:
# 5.811807080000001

0 comments on commit d43587d

Please sign in to comment.