久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

AndEngine之DEMO學習(零)AndEngine結構

 幻魂1990 2013-07-29

andEngine結構:
雙線程:業(yè)務線程、渲染線程,,使用ReentrantLock實現(xiàn)兩個線程的交替執(zhí)行,。
渲染線程:使用GLSurfaceView提供的渲染功能,內置渲染繪圖線程,。
第一步:RenderSurfaceView為繼承于GLSurfaceView的GL渲染視圖,,BaseGameActivity作為繼承于Activity的活動,通過setContentView(RenderSurfaceView)將視圖加入活動中,。
BaseGameActivity中主要方法:

  1. @Override  
  2.  protected void onCreate(final Bundle pSavedInstanceState) {  
  3.   if(BuildConfig.DEBUG) {  
  4.    Debug.d(this.getClass().getSimpleName()   ".onCreate"   " @(Thread: '"   Thread.currentThread().getName()   "')");  
  5.   }  
  6.   
  7.   super.onCreate(pSavedInstanceState);  
  8.   //先處于暫停狀態(tài)  
  9.   this.mGamePaused = true;  
  10.   //通過EngineOption定義,,創(chuàng)建Engine  
  11.   this.mEngine = this.onCreateEngine(this.onCreateEngineOptions());  
  12.   //應用EngineOption定義到Activity  
  13.   this.applyEngineOptions();  
  14.   //添加RenderSurfaceView到Activity  
  15.   this.onSetContentView();  
  16.  }  
  17.    
  18.  protected void onSetContentView() {  
  19.   this.mRenderSurfaceView = new RenderSurfaceView(this);  
  20.   this.mRenderSurfaceView.setRenderer(this.mEngine, this);  
  21.   
  22.   this.setContentView(this.mRenderSurfaceView, BaseGameActivity.createSurfaceViewLayoutParams());  
  23.  }   


第二步:將渲染器EngineRenderer的加入RenderSurfaceView中,BaseGameActivity實現(xiàn)IRendererListener接口監(jiān)聽EngineRenderer,。
EngineRenderer中的主要方法:

  1. @Override  
  2.  public void onSurfaceCreated(final GL10 pGL, final EGLConfig pEGLConfig) {  
  3.   synchronized(GLState.class) {  
  4.    final RenderOptions renderOptions = this.mEngine.getEngineOptions().getRenderOptions();  
  5.    this.mGLState.reset(renderOptions, this.mConfigChooser, pEGLConfig);  
  6.   
  7.    // TODO Check if available and make available through EngineOptions-RenderOptions  
  8. //   GLES20.glEnable(GLES20.GL_POLYGON_SMOOTH);  
  9. //   GLES20.glHint(GLES20.GL_POLYGON_SMOOTH_HINT, GLES20.GL_NICEST);  
  10. //   GLES20.glEnable(GLES20.GL_LINE_SMOOTH);  
  11. //   GLES20.glHint(GLES20.GL_LINE_SMOOTH_HINT, GLES20.GL_NICEST);  
  12. //   GLES20.glEnable(GLES20.GL_POINT_SMOOTH);  
  13. //   GLES20.glHint(GLES20.GL_POINT_SMOOTH_HINT, GLES20.GL_NICEST);  
  14.      
  15.    //2D不需要深度  
  16.    this.mGLState.disableDepthTest();  
  17.    this.mGLState.enableBlend();  
  18.    this.mGLState.setDitherEnabled(renderOptions.isDithering());  
  19.   
  20.    /* Enabling culling doesn't really make sense, because triangles are never drawn 'backwards' on purpose. */  
  21. //   this.mGLState.enableCulling();  
  22. //   GLES20.glFrontFace(GLES20.GL_CCW);  
  23. //   GLES20.glCullFace(GLES20.GL_BACK);  
  24.      
  25.    //回調BaseGameActivity中onSurfaceCreated  
  26.    if(this.mRendererListener != null) {  
  27.     this.mRendererListener.onSurfaceCreated(this.mGLState);  
  28.    }  
  29.   }  
  30.  }  
  31.   
  32.  @Override  
  33.  public void onSurfaceChanged(final GL10 pGL, final int pWidth, final int pHeight) {  
  34.   //確定因為和GL的顯示區(qū)域大小  
  35.   this.mEngine.setSurfaceSize(pWidth, pHeight);  
  36.   GLES20.glViewport(0, 0, pWidth, pHeight);  
  37.   this.mGLState.loadProjectionGLMatrixIdentity();  
  38.   
  39.   //回調BaseGameActivity中onSurfaceChanged  
  40.   if(this.mRendererListener != null) {  
  41.    this.mRendererListener.onSurfaceChanged(this.mGLState, pWidth, pHeight);  
  42.   }  
  43.  }  
  44.   
  45.  @Override  
  46.  public void onDrawFrame(final GL10 pGL) {  
  47.   synchronized(GLState.class) {  
  48.    if (this.mMultiSampling && this.mConfigChooser.isCoverageMultiSampling()) {  
  49.     final int GL_COVERAGE_BUFFER_BIT_NV = 0x8000;  
  50.     GLES20.glClear(GL_COVERAGE_BUFFER_BIT_NV);  
  51.    }  
  52.   
  53.    try {  
  54.     //調用引擎中的方法  
  55.     this.mEngine.onDrawFrame(this.mGLState);  
  56.    } catch (final InterruptedException e) {  
  57.     Debug.e("GLThread interrupted!", e);  
  58.    }  
  59.   }  
  60.  }  
  61.    


Engine中的主要方法:

  1. public void onDrawFrame(final GLState pGLState) throws InterruptedException {  
  2.   final EngineLock engineLock = this.mEngineLock;  
  3.   
  4.   //繪制過程中為引擎加鎖,,等待繪制完成  
  5.   engineLock.lock();  
  6.   try {  
  7.    engineLock.waitUntilCanDraw();  
  8.   
  9.    //更新頂點緩存,去除Unloaded的緩存  
  10.    this.mVertexBufferObjectManager.updateVertexBufferObjects(pGLState);  
  11.    //更新紋理,,加載紋理到硬件  
  12.    this.mTextureManager.updateTextures(pGLState);  
  13.    //更新字體,,繪制所有文字  
  14.    this.mFontManager.updateFonts(pGLState);  
  15.   
  16.    //調用mDrawHandlers中注冊的所有需要繪制的IDrawHandler的onDraw方法  
  17.    this.onUpdateDrawHandlers(pGLState, this.mCamera);  
  18.    //逐層調用Scene中IEntity的onDraw方法  
  19.    this.onDrawScene(pGLState, this.mCamera);  
  20.   
  21.    engineLock.notifyCanUpdate();  
  22.   } finally {  
  23.    engineLock.unlock();  
  24.   }  
  25.  }  
  26.    


業(yè)務線程:Engine的初始化函數(shù)中啟動業(yè)務執(zhí)行線程UpdateThread,為注冊到引擎中,、或注冊到引擎包含的實體中的IUpdateHandler接口執(zhí)行onUpdate()方法,,完成業(yè)務的更新操作。

UpdateThread中主要方法:

  1. @Override  
  2. public void run() {  
  3.  android.os.Process.setThreadPriority(this.mEngine.getEngineOptions().getUpdateThreadPriority());  
  4.  try {  
  5.   while(true) {  
  6.    this.mRunnableHandler.onUpdate(0);  
  7.    this.mEngine.onTickUpdate();  
  8.   }  
  9.  } catch (final InterruptedException e) {  
  10.   if(BuildConfig.DEBUG) {  
  11.    Debug.d(this.getClass().getSimpleName()   " interrupted. Don't worry - this "   e.getClass().getSimpleName()   " is most likely expected!", e);  
  12.   }  
  13.   this.interrupt();  
  14.  }  
  15. }  


Engine中的主要方法:

  1. void onTickUpdate() throws InterruptedException {  
  2.   //如果引擎正在運行,,更新所有IUpdateHandler,,否則Thread.sleep(16);什么也不做  
  3.   if(this.mRunning) {  
  4.    //從上傳更新已經(jīng)度過的時間(毫秒)  
  5.    final long secondsElapsed = this.getNanosecondsElapsed();  
  6.   
  7.    this.mEngineLock.lock();  
  8.    try {  
  9.     //如果引擎已經(jīng)被摧毀,,拋出EngineDestroyedException異常  
  10.     this.throwOnDestroyed();  
  11.   
  12.     //更新業(yè)務  
  13.     this.onUpdate(secondsElapsed);  
  14.   
  15.     //如果引擎已經(jīng)被摧毀,拋出EngineDestroyedException異常  
  16.     this.throwOnDestroyed();  
  17.   
  18.     this.mEngineLock.notifyCanDraw();  
  19.     this.mEngineLock.waitUntilCanUpdate();  
  20.    } finally {  
  21.     this.mEngineLock.unlock();  
  22.    }  
  23.   } else {  
  24.    this.mEngineLock.lock();  
  25.    try {  
  26.     this.throwOnDestroyed();  
  27.   
  28.     this.mEngineLock.notifyCanDraw();  
  29.     this.mEngineLock.waitUntilCanUpdate();  
  30.    } finally {  
  31.     this.mEngineLock.unlock();  
  32.    }  
  33.   
  34.    Thread.sleep(16);  
  35.   }  
  36.  }  
  37.    
  38.  public void onUpdate(final long pNanosecondsElapsed) throws InterruptedException {  
  39.   final float pSecondsElapsed = pNanosecondsElapsed * TimeConstants.SECONDS_PER_NANOSECOND;  
  40.   
  41.   this.mSecondsElapsedTotal  = pSecondsElapsed;  
  42.   this.mLastTick  = pNanosecondsElapsed;  
  43.   
  44.   //更新觸摸事件控制  
  45.   this.mTouchController.onUpdate(pSecondsElapsed);  
  46.   //更新注冊的IUpdateHandler  
  47.   this.onUpdateUpdateHandlers(pSecondsElapsed);  
  48.   //更新屏幕  
  49.   this.onUpdateScene(pSecondsElapsed);  
  50.  }  

 

Entity中的主要方法:

  1.  @Override  
  2. public final void onUpdate(final float pSecondsElapsed) {  
  3.  if(!this.mIgnoreUpdate) {  
  4.   this.onManagedUpdate(pSecondsElapsed);  
  5.  }  
  6. }  
  7.   
  8. /** 
  9.  * 對實體的onUpdate方法的實際處理函數(shù) 
  10.  *  
  11.  * @param pSecondsElapsed  間隔秒數(shù) 
  12.  */  
  13. protected void onManagedUpdate(final float pSecondsElapsed) {  
  14.  //本身注冊的實體修改器的onUpdate  
  15.  if(this.mEntityModifiers != null) {  
  16.   this.mEntityModifiers.onUpdate(pSecondsElapsed);  
  17.  }  
  18.  //本身注冊IUpdateHandler對象的onUpdate  
  19.  if(this.mUpdateHandlers != null) {  
  20.   this.mUpdateHandlers.onUpdate(pSecondsElapsed);  
  21.  }  
  22.   
  23.  //調用子實體的onUpdate方法  
  24.  if((this.mChildren != null) && !this.mChildrenIgnoreUpdate) {  
  25.   final SmartList<IEntity> entities = this.mChildren;  
  26.   final int entityCount = entities.size();  
  27.   for(int i = 0; i < entityCount; i ) {  
  28.    entities.get(i).onUpdate(pSecondsElapsed);  
  29.   }  
  30.  }  
  31. }  


andEngine繼承關系:

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多