/ / Czy zdarzenie w kolejce może przerwać połączenie onDrawFrame? - Java, Android, renderowanie, opengl-es-2.0

Czy zdarzenie w kolejce może przerwać połączenie onDrawFrame? - Java, Android, renderowanie, opengl-es-2.0

Zaraz zacznę kłaść podwaliny pod gręlogikę w mojej grze OpenGL ES 2.0 i jestem bardzo zaniepokojony obsługą zdarzeń (głównie zdarzeń wejściowych) dopiero po zakończeniu renderowania. Nie chcę, aby miały miejsce następujące zdarzenia:

  1. Rysowanie zaczyna się, niektóre rzeczy są rysowane
  2. Zdarzenie przerywa rysowanie i powoduje aktualizację logiki
  3. Rysowanie trwa nadal z niespójną logiką

Nadal nie znalazłem jasnej odpowiedzi: tak lub nie. Ponieważ jeśli tego rodzaju kod:

    if(event.getAction() == MotionEvent.ACTION_DOWN){
mGLSurfaceView.queueEvent(new Runnable(){
@Override
public void run(){
triangleRenderer.handleTouchPress(normalizedX, normalizedY);
}
});
}

nie wystarcza, aby zagwarantować, że rysowanie i obsługa zdarzenia dotyku są zawsze sekwencyjne, nigdy nie są przeplatane, wtedy myślę, że musiałbym zaimplementować coś do przechowywania, a następnie obsługiwać „zdarzenia”.

Odpowiedzi:

0 dla odpowiedzi № 1

Zrobiłem kilka testów i teraz jestem prawie pewien, że wydarzenia nigdy nie przerywają połączenia losowania Renderera i są dostarczane pomiędzy tymi losowaniami.

Użyłem pętli całkowitego uśpienia 2000 x 1ms = 2s w onDrawFrame podczas rejestrowania zarówno w momencie, gdy zdarzenie osiąga GLSurfaceView, jak i w momencie uruchomienia procedury obsługi Renderera.

Wydaje się bezpieczny dla wątków - choć trochę zabawny: mój kod logowania w SurfaceView, umieszczony tuż przed queueEvent, zawsze był wywoływany podwójnie: najpierw w momencie dotknięcia, a następnie tuż przed uruchomieniem modułu obsługi zdarzeń Renderera.

    if (event.getAction() == MotionEvent.ACTION_DOWN)
{
long tmp = System.nanoTime() / 1000000;
Log.w("EVENT", "SurfaceView " + tmp); // executed doubly! funny stuff.
queueEvent(new Runnable()
{
@Override
public void run()
{
gameRenderer.handleTouchPress(normalizedX, normalizedY);
}
});
}