Отрисовка пользовательского интерфейса Android поверх GLSurfaceView

Для моей игры я думаю о рисовании элементов пользовательского интерфейса (TextView для отображения прошедшего времени, кнопок для приостановки/перезапуска игры) поверх моего GLSurfaceView с использованием RelativeLayout...

До сих пор я сам рисовал все элементы пользовательского интерфейса непосредственно в SurfaceView, но, учитывая широкие возможности, доступные в пользовательском интерфейсе Android (например, изменение шрифта шрифта и цвета), я решил использовать его.

Вопросы:

  • Является ли хорошей практикой рисовать элементы пользовательского интерфейса поверх GLSurfaceView или лучше самому рисовать все элементы пользовательского интерфейса непосредственно на GLSurfaceView?
  • Я буду регулярно обновлять содержимое элементов пользовательского интерфейса (скажем, TextView) (каждые 16 мс), используя метод runOnUiThread()... Это плохо?
  • Будет ли моя игра подвержена принудительному закрытию?

Вот тестовый Java-код, который я использую для настройки RelativeLayout... glView - это экземпляр GLSurfaceView.

    rl = new RelativeLayout(this);
    rl.addView(glView);        
    tv = new TextView(this);
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    lp.addRule(RelativeLayout.ALIGN_TOP);
    tv.setLayoutParams(lp);
    tv.setText("FPS: 0");
    tv.setBackgroundColor(0x4060ff70);
    rl.addView(tv);

    setContentView(rl);

person BLOB    schedule 10.01.2013    source источник


Ответы (2)


  • Является ли хорошей практикой рисовать элементы пользовательского интерфейса поверх GLSurfaceView или лучше самому рисовать все элементы пользовательского интерфейса непосредственно в GLSurfaceView?

Кажется хорошей идеей рисовать элементы управления Android поверх GLSurfaceView, если вам нужна гибкость, которую обеспечивает система макета Android. Предупреждение, однако, что эти элементы управления могут отображаться гораздо медленнее, чем ваш glSurfaceView, поэтому убедитесь, что пользовательский интерфейс не требует слишком много графической мощности для рендеринга и не обновляется слишком быстро.

Рендеринг всего самостоятельно — это вариант, но тогда вы потеряете все функции, которые вы можете получить от системы пользовательского интерфейса Android.

  • Я буду регулярно обновлять содержимое элементов пользовательского интерфейса (скажем, TextView) (каждые 16 мс) с помощью метода runOnUiThread()... Это плохо?

Звучит хорошо для меня.

  • Будет ли моя игра подвержена принудительному закрытию?

Это не имеет ничего общего с другими вопросами. Если вы будете следовать правильному использованию и не будете вызывать исключения, то все будет в порядке. Если вы вызываете исключения, ваше приложение будет принудительно закрыто (если вы не обработаете исключения должным образом).

person Tim    schedule 10.01.2013

Я делаю это в настоящее время в игре для Android, которую я делаю, поэтому я решил поделиться своим опытом.

Является ли хорошей практикой рисовать элементы пользовательского интерфейса поверх GLSurfaceView или лучше самому рисовать все элементы пользовательского интерфейса непосредственно в GLSurfaceView?

Лично я считаю хорошей практикой использовать встроенные виджеты пользовательского интерфейса, которые Android предоставляет вам для рисования пользовательского интерфейса. Есть определенные ситуации, когда это не подходит, например. Элементы управления пользовательского интерфейса, которые можно перетаскивать по игровой области или которые имеют сложную анимацию или поведение.

Если вам нужны кнопки и текстовые представления, я рекомендую подход, который вы предлагаете.

Я буду регулярно обновлять содержимое элементов пользовательского интерфейса (скажем, TextView) (каждые 16 мс) с помощью метода runOnUiThread()... Это плохо?

Будет ли моя игра подвержена принудительному закрытию?

Я использую ту же систему для обновления своих компонентов пользовательского интерфейса. Мне не нужно обновлять так часто, как каждые 16 мс, но у меня, конечно, нет проблем с принудительным закрытием или неотвечающими пользовательскими интерфейсами.

Если у вас было много (я имею в виду 10-20+) компонентов, которые регулярно обновлялись, то вполне возможно, что вы могли столкнуться с проблемами неотвечающего пользовательского интерфейса.

Вам нужно обновлять представление каждые 16 мс (около 60 кадров в секунду)? Вы можете обновить базовое значение, чтобы поддерживать правильную логику, но обновлять представление только каждые 20-30 кадров в секунду, чтобы при необходимости уменьшить объем, выполняемый в потоке пользовательского интерфейса.

Я думаю, что пользовательские интерфейсы не нужно обновлять так часто, как ваш вид openGL, поскольку у вас нет вещей, которые крутятся одинаково. Если бы textView обновлялся 20 раз в секунду, вы все равно чувствовали бы его постоянное изменение.

person Twice Circled    schedule 05.03.2013
comment
Да ... имеет смысл ... не могли бы вы рассмотреть другой вопрос, который я разместил некоторое время назад? stackoverflow .com/questions/14522715/ - person BLOB; 06.03.2013