22
33我感觉还是先看一下源码,了解一下内部的流程,再接着学习其他的OpenGL部分会更合适。
44
5- 从上一篇文章中GLSurfaceView的使用中可以看到入口是setRenderer()方法,这里就卡一下setRenderder (Renderer renderer)方法的实现:
5+ 从上一篇文章中GLSurfaceView的使用中可以看到入口是setRenderer()方法,这里就看一下setRenderder (Renderer renderer)方法的实现:
66
77- Renderer接口
88
@@ -50,7 +50,7 @@ public void setRenderer(Renderer renderer) {
5050 super ();
5151 mWidth = 0 ;
5252 mHeight = 0 ;
53- // 连续渲染模式下是true,如果是按需渲染模式就为false,然后通过requesetRender()方法来修改它的值
53+ // 连续渲染模式下是true,如果是按需渲染模式就为false,然后通过requesetRender()方法来修改它的值
5454 mRequestRender = true ;
5555 // 默认的渲染模式
5656 mRenderMode = RENDERMODE_CONTINUOUSLY ;
@@ -74,7 +74,7 @@ public void setRenderer(Renderer renderer) {
7474 sGLThreadManager. threadExiting(this );
7575 }
7676 }
77- // GLSurfaceView的onPause方法会调用到这里
77+ // GLSurfaceView的onPause方法会调用到这里
7878 public void onPause () {
7979 synchronized (sGLThreadManager) {
8080 if (LOG_PAUSE_RESUME ) {
@@ -97,7 +97,7 @@ public void setRenderer(Renderer renderer) {
9797 }
9898 }
9999 }
100- // GLSurfaceView的onResume方法会调用到这里
100+ // GLSurfaceView的onResume方法会调用到这里
101101 public void onResume () {
102102 synchronized (sGLThreadManager) {
103103 if (LOG_PAUSE_RESUME ) {
@@ -135,7 +135,7 @@ public void setRenderer(Renderer renderer) {
135135
136136 ``` java
137137 private void guardedRun() throws InterruptedException {
138- // GL帮助类,内部建立GL环境
138+ // GL帮助类,内部建立GL环境
139139 mEglHelper = new EglHelper (mGLSurfaceViewWeakRef);
140140 mHaveEglContext = false ;
141141 mHaveEglSurface = false ;
@@ -159,16 +159,15 @@ public void setRenderer(Renderer renderer) {
159159 while (true ) {
160160 synchronized (sGLThreadManager) {
161161 while (true ) {
162- // 外部请求退出
162+ // 外部请求退出
163163 if (mShouldExit) {
164164 return ;
165- }
166- // 如果还有GL线程中要处理的事件没处理完,就先处理事件
165+ // 如果还有GL线程中要处理的事件没处理完,就先处理事件
167166 if (! mEventQueue. isEmpty()) {
168167 event = mEventQueue. remove(0 );
169168 break ;
170169 }
171- // 更新onResume和onPause时的状态变化
170+ // 更新onResume和onPause时的状态变化
172171 // Update the pause state.
173172 boolean pausing = false ;
174173 if (mPaused != mRequestPaused) {
@@ -180,7 +179,7 @@ public void setRenderer(Renderer renderer) {
180179 Log . i(" GLThread" , " mPaused is now " + mPaused + " tid=" + getId());
181180 }
182181 }
183- // 需要释放EGLContext
182+ // 需要释放EGLContext
184183 // Do we need to give up the EGL context?
185184 if (mShouldReleaseEglContext) {
186185 if (LOG_SURFACE ) {
@@ -191,22 +190,22 @@ public void setRenderer(Renderer renderer) {
191190 mShouldReleaseEglContext = false ;
192191 askedToReleaseEglContext = true ;
193192 }
194- // 如果EGLContext丢失,需要销毁EGLSurface和EGLContext
193+ // 如果EGLContext丢失,需要销毁EGLSurface和EGLContext
195194 // Have we lost the EGL context?
196195 if (lostEglContext) {
197196 stopEglSurfaceLocked();
198197 stopEglContextLocked();
199198 lostEglContext = false ;
200199 }
201- // 如果onPause了并且当前GLSurface已经存在了,就销毁EGLSurface
200+ // 如果onPause了并且当前GLSurface已经存在了,就销毁EGLSurface
202201 // When pausing, release the EGL surface:
203202 if (pausing && mHaveEglSurface) {
204203 if (LOG_SURFACE ) {
205204 Log . i(" GLThread" , " releasing EGL surface because paused tid=" + getId());
206205 }
207206 stopEglSurfaceLocked();
208207 }
209- // 接受了onPuase信号,并且当前EGLContext存在时,需要根据用户的设置来决定是否销毁EGLContext
208+ // 接受了onPuase信号,并且当前EGLContext存在时,需要根据用户的设置来决定是否销毁EGLContext
210209 // When pausing, optionally release the EGL Context:
211210 if (pausing && mHaveEglContext) {
212211 GLSurfaceView view = mGLSurfaceViewWeakRef. get();
@@ -256,10 +255,10 @@ public void setRenderer(Renderer renderer) {
256255 finishDrawingRunnable = mFinishDrawingRunnable;
257256 mFinishDrawingRunnable = null ;
258257 }
259- // readyToDraw()方法内部会判断是否已经pause或者mRequestRender是否是true以及是否是主动渲染模式。如果是被动渲染的模式mRequestRender就会是false,只有调用requestRender()方法后才会是true,如果是主动渲染模式readyToDraw()就不用根据mRequestRender来判断。
258+ // readyToDraw()方法内部会判断是否已经pause或者mRequestRender是否是true以及是否是主动渲染模式。如果是被动渲染的模式mRequestRender就会是false,只有调用requestRender()方法后才会是true,如果是主动渲染模式readyToDraw()就不用根据mRequestRender来判断。
260259 // Ready to draw?
261260 if (readyToDraw()) {
262- // 没有EGLContext就去调用EGLHelper来创建,第一次会走到这里先创建EGLContext
261+ // 没有EGLContext就去调用EGLHelper来创建,第一次会走到这里先创建EGLContext
263262 // If we don't have an EGL context, try to acquire one.
264263 if (! mHaveEglContext) {
265264 if (askedToReleaseEglContext) {
@@ -332,7 +331,7 @@ public void setRenderer(Renderer renderer) {
332331 }
333332
334333 if (createEglSurface) {
335- // EglHelper创建EglSurface
334+ // EglHelper创建EglSurface
336335 if (mEglHelper. createSurface()) {
337336 synchronized (sGLThreadManager) {
338337 mFinishedCreatingEglSurface = true ;
@@ -554,7 +553,7 @@ public void setRenderer(Renderer renderer) {
554553 */
555554 GLSurfaceView view = mGLSurfaceViewWeakRef. get();
556555 if (view != null ) {
557- // 也是通过EGLWindowSurfaceFactory来创建EGLSurface,如果没有设置就会调用默认的DefaultWindowSurfaceFactory。后面说一下这里
556+ // 也是通过EGLWindowSurfaceFactory来创建EGLSurface,如果没有设置就会调用默认的DefaultWindowSurfaceFactory。后面说一下这里
558557 mEglSurface = view. mEGLWindowSurfaceFactory. createWindowSurface(mEgl,
559558 mEglDisplay, mEglConfig, view. getHolder());
560559 } else {
@@ -619,7 +618,7 @@ public void setRenderer(Renderer renderer) {
619618 EGL10. EGL_NO_CONTEXT );
620619 GLSurfaceView view = mGLSurfaceViewWeakRef. get();
621620 if (view != null ) {
622- // EGLWindowSurfaceFactory除了创建EGLSurface还有销毁的功能
621+ // EGLWindowSurfaceFactory除了创建EGLSurface还有销毁的功能
623622 view. mEGLWindowSurfaceFactory. destroySurface(mEgl, mEglDisplay, mEglSurface);
624623 }
625624 mEglSurface = null ;
0 commit comments