現在是時候深入研究Android平台的圖形功能了。 Android支援OpenGL ES API。 不用說,将圖形處理任務轉移到專用GPU上比在CPU中進行處理更為優化。 大多數android裝置都具有這樣的專用GPU。
OpenGL是用于編寫在GPU上渲染的2D和3D圖形的API。 這将釋放CPU上寶貴的計算資源,以用于更複雜的實體或更多實體或與圖形無關的任何事物。
有一些概念需要了解,但是當我們在學習過程中碰到它們時,我将對其進行介紹。
如果您關注與在android裝置上顯示圖形有關的文章,您已經知道為了顯示圖形元素,我們需要一個曲面和一個渲染器。 我們使用了基本的SurfaceView ,從中獲得了Canvas,并通過在遊戲循環中調用受支援的draw方法将所有内容繪制到畫布上。
使用OpenGL沒有太大差別。 Android随附SurfaceView接口的專用實作,用于顯示OpenGL渲染的圖像。
讓我們以通常的方式建立android項目。
建立項目向導 |
我稱該活動為Run 。 檢查向導生成了什麼,它應該如下所示:
public class Run extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
沒什麼特别的。
建立OpenGL渲染器
讓我們建構渲染器。 建立一個實作android.opengl.GLSurfaceView.Renderer接口的GlRenderer類。
它看起來像這樣:
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView.Renderer;
public class GlRenderer implements Renderer {
@Override
public void onDrawFrame(GL10 gl) {
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
}
}
我們需要實作以上三種方法。 目前他們是空的,什麼也不做。
方法
onSurfaceCreated(GL10 gl,EGLConfig config)建立或重新建立 。 重要的是要牢記重新建立的位,因為這意味着每次裝置進入睡眠狀态(例如喚醒)時,都會重新建立表面。 因為儲存資源的上下文也被破壞了,是以這是我們加載資源(紋理的圖像等)的地方。
隻要表面尺寸發生變化,就會調用onSurfaceChanged(GL10 gl,int width,int height) 。 這主要影響我們的視口。 視口隻是一個矩形區域,通過它我們可以看到遊戲世界。
渲染線程調用onDrawFrame(GL10 gl)繪制每個幀。 這是所有繪制的地方。 我們不需要顯式調用它。 渲染線程是由android為我們建立的,它将調用它。
讓我們切換到OpenGL渲染器。 簽出新的“運作”活動。
package net.obviam.opengl;
import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
public class Run extends Activity {
/** The OpenGL view */
private GLSurfaceView glSurfaceView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requesting to turn the title OFF
requestWindowFeature(Window.FEATURE_NO_TITLE);
// making it full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
// Initiate the Open GL view and
// create an instance with this activity
glSurfaceView = new GLSurfaceView(this);
// set our renderer to be the main renderer with
// the current activity context
glSurfaceView.setRenderer(new GlRenderer());
setContentView(glSurfaceView);
}
/** Remember to resume the glSurface */
@Override
protected void onResume() {
super.onResume();
glSurfaceView.onResume();
}
/** Also pause the glSurface */
@Override
protected void onPause() {
super.onPause();
glSurfaceView.onPause();
}
}
在第12行中,我們聲明了GLSurfaceView成員變量。 這是android提供的OpenGL視圖。 當執行個體化它時(第27行),我們必須使其具有上下文意識。 也就是說,視圖可以通路應用程式環境。
我們需要做的就是将渲染器添加到該視圖中。 我們在第31行執行此操作。
第32行告訴活動使用我們的OpenGL視圖。
onResume()和onPause()方法被覆寫,并在我們的視圖中觸發相應的方法。
您可以将應用程式作為Android應用程式運作,并且應該會看到黑屏。
這就對了。 我們已經從畫布切換到OpenGL渲染器。
在此處下載下傳源代碼和Eclipse項目(obviam.opengl.p01.tgz)
參考: 帶有Android教程的OpenGL ES- JCG合作夥伴Tamas Jano從“ Canvas The Grain ”部落格中将其從Canvas切換為OpenGL 。
不要忘記檢視我們的新Android遊戲 ArkDroid (以下螢幕截圖) 。 您的回報将大有幫助!
相關文章:
- Android遊戲開發教程簡介
- Android遊戲開發–遊戲創意
- Android遊戲開發–建立項目
- Android遊戲開發–基本遊戲架構
- Android遊戲開發–基本遊戲循環
- Android遊戲開發–使用Android顯示圖像
- Android遊戲開發–在螢幕上移動圖像
- Android遊戲開發–遊戲循環
- Android遊戲開發–測量FPS
- Android遊戲開發–雪碧動畫
- Android遊戲開發–粒子爆炸
- Android遊戲開發–設計遊戲實體–政策模式
- Android遊戲開發–使用位圖字型
- Android遊戲開發–使用OpenGL ES顯示圖形元素(原語)
- Android遊戲開發– OpenGL紋理映射
- Android遊戲開發–設計遊戲實體–狀态模式
- Android遊戲文章系列
翻譯自: https://www.javacodegeeks.com/2011/09/android-game-development-switching-from.html