天天看點

Android遊戲開發–從Canvas切換到OpenGL ES

現在是時候深入研究Android平台的圖形功能了。 Android支援OpenGL ES API。 不用說,将圖形處理任務轉移到專用GPU上比在CPU中進行處理更為優化。 大多數android裝置都具有這樣的專用GPU。

OpenGL是用于編寫在GPU上渲染的2D和3D圖形的API。 這将釋放CPU上寶貴的計算資源,以用于更複雜的實體或更多實體或與圖形無關的任何事物。

有一些概念需要了解,但是當我們在學習過程中碰到它們時,我将對其進行介紹。

如果您關注與在android裝置上顯示圖形有關的文章,您已經知道為了顯示圖形元素,我們需要一個曲面和一個渲染器。 我們使用了基本的SurfaceView ,從中獲得了Canvas,并通過在遊戲循環中調用受支援的draw方法将所有内容繪制到畫布上。

使用OpenGL沒有太大差別。 Android随附SurfaceView接口的專用實作,用于顯示OpenGL渲染的圖像。

讓我們以通常的方式建立android項目。

Android遊戲開發–從Canvas切換到OpenGL ES
建立項目向導

我稱該活動為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遊戲開發–從Canvas切換到OpenGL ES
Android遊戲開發–從Canvas切換到OpenGL ES
Android遊戲開發–從Canvas切換到OpenGL ES

相關文章:

  • 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