/ / Чи може подія в черзі перервати виклик onDrawFrame? - java, android, візуалізація, opengl-es-2.0

Чи може подія в черзі перервати виклик onDrawFrame? - java, android, візуалізація, opengl-es-2.0

Я збираюся почати закладати основи для грилогіки в моїй грі OpenGL ES 2.0, і я дуже стурбований обробкою подіями (в основному подіями вводу) лише тоді, коли закінчу рендерінг. Я не хочу, щоб сталося таке:

  1. Починається малювання, малюються деякі речі
  2. Подія перериває малюнок і викликає логічне оновлення
  3. Малювання продовжується непослідовною логікою

Я все ще не знайшов чіткої відповіді: Так чи ні. Тому що якщо такий код:

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

недостатньо для того, щоб гарантувати, що малювання та обробка сенсорної події завжди послідовні, ніколи не переплітаються, тоді я думаю, що мені доведеться щось реалізувати для зберігання, а потім обробляти "подіями".

Відповіді:

0 для відповіді № 1

Я зробив кілька тестувань, і тепер я впевнений, що події ніколи не переривають дзвінок Renderer при виклику, і передаються між цими дзвінками.

Я використовував загальний цикл сну 2000 x 1ms = 2s у onDrawFrame під час реєстрації як моменту, коли подія досягне GLSurfaceView, так і моменту запуску обробника подій Renderer.

Це здається безпечним для потоків - хоча трохи смішно: мій код реєстрації в SurfaceView, розміщений безпосередньо перед queueEvent, завжди викликався подвійно: спочатку в момент дотику, а потім прямо перед тим, як звільнити обробника подій Renderer.

    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);
}
});
}