Rysowanie bitmap kilkukrotnie i przesunięcie palcem po ekranie powoduje ANR

0

Zdaję sobie sprawę, że ten kod nie jest jeszcze zbyt piękny, ale jak to na budowie, najpierw jest bałagan i błoto, a finalnie jest czysto i elegancko. Dlatego na wstępie pragnę zaznaczyć, że proszę sobie darować uszczypliwe komentarze, a zamiast tego liczę na konkretną pomoc.

A problemem mym jest to, że wykonując canvas.drawBitmap(...) kilka razy w klasie GameThread i do tego wykonując gest ruchu na ekranie czyli setX(...) / setY(...) przechwytywany przez onScroll() mojego customowego GestureDetector przekazany do mojego GameMainSurface (klasa extending SurfaceView) powoduje to ANR (application not responding / ui freeze). Otóż ten GestureDetector i onScroll ma takie kluczowe linijki:

GestureListenerMain.java

public class GestureListenerMain implements GestureDetector.OnGestureListener {

    private final GameMainSurface gs;

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        gs.moveX = (int) (startPT.x + e2.getX() - gs.downPT.x);
        gs.moveY = (int) (startPT.y + e2.getY() - gs.downPT.y);

        (...)
        
        gs.setX(gs.moveX);
        gs.setY(gs.moveY);
    }
}

Bez wspomnianych wyżej canvas.drawBitmap(...) w GameThread moje settery setX(...) i setY(...) z GestureListenerMain poruszają mój GameMainSurface elegancko. Problem zaczyna się gdy dodam te canvas.drawBitmap(...) do Loadera i wykonam je w run() GameThread. Tak samo poszczególne framesy bitmapy (jako że jest to bitmap[]) rysują się elegancko dopóki nie przesunę palcem po ekranie, tak więc obydwa działania jakoś nie chcą iść ze sobą w parze niestety i pytanie teraz jak to naprawić?

Oto ten kod:

Loader.java

private static Map<Integer, Bitmap[]> differentFramesMap = new HashMap<>();
private static Map<Integer, Canvas[]> differentCanvasesMap = new HashMap<>();

(...)

public static void drawTmxMaps(Canvas canvas, Context context) {
    canvas.drawBitmap(differentFramesMap.get(0)[framesFirstAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);
    canvas.drawBitmap(differentFramesMap.get(1)[framesSecondAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);
    canvas.drawBitmap(differentFramesMap.get(2)[framesThirdAnimIter], 0, 0, PaintTemplates.getInstance(context).pMap);

    if (!isIterStarted) {
        iterTmxFrames();
        isIterStarted = true;
    }
}

private static void iterTmxFrames() {
    runnable = () -> {
        framesFirstAnimIter++;
        framesSecondAnimIter++;
        framesThirdAnimIter++;
        if (framesFirstAnimIter == 3)
            framesFirstAnimIter = 0;
        if (framesSecondAnimIter == 2)
            framesSecondAnimIter = 0;
        if (framesThirdAnimIter == 2)
            framesThirdAnimIter = 0;
        handler.postDelayed(runnable, 1000);
    };
    handler.postDelayed(runnable, 1000);
}

MyThread.java


@Getter
@Setter
public class GameThread<T extends GameSurface> extends Thread {

    private final SurfaceHolder surfaceHolder;

    private boolean isRunning;
    private long startTime, loopTime;
    private long delay = 33;
    private T gameSurface;
    private boolean a = false;

    public GameThread(SurfaceHolder surfaceHolder, T gameSurface) {
        this.surfaceHolder = surfaceHolder;
        this.gameSurface = gameSurface;
        isRunning = true;
    }
    
@Override
public void run() {
    while (isRunning) {
        startTime = SystemClock.uptimeMillis();
        Canvas canvas = surfaceHolder.lockCanvas(null);
        if (canvas != null) {
            synchronized (surfaceHolder) {

                TmxLoader.drawTmxMaps(canvas, gameSurface.getContext());

                surfaceHolder.unlockCanvasAndPost(canvas);
            }
        }

        loopTime = SystemClock.uptimeMillis() - startTime;

        if (loopTime < delay) {
            try {
                Thread.sleep(delay - loopTime);
            } catch (InterruptedException e) {
                Log.e("Interupted ex", e.getMessage());
            }
        }
    }
}
}

To jest komunikat błędu:

2023-04-20 11:10:55.909 1538-19187/? E/system_server: libdebuggerd_client: failed to read status response from tombstoned: Try again
2023-04-20 11:10:55.959 1538-19187/? E/ActivityManager: ANR in pl.jawegiel.endlessblow (pl.jawegiel.endlessblow/.activities.ActivityGame)
    PID: 18888
    Reason: Input dispatching timed out (b7b670f pl.jawegiel.endlessblow/pl.jawegiel.endlessblow.activities.ActivityGame (server) is not responding. Waited 5001ms for MotionEvent)
    Parent: pl.jawegiel.endlessblow/.activities.ActivityGame
    Frozen: false
    Load: 3.61 / 2.43 / 2.12
    ----- Output from /proc/pressure/memory -----
    some avg10=0.07 avg60=0.07 avg300=0.01 total=62368127
    full avg10=0.00 avg60=0.00 avg300=0.00 total=24408505
    ----- End output from /proc/pressure/memory -----
    
    CPU usage from 0ms to 18602ms later (2023-04-20 11:10:37.309 to 2023-04-20 11:10:55.911):
      102% 18888/pl.jawegiel.endlessblow: 100% user + 2.2% kernel / faults: 25083 minor
      7.2% 9612/wk:_kgsl_event-kgsl-events: 0% user + 7.2% kernel
      6.2% 1082/surfaceflinger: 3.8% user + 2.3% kernel / faults: 969 minor
      6% 1538/system_server: 2.3% user + 3.7% kernel / faults: 2569 minor
      5.2% 375/crtc_commit:132: 0% user + 5.2% kernel
      4% 1009/vendor.qti.hardware.display.composer-service: 2.3% user + 1.7% kernel / faults: 456 minor
      3.1% 1034/media.hwcodec: 2.2% user + 0.9% kernel / faults: 6442 minor
      3.1% 14128/wk:async_run_e-events_unbound: 0% user + 3.1% kernel
      3.1% 15378/com.facebook.orca: 2% user + 1% kernel / faults: 492 minor
      3.1% 22133/wk:ufshcd_clk_-ufs_clkscaling_0: 0% user + 3.1% kernel
      2.3% 26656/com.touchtype.swiftkey: 1.6% user + 0.6% kernel / faults: 417 minor
      1.9% 18972/com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0: 1.3% user + 0.5% kernel / faults: 2371 minor 2 major
      1.6% 2413/com.android.systemui: 1.3% user + 0.3% kernel / faults: 622 minor
      1.6% 30751/wk:async_run_e-events_unbound: 0% user + 1.6% kernel
      1.5% 11977/wk:gc_worker-events_power_efficient: 0% user + 1.5% kernel
      1.3% 6180/wk:ufshcd_clk_-ufs_clkscaling_0: 0% user + 1.3% kernel
      1.2% 16529/adbd: 0.2% user + 0.9% kernel / faults: 1 minor
      0.4% 1000/[email protected]: 0.2% user + 0.1% kernel / faults: 2706 minor
      0.9% 611/logd: 0.3% user + 0.5% kernel / faults: 16 minor
      0.2% 1400/media.extractor: 0.1% user + 0.1% kernel / faults: 2054 minor
      0.6% 12/rcuog/0: 0% user + 0.6% kernel
      0.6% 992/[email protected]: 0.3% user + 0.2% kernel / faults: 281 minor
      0.2% 1420/media.codec: 0.1% user + 0% kernel / faults: 1920 minor
      0.5% 2787/com.android.phone: 0.4% user + 0.1% kernel / faults: 189 minor
      0.5% 11/rcu_preempt: 0% user + 0.5% kernel
      0.1% 4464/com.urbandroid.lux:background: 0% user + 0% kernel / faults: 954 minor 2 major
      0.4% 10529/wk:drain_local-mm_percpu_wq: 0% user + 0.4% kernel
      0.4% 856/logcat: 0.1% user + 0.2% kernel
      0.4% 2590/com.android.networkstack.process: 0.3% user + 0.1% kernel / faults: 211 minor
      0.1% 2640/.qtidataservices: 0.1% user + 0% kernel / faults: 162 minor
      0.4% 26377/dp_rx_thread_1: 0% user + 0.4% kernel
      0.1% 2789/.dataservices: 0.1% user + 0% kernel / faults: 126 minor
      0.3% 18717/logcat: 0.1% user + 0.2% kernel / faults: 4 minor
      0.3% 39/rcuog/4: 0% user + 0.3% kernel
      0.1% 718/tombstoned: 0% user + 0.1% kernel
      0.3% 1016/[email protected]: 0% user + 0.3% kernel / faults: 112 minor
      0.3% 2678/se.dirac.acs: 0.2% user + 0.1% kernel / faults: 114 minor
      0.1% 4385/com.qualcomm.qti.services.secureui:sui_service: 0% user + 0% kernel / faults: 142 minor
      0.2% 989/[email protected]: 0.1% user + 0.1% kernel / faults: 82 minor
      0.1% 4328/com.qualcomm.qti.workloadclassifier: 0% user + 0% kernel / faults: 120 minor
      0.1% 4371/com.asus.stitchimage: 0% user + 0% kernel / faults: 112 minor
      0.2% 7490/thermal-engine: 0% user + 0.2% kernel
      0.2% 376/crtc_event:132: 0% user + 0.2% kernel
      0.2% 397/ueventd: 0.2% user + 0% kernel
      0% 2644/com.qti.phone: 0% user + 0% kernel / faults: 120 minor
      0% 3975/com.qualcomm.location: 0% user + 0% kernel / faults: 120 minor
      0.2% 4222/com.android.nfc: 0.1% user + 0% kernel / faults: 115 minor
2023-04-20 11:10:55.959 1538-19187/? E/ActivityManager:   0% 4244/com.asus.audiowizard: 0% user + 0% kernel / faults: 110 minor
      0% 4249/com.qualcomm.qti.services.systemhelper:systemhelper_service: 0% user + 0% kernel / faults: 126 minor
      0% 4309/.slas: 0% user + 0% kernel / faults: 122 minor
      0% 4421/com.asus.setupwizard: 0% user + 0% kernel / faults: 110 minor
      0.2% 21619/wk:f2fs_verity-fsverity_read_queue: 0% user + 0.2% kernel
      0.1% 1/init: 0.1% user + 0% kernel
      0.1% 13/rcuop/0: 0% user + 0.1% kernel
      0.1% 890/netd: 0% user + 0.1% kernel / faults: 129 minor
      0% 977/[email protected]_64: 0% user + 0% kernel / faults: 35 minor
      0.1% 1402/mediaserver: 0% user + 0.1% kernel / faults: 133 minor
      0% 2652/com.qualcomm.qtil.aptxacu: 0% user + 0% kernel / faults: 108 minor
      0% 2674/com.qualcomm.qtil.aptxals: 0% user + 0% kernel / faults: 112 minor
      0% 2720/org.codeaurora.ims: 0% user + 0% kernel / faults: 120 minor
      0% 2765/com.android.se: 0% user + 0% kernel / faults: 117 minor
      0% 2769/com.qualcomm.qti.devicestatisticsservice: 0% user + 0% kernel / faults: 119 minor
      0.1% 3330/msm_irqbalance: 0% user + 0.1% kernel
      0% 4359/com.asus.hbm: 0% user + 0% kernel / faults: 108 minor
      0.1% 16204/com.google.android.gms.persistent: 0% user + 0.1% kernel / faults: 10 minor
      0.1% 21/rcuop/1: 0% user + 0.1% kernel
      0.1% 27/rcuop/2: 0% user + 0.1% kernel
      0.1% 33/rcuop/3: 0% user + 0.1% kernel
      0.1% 58/rcuop/7: 0% user + 0.1% kernel
      0% 708/f2fs_discard-25: 0% user + 0% kernel
      0% 974/android.hardware.audio.service: 0% user + 0% kernel / faults: 111 minor
      0% 1387/cameraserver: 0% user + 0% kernel / faults: 65 minor
      0.1% 1450/media.swcodec: 0% user + 0% kernel / faults: 243 minor
      0.1% 15485/com.google.android.gms: 0% user + 0% kernel / faults: 8 minor
      0% 14/migration/0: 0% user + 0% kernel
      0% 18/ksoftirqd/1: 0% user + 0% kernel
      0% 23/migration/2: 0% user + 0% kernel
      0% 40/rcuop/4: 0% user + 0% kernel
      0% 52/rcuop/6: 0% user + 0% kernel
      0% 395/init: 0% user + 0% kernel
      0% 865/poweropt-service: 0% user + 0% kernel
      0% 981/[email protected]: 0% user + 0% kernel / faults: 39 minor
      0% 982/[email protected]: 0% user + 0% kernel / faults: 37 minor
      0% 985/[email protected]: 0% user + 0% kernel
      0% 986/[email protected]: 0% user + 0% kernel / faults: 22 minor
      0% 1071/audioserver: 0% user + 0% kernel / faults: 60 minor
      0% 1247/diag-router: 0% user + 0% kernel
      0% 1281/drmserver: 0% user + 0% kernel / faults: 55 minor
      0% 1482/[email protected]: 0% user + 0% kernel / faults: 30 minor
      0% 1566/qcrilNrd: 0% user + 0% kernel / faults: 3 minor
      0% 2008/shsusrd: 0% user + 0% kernel
      0% 9885/wk:vmstat_upda-mm_percpu_wq: 0% user + 0% kernel
      0% 14168/wk:pm_runtime_-pm: 0% user + 0% kernel
      0% 15196/wk:pm_runtime_-pm: 0% user + 0% kernel
      0% 15809/com.android.vending:instant_app_installer: 0% user + 0% kernel / faults: 3 minor
      0% 16265/irq/26-9091000.: 0% user + 0% kernel
      0% 16266/irq/25-90b6400.: 0% user + 0% kernel
      0% 17046/wk:delayed_fpu-events: 0% user + 0% kernel
      0% 17657/wk:blk_mq_run_-kblockd: 0% user + 0% kernel
    22% TOTAL: 16% user + 5.1% kernel + 0% iowait + 0.5% irq + 0.2% softirq
    CPU usage from 71ms to 410ms later (2023-04-20 11:10:37.380 to 2023-04-20 11:10:37.719):
      98% 18888/pl.jawegiel.endlessblow: 98% user + 0% kernel / faults: 272 minor
        98% 19138/Thread-10: 98% user + 0% kernel
      33% 1538/system_server: 10% user + 23% kernel / faults: 780 minor
        33% 19187/AnrConsumer: 10% user + 23% kernel
      6% 375/crtc_commit:132: 0% user + 6% kernel
      6.4% 1082/surfaceflinger: 6.4% user + 0% kernel
        3.2% 1082/surfaceflinger: 3.2% user + 0% kernel
        3.2% 3175/Binder:1082_4: 3.2% user + 0% kernel
      8.6% 22133/wk:__typeid__Z-memlat_wq: 0% user + 8.6% kernel
      2.9% 11/rcu_preempt: 0% user + 2.9% kernel
      3.2% 1009/vendor.qti.hardware.display.composer-service: 0% user + 3.2% kernel
2023-04-20 11:10:55.959 1538-19187/? E/ActivityManager:     3.2% 1009/composer-servic: 0% user + 3.2% kernel
      3.3% 1566/qcrilNrd: 0% user + 3.3% kernel / faults: 1 minor
      3.6% 4464/com.urbandroid.lux:background: 0% user + 3.6% kernel
      3.7% 9612/wk:__qdf_defer-hal_register_write_wq: 0% user + 3.7% kernel
      3.7% 11977/wk:__qdf_defer-events: 0% user + 3.7% kernel
      3.8% 15378/com.facebook.orca: 0% user + 3.8% kernel
      4.2% 18972/com.google.android.webview:sandboxed_process0:org.chromium.content.app.SandboxedProcessService0:0: 4.2% user + 0% kernel
    22% TOTAL: 15% user + 6.3% kernel + 0.3% irq + 0.3% softirq

Troszkę może chaotycznie, ale help me

0

"Powoduje ANR" to nic nie znaczy. Pokaż komunikat błędu, stacktrace i która linia kodu powoduje błąd. Podejrzewałbym jakieś OutOfMemoryException, ale moja szklana kula się akurat popsuła niestety.

0

Az sie zalogowalem specjalnie

@Getter
@Setter
public class GameThread<T extends GameSurface> extends Thread {
 private final SurfaceHolder surfaceHolder;

    private boolean isRunning;
    private long startTime, loopTime;
    private long delay = 33;

https://giphy.com/gifs/morgan-freeman-good-luck-kVaj8JXJcDsqs

1

No to oznacza tylko tyle, że masz gdzieś jakiegoś deadlocka, główny wątek zwisa i aplikacja przestaje odpowiadać. Reszta tak jak napisał kolega wyżej, ciężko ci będzie debugować taki kod. Być może przyczyną jest np to, że coś rysujesz z wątki pobocznego i nie synchronizujesz tego z głównym wątkiem, który odświeża gui przy przesuwaniu palcem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1