Dlaczego zdarzenia dotykowe niszczą moją liczbę klatek na sekundę na Androida?

[9]}pracuję nad grą na Androida. Dużo się dzieje, ale działa całkiem sprawnie. Oznacza to, oczywiście, dopóki użytkownik nie dotknie ekranu.

Gdy go dotykają, onTouchEvent nazywa się (z action = ACTION_MOVE, x = 0 i y = 0) mniej więcej raz na dziesięć milisekund, co wydaje się być dość wysokim priorytetem, ponieważ całkowicie niszczy framerate. Gdy tylko dotknięcie się zakończy, liczba klatek na sekundę powraca do swojego ładnego stanu.

Próbowałem

  • mając onTouchEvent obsługa wejścia do gry jak zwykle
  • having onTouchEvent return true straight away
  • brak onTouchEvent implementacji w ogóle
Problem utrzymuje się we wszystkich trzech sytuacjach. Czy ktoś się z tym zetknął? Czy istnieje sposób, aby zmniejszyć szybkość generowania zdarzeń ACTION_MOVE, lub aby upewnić się, że są one generowane tylko wtedy, gdy istnieje rzeczywisty ruch, lub użyć metody ankiety, która po prostu pobiera aktualną lokalizację dotyku? A nawet po prostu sposób, aby go wyłączyć całkowicie?
Author: Gilles, 2009-04-27

5 answers

Przeczytaj Ten wątek. Zasadniczo chcesz uśpić wątek zdarzeń, ponieważ w przeciwnym razie system pompuje wiele zdarzeń (między x,y i ciśnieniem zawsze dzieje się jakiś ruch), które musisz obsłużyć.

 13
Author: hacken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 17:43:53
Próbowałem śledzić wszystko, o czym rozmawialiście. o, ale muszę przyznać, że po wypróbowaniu kilku sposobów realizacji co sugerujesz, nadal nie byłem w stanie osiągnąć żadnego pozytywnego wyniki. Czy ktoś z was mógłby podać jakiś przykładowy kod? W szczególności, Chciałbym wiedzieć, jak zrobić sen główny / UI wątku. Jeśli dotyczy to moich gier, fajnie by było też wiedzieć jak ustawić up a ankieting model like Jon wdrożone.
Oto jak wygląda mój kod. Na wątku UI:
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;
}

I w wątku gry:

void myGame() {
    while (!stopping) {
        // ...

        // Get a touch event:
        synchronized (someObject) {
            someObject.notify();
        }
        Thread.yield();

        // ...
    }
}
 1
Author: Damocles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-02 03:07:59

Być może dość oczywiste rozwiązanie, ale... próbowałeś obsługiwać tylko 1/10 z nich? Jeśli robisz przetwarzanie, które jest wyzwalane co 10ms w wątku UI, to prawdopodobnie spowolni to liczbę klatek na sekundę, tak. Co z tego, że zamiast tego zgromadzisz licznik i wykonasz jakiekolwiek przetwarzanie tylko wtedy, gdy przekroczysz jakiś minimalny próg?

 0
Author: pjz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-27 13:09:00

Jeśli potrzebujesz rozwiązania bez konieczności synchronizowania wątków, mogę polecić użycie interfejsu obsługi, aby wysłać Zdarzenie i odpowiednie dane za pomocą wiadomości / pakietu do wątku renderowania gry. Zaproponowane tutaj obejście snu nadal obowiązuje.

 0
Author: Björn Harrtell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 19:20:56

Ogólnie zdarzenia mają właściwość timestamp, więc łatwo jest obliczyć i ograniczyć częstotliwość zdarzeń.

if (currentEventTimestamp - lastEventTimestamp > 500) { 

    lastEventTimestamp = currentEventTimestamp;

    // do something 

}
 0
Author: h.martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-24 14:41:09