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:
- Rysowanie zaczyna się, niektóre rzeczy są rysowane
- Zdarzenie przerywa rysowanie i powoduje aktualizację logiki
- 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 № 1Zrobił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);
}
});
}