2013-05-01 170 views
0

我在使用OpenGL ES 2.0中的遊戲循環的外部線程運行我的應用程序時出現問題。onDrawFrame,requestRender和渲染線程? | OpenGL ES 2.0

這裏是我在我的出發類的onCreate:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    mGLView = new MyGLView(this); 

    System.out.println(running); 

    setContentView(mGLView); 

    loop = new GameLoop(); 

    //loop.run(); <- this is supposed to run the loop but when its called, 
    // nothing really appears on screen. just title of the app. 


} 

我GameLoop類

private final static int maxFPS = 30; 
private final static int maxFrameSkips = 5; 
private final static int framePeriod = 1000/maxFPS; 

public static boolean running; 
public final static String TAG = "test"; 

public GameLoop() { 

} 

@Override 
public void run() { 
    running = StartPoint.isRunning(); 
    long beginTime; 
    long timeDiff; 
    int sleepTime; 
    int framesSkipped; 
    sleepTime = 0; 
    while (running) { 

     running = StartPoint.isRunning(); 

     beginTime = System.currentTimeMillis(); 
     framesSkipped = 0; 

     StartPoint.mGLView.requestRender(); // <- supposed to re-render? 

     timeDiff = System.currentTimeMillis() - beginTime; 
     sleepTime = (int) (framePeriod - timeDiff); 

     if (sleepTime > 0) { 
      try { 
       Thread.sleep(sleepTime); 

      } catch (InterruptedException e) { 
      } 
     } 

     while (sleepTime < 0 && framesSkipped < maxFrameSkips) { 

      sleepTime += framePeriod; 
      framesSkipped++; 
      Log.d(TAG, "Frames Skipped"); 
     } 
    } 

} 

,最後我的渲染器類:

private static final String TAG = "Renderer"; 

BoundsSquare square; 

private final float[] mMVPMatrix = new float[16]; 
private final float[] mProjMatrix = new float[16]; 
private final float[] mVMatrix = new float[16]; 
private final float[] mRotationMatrix = new float[16]; 

private int camWidth,camHeight; 

Camera2D cam; 

Vector3 vec; 
public long cycle = 0; // used this to determine how many cycles 
//went through, it is stuck on cycle 0, nothing else happens after first render 

@Override 
public void onDrawFrame(GL10 nope) { 
    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT); 

    //set camera position 
      cam.setFrustum(mProjMatrix, mVMatrix, mMVPMatrix); 

    square.draw(mMVPMatrix); 
    //square.animate(tick); 


    //square.setBounds(vec); 
    System.out.println("Cycle " + cycle + " Ended"); 
    cycle++; 

} 

@Override 
public void onSurfaceChanged(GL10 nope, int width, int height) { 


    cam.setRatio(width, height); 

    GLES20.glViewport(0, 0, width, height); 

} 

public static int loadShader(int type, String shaderCode) { 

    // create a vertex shader type (GLES20.GL_VERTEX_SHADER) 
    // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER) 
    int shader = GLES20.glCreateShader(type); 

    // add the source code to the shader and compile it 
    GLES20.glShaderSource(shader, shaderCode); 
    GLES20.glCompileShader(shader); 

    return shader; 
} 

@Override 
public void onSurfaceCreated(GL10 gl, 
     javax.microedition.khronos.egl.EGLConfig config) { 
    GLES20.glClearColor(0.0f, 0.0f, 1.0f, 0.5f); 
    camWidth=480;camHeight=320; 
    cam= new Camera2D(0, 0, camHeight, camWidth); 
    // initialize a square 
    vec = new Vector3 (10,10,40,90); 
    square = new BoundsSquare(vec); 
    System.out.println("Surface Created"); 

} 

所以基本上什麼情況是,如果我不打電話loop.run();我得到一個靜態圖片,這基本上是onDraw的一個循環Frame完成之後,LogCat中沒有其他任何東西彈出。

接下來發生的事情是,如果我打電話loop.run(),基本上循環會經過永久和一切,但沒有任何東西出現在屏幕上。我只看到一個標題屏幕,而不是glView。

我在做什麼錯了?有另一種更新屏幕的方法嗎?

回答

2

線程必須以start()not run()開始。

+0

哇,我無法相信這是簡單的!謝謝!如果開始實際啓動線程,運行會做什麼? – Baruch 2013-05-01 22:00:42