android.opengl.GLSurfaceView概述

來源:互聯網
上載者:User

原文地址::http://120.132.134.205/cmdn/supesite/?uid-5358-action-viewspace-itemid-6527

 

 

 

 GLSurfaceView是一個視圖,繼承至SurfaceView,它內嵌的surface專門負責OpenGL渲染。

        GLSurfaceView提供了下列特性:                1> 管理一個surface,這個surface就是一塊特殊的記憶體,能直接排版到android的視圖view上。                2> 管理一個EGL display,它能讓opengl把內容渲染到上述的surface上。                3> 使用者自訂渲染器(render)。                4> 讓渲染器在獨立的線程裡運作,和UI線程分離。                5> 支援按需渲染(on-demand)和連續渲染(continuous)。                6> 一些可選工具,如調試。         使用GLSurfaceView        通常會繼承GLSurfaceView,並重載一些和使用者輸入事件有關的方法。如果你不需要重載事件方法,GLSurfaceView也可以直接使用,你可以使用set方法來為該類提供自訂的行為。例如,GLSurfaceView的渲染被委託給渲染器在獨立的渲染線程裡進行,這一點和普通視圖不一樣,setRenderer(Renderer)設定渲染器。         初始化GLSurfaceView        初始化過程其實僅需要你使用setRenderer(Renderer)設定一個渲染器(render)。當然,你也可以修改GLSurfaceView一些預設配置。            * setDebugFlags(int)            * setEGLConfigChooser(boolean)            * setEGLConfigChooser(EGLConfigChooser)            * setEGLConfigChooser(int, int, int, int, int, int)            * setGLWrapper(GLWrapper)  定製android.view.Surface        GLSurfaceView預設會建立像素格式為PixelFormat.RGB_565的surface。如果需要透明效果,調用getHolder().setFormat(PixelFormat.TRANSLUCENT)。透明(TRANSLUCENT)的surface的像素格式都是32位,每個色彩單元都是8位元深度,像素格式是裝置相關的,這意味著它可能是ARGB、RGBA或其它。         選擇EGL配置        Android裝置往往支援多種EGL配置,可以使用不同數目的通道(channel),也可以指定每個通道具有不同數目的位(bits)深度。因此,在渲染器工作之前就應該指定EGL的配置。GLSurfaceView預設EGL配置的像素格式為RGB_656,16位的深度緩衝(depth buffer),預設不開啟遮罩緩衝(stencil buffer)。        如果你要選擇不同的EGL配置,請使用setEGLConfigChooser方法中的一種。         調試行為        你可以調用調試方法setDebugFlags(int)或setGLWrapper(GLSurfaceView.GLWrapper)來自訂GLSurfaceView一些行為。在setRenderer方法之前或之後都可以調用調試方法,不過最好是在之前調用,這樣它們能立即生效。         設定渲染器        總之,你必須調用setRenderer(GLSurfaceView.Renderer)來註冊一個GLSurfaceView.Renderer渲染器。渲染器負責真正的GL渲染工作。         渲染模式        渲染器設定之後,你可以使用setRenderMode(int)指定渲染模式是按需(on demand)還是連續(continuous)。預設是連續渲染。         Activity生命週期        Activity視窗暫停(pause)或恢複(resume)時,GLSurfaceView都會收到通知,此時它的onPause方法和onResume方法應該被調用。這樣做是為了讓GLSurfaceView暫停或恢複它的渲染線程,以便它及時釋放或重建OpenGL的資源。         事件處理        為了處理事件,一般都是繼承GLSurfaceView類並重載它的事件方法。但是由於GLSurfaceView是多線程操作,所以需要一些特殊的處理。由於渲染器在獨立的渲染線程裡,你應該使用Java的跨線程機制跟渲染器通訊。queueEvent(Runnable)方法就是一種相對簡單的操作,例如下面的例子。         class MyGLSurfaceView extends GLSurfaceView {             private MyRenderer mMyRenderer;             public void start() {                 mMyRenderer = ...;                 setRenderer(mMyRenderer);             }             public boolean onKeyDown(int keyCode, KeyEvent event) {                 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {                     queueEvent(new Runnable() {                         // 這個方法會在渲染線程裡被調用                         public void run() {                             mMyRenderer.handleDpadCenter();                         }});                     return true;                 }                 return super.onKeyDown(keyCode, event);             }         }         (註:如果在UI線程裡調用渲染器的方法,很容易收到“call to OpenGL ES API with no current context”的警告,典型的誤區就是在鍵盤或滑鼠事件方法裡直接調用opengl es的API,因為UI事件和渲染繪製在不同的線程裡。更甚者,這種情況下調用glDeleteBuffers這種釋放資源的方法,可能引起程式的崩潰,因為UI線程想釋放它,渲染線程卻要使用它。)

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.