Этот вопрос является частично техническим, частично мета, частично субъективным и очень специфическим:
Я разработчик инди-игр, работаю на Android, и в течение последних 6 месяцев я боролся и, наконец, сумел создать собственное приложение для 3D-игр для Android. Так что я подумал, что я буду надеяться на SO и помогать другим, борющимся с android и openGL-ES
Однако подавляющее большинство вопросов связано с расширением GLSurfaceView
. Я сделал все мое приложение без расширения GLSurfaceView
(и оно работает нормально). Я не вижу никакой причины расширять GLSurfaceView
большинство вопросов, с которыми я сталкиваюсь.
Хуже того, документация по Android подразумевает, что вы должны это сделать, но не дает подробного объяснения того, почему или в чем плюсы / минусы, а не в том, чтобы расширять и делать все через реализацию своих собственных, GLSurfaceView.Renderer
как я сделал
Тем не менее, огромное количество вопросов, в которых проблема связана исключительно с расширением GLSurfaceView
, заставляет меня задуматься, есть ли на самом деле какая-то действительно веская причина для того, чтобы делать это так, как я это делал (и предлагать в своих ответах другим сделать).
Итак, я что-то упускаю? Должен ли я прекратить отвечать на вопросы в то же время?
onResume()
Ответы:
У меня есть очень минимальное расширение для меня
GLSurfaceView
, и большая часть мудрости принадлежит моей реализацииGLSurfaceView.Renderer
. У меня были следующие три причины использовать обертку дляGLSurfaceView
:База не
GLSurfaceView
дает возможности вернутьRenderer
экземпляр. У меня есть несколько поверхностей, и когда я получаю событие пользовательского интерфейса для одной из них, я хочу передать команду соответствующему средству визуализации. Итак, я перезаписываюsetRenderer
и сохраняю ссылку в моем расширенном классе.GLSurfaceView.Renderer
не получает уведомления дляonDetachedFromWindow()
илиsurfaceDestroyed()
. Это вызвало некоторые проблемы в моей реализации. Мое расширениеGLSurfaceView
переопределяет эти методы и сообщает mRenderer . Это возможно из-за §1 .Некоторые методы добавляются только для добавления
try { super.
чего; } catch() { log(
угодно) }
. Например,queueEvent()
сгенерирует, если Renderer не установлен; но для меня нормально просто игнорировать такие несоответствия графика.источник
GLSurfaceView
а не вGLSurfaceView.Renderer
. Хотя в пункте 1 я сохраняю визуализатор как переменную в моей деятельности. В теории я могу получить его из любой точки литья контекста:((MyActivity)view.getContext()).getRenderer()
. Возможно, немного более опасным, поскольку контекстный объект не обязательно может бытьMyActivity
По крайней мере, одна из веских причин для расширения GLSurfaceView - это возможность создавать его экземпляры непосредственно из XML-файла макета, как и любой другой виджет:
источник
<android.opengl.GLSurfaceView android:id="@+id/graphics_glsurfaceview1" android:layout_width="fill_parent" android:layout_height="fill_parent" />
Ну ... GLSurfaceView, как я уверен, вы заметили, просто оболочка для общего блага. Он включает в себя всю функциональность, необходимую для рендеринга с помощью opengl, и имеет возможность красиво интегрировать ее с иерархией представления Android.
Вы не предоставили свой вариант, поэтому его невозможно сравнить, но я надеюсь, что вы создали другой поток для рендеринга, как это делает GLSurfaceView, иначе ваш пользовательский ввод может запаздывать.
Итак, еще раз: GLSurfaceView предоставляет новый поток для рендеринга, так что вам не нужно беспокоиться о задержке пользовательского ввода
источник
GLSurfaceView
делает это (запускает поток рендеринга), даже если вы не расширяете его. Я используюGLSurfaceView
, но я не расширяю это. Я спрашиваю, какая польза от его расширения и переопределения различных методов в нем, в отличие от просто иметь все вRenderer