Why are touch events destroying my Android framerate?

前端 未结 5 1797
傲寒
傲寒 2020-12-25 15:44

I\'m developing a game for Android. It\'s got a lot going on but is running reasonably smoothly. That is, of course, until the user touches the screen.

While they\'r

相关标签:
5条回答
  • 2020-12-25 15:58

    If you want a solution without having to deal with synchronizing threads I can recommend using the Handler interface to send the event and relevant data using a Message/Bundle to the game rendering thread. The sleep workaround hinted here still applies.

    0 讨论(0)
  • 2020-12-25 15:59

    I've been trying to follow everything you guys have been talking about, but I must admit that after trying several ways of implementing what you suggest, I still haven't been able to achieve any positive results. Could one of you provide some example code? Specifically, I'd like to know how to go about making the main/UI thread sleep. If it's applicable to my games, it would also be nice to know how to set up a polling model like Jon implemented.

    Here's what my code looks like. On the UI thread:

    public boolean onTouchEvent(MotionEvent event) {
        // Store event somewhere the game thread can see it:
        // ...
    
        synchronized (someObject) {
            try {
                someObject.wait(1000L);
            } catch (InterruptedException e) {
            }
        }
    
        return true;
    }
    

    and on the Game thread:

    void myGame() {
        while (!stopping) {
            // ...
    
            // Get a touch event:
            synchronized (someObject) {
                someObject.notify();
            }
            Thread.yield();
    
            // ...
        }
    }
    
    0 讨论(0)
  • 2020-12-25 16:17

    Perhaps a somewhat obvious solution, but... have you tried only handling about 1/10 of them? If you're doing processing that's triggered every 10ms on the UI thread, that's likely going to slow down the framerate, yes. So what if you just accumulate a counter somewhat instead and only do any processing once that's gotten past some minimal threshold?

    0 讨论(0)
  • 2020-12-25 16:18

    Read this thread. Basically you want to sleep the event thread since otherwise the system will pump a lot of events (between x,y and pressure there is always some movement going on) that you need to handle.

    0 讨论(0)
  • 2020-12-25 16:19

    Generally events comes with a timestamp property so it's easy to compute and throttle event rate.

    if (currentEventTimestamp - lastEventTimestamp > 500) { 
    
        lastEventTimestamp = currentEventTimestamp;
    
        // do something 
    
    }

    0 讨论(0)
提交回复
热议问题