Android, OpenGL та розширення GLSurfaceView?


12

Це питання є частково-технічним, частково-мета, частково-суб'єктивним та дуже конкретним:

Я розробник інді-ігор, який працює на андроїд, і останні 6 місяців я боровся і, нарешті, досяг успіху зробити свій власний 3D-додаток для андроїд. Тому я подумав, що я скачу на SO та допоможу іншим, хто бореться з android та openGL-ES

Однак переважна більшість питань стосується поширення GLSurfaceView. Я зробив цілу програму, не продовжуючи GLSurfaceView(і вона працює нормально). Я взагалі не бачу жодної причини звертатися GLSurfaceViewдо більшості питань, які мені трапляються.

Гірше, що документація на андроїд означає, що вам потрібно, але не дає детального пояснення, чому або які плюси / мінуси проти не поширюються, і робити все, впроваджуючи власні GLSurfaceView.Rendererяк я

І все-таки, велика кількість запитань, де проблема пов'язана лише з розширенням GLSurfaceView, змушує мене замислитися, чи є насправді якась справді хороша причина для цього так, як я це робив (і пропоную у своїх відповідях іншим зробити).

Отже, чи щось мені не вистачає? Чи потрібно тим часом перестати відповідати на запитання?

Документація на OpenGL для Android


приємне запитання, яке я захоплюю відповіддю ..
Tofeeq

Одна з причин, чому розширити GLSurfaceView можна знайти тут: gamedev.stackexchange.com/questions/12629 / ... Не усвідомлюючи цього, я на самому справі вже ухилилася питання говорили в цьому питанні в моєму додатку, перевантажувальні текстури і т.д.onResume()
Ложка Thumb

Відповіді:


2

У мене дуже мінімальне розширення для моєї GLSurfaceView, і більша частина мудрості належить моєму виконанню GLSurfaceView.Renderer. У мене були такі три причини використовувати обгортку для GLSurfaceView:

  1. База GLSurfaceViewне забезпечує можливості повернути Rendererекземпляр. У мене декілька поверхонь, і коли я отримую події інтерфейсу для однієї з них, я хочу передати команду відповідному рендереру. Отже, я переосмислюю setRendererі зберігаю посилання у своєму розширеному класі.

  2. GLSurfaceView.Rendererне отримувати повідомлення onDetachedFromWindow()або surfaceDestroyed(). Це спричинило деякі проблеми з моєю реалізацією. Моє розширення GLSurfaceViewзамінює ці методи та дає змогу mRenderer знати. Це можливо через §1 .

  3. Деякі способи лише додаються, щоб додати try { super.що ; } catch() { log(завгодно) } . Наприклад, queueEvent()буде кидати, якщо Renderer не встановлений; але для мене нормально просто ігнорувати подібні невідповідності часової шкали.


Я також почав це робити, хоча питання більше спрямоване на те, чому ви могли б розширити фактичну логіку, GLSurfaceViewа не GLSurfaceView.Renderer. Хоча в пункті 1, я зберігаю візуалізацію як змінну в своїй діяльності. В теорії я можу отримати його з будь-якої точки лиття контексту: ((MyActivity)view.getContext()).getRenderer(). Можливо, трохи небезпечнішим, оскільки контекстний об’єкт не обов'язково може бутиMyActivity
ложка великого пальця

Добре, якщо у вас є один рендер. Але, як я вже говорив, у нас багато рендерів, і вони підключаються до різних SurfaceViews - безлад!
Алекс Кон

0

Принаймні одна хороша причина для розширення GLSurfaceView - це можливість екземпляру його безпосередньо з файлу xml-файлу, як і будь-який інший віджет:

    <RelativeLayout ... >
      <com.example.MyGlSurfaceView
        android:id="@+id/my_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
      />
     </RelativeLayout>

1
Це можна зробити в будь-якому випадку, використовуючи<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
ложка великого пальця

Гарна думка. Різниця полягає в тому, що в моєму прикладі система Android надуває і налаштовує все, не потребуючи зайвих рядків коду. Ваш метод є більш кодовим, але гнучким для заміни реалізації. Крім цього, обидва способи здаються схожими.
Амір Уваль

-1

Добре ... GLSurfaceView, як я впевнений, ви помітили, просто обгортка для загального блага. Він включає в себе всю функціональність, яку потрібно буде надати за допомогою opengl, маючи можливість гарненько включити її в ієрархію перегляду android.

Ви не запропонували свою альтернативу, тому неможливо порівняти, але я сподіваюся, що ви породили ще один потік для візуалізації, як це робить GLSurfaceView, або ваш вклад користувача може відставати.

Отже, знову: GLSurfaceView пропонує новий потік для візуалізації, тож вам не доведеться турбуватися про відставання введення користувача


2
Так, але GLSurfaceViewчи це (запускає нитку візуалізації), навіть якщо ви не продовжуєте її. Я використовую GLSurfaceView, але не продовжую. Я запитую, які переваги є від його розширення та скасування різних методів у ньому, а не від того, щоб мати все, що потрібно,Renderer
ложка великого пальця

привет, я спробував :) Я можу розглянути це пізніше, зараз мені теж цікаво!
Грег
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.