fix: extend nemu_ipc timeout on retries dynamically for slow PCs

This commit is contained in:
2026-07-06 22:40:43 +08:00
parent 1e152c4641
commit 6582754025
13 changed files with 33 additions and 18 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+1 -1
View File
@@ -27,7 +27,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+2 -1
View File
@@ -1,4 +1,5 @@
import os import os
import time
from functools import wraps from functools import wraps
import lz4.block import lz4.block
@@ -27,7 +28,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+2 -1
View File
@@ -1,3 +1,4 @@
import time
import typing as t import typing as t
from functools import wraps from functools import wraps
@@ -30,7 +31,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+2 -1
View File
@@ -1,4 +1,5 @@
import json import json
import time
from functools import wraps from functools import wraps
import requests import requests
@@ -29,7 +30,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+1 -1
View File
@@ -145,7 +145,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+2 -1
View File
@@ -1,5 +1,6 @@
import socket import socket
import threading import threading
import time
from functools import wraps from functools import wraps
from adbutils.errors import AdbError from adbutils.errors import AdbError
@@ -25,7 +26,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+1 -1
View File
@@ -304,7 +304,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+12 -3
View File
@@ -2,6 +2,7 @@ import ctypes
import json import json
import os import os
import sys import sys
import time
from functools import wraps from functools import wraps
import cv2 import cv2
@@ -163,9 +164,14 @@ def retry(func):
""" """
init = None init = None
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
# Extend timeout on retries
if func.__name__ == 'screenshot':
timeout = retry_sleep(_)
if timeout > 0:
kwargs['timeout'] = timeout
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
@@ -360,6 +366,10 @@ class NemuIpcImpl:
@retry @retry
def screenshot(self, timeout=0.5): def screenshot(self, timeout=0.5):
""" """
Args:
timeout: Timout in seconds to call nemu_ipc
Will be dynamically extended by `@retry`
Returns: Returns:
np.ndarray: Image array in RGBA color space np.ndarray: Image array in RGBA color space
Note that image is upside down Note that image is upside down
@@ -562,8 +572,7 @@ class NemuIpc(Platform):
logger.info('nemu_ipc released') logger.info('nemu_ipc released')
def screenshot_nemu_ipc(self): def screenshot_nemu_ipc(self):
timeout = max(self._screenshot_interval.limit - 0.01, 0.15) image = self.nemu_ipc.screenshot()
image = self.nemu_ipc.screenshot(timeout=timeout)
image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR) image = cv2.cvtColor(image, cv2.COLOR_BGRA2BGR)
cv2.flip(image, 0, dst=image) cv2.flip(image, 0, dst=image)
+1 -1
View File
@@ -26,7 +26,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+2 -1
View File
@@ -1,3 +1,4 @@
import time
from dataclasses import dataclass from dataclasses import dataclass
from functools import wraps from functools import wraps
from json.decoder import JSONDecodeError from json.decoder import JSONDecodeError
@@ -27,7 +28,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle
+4 -4
View File
@@ -186,16 +186,16 @@ class ImageTruncated(Exception):
def retry_sleep(trial): def retry_sleep(trial):
# First trial # First trial
if trial == 0: if trial == 0:
pass return 0
# Failed once, fast retry # Failed once, fast retry
elif trial == 1: elif trial == 1:
pass return 0
# Failed twice # Failed twice
elif trial == 2: elif trial == 2:
time.sleep(1) return 1
# Failed more # Failed more
else: else:
time.sleep(RETRY_DELAY) return RETRY_DELAY
def handle_adb_error(e): def handle_adb_error(e):
+2 -1
View File
@@ -1,4 +1,5 @@
import re import re
import time
from functools import wraps from functools import wraps
from adbutils.errors import AdbError from adbutils.errors import AdbError
@@ -21,7 +22,7 @@ def retry(func):
for _ in range(RETRY_TRIES): for _ in range(RETRY_TRIES):
try: try:
if callable(init): if callable(init):
retry_sleep(_) time.sleep(retry_sleep(_))
init() init()
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
# Can't handle # Can't handle