2010-12-02 65 views
7

我試圖創建一個GLSurfaceView,顯示一個遊戲區域的地圖。當玩家移動時,遊戲活動調用highlightSpot,這反過來會觸發渲染請求。我想重新繪製視圖的唯一時間是玩家移動的時間。GLSurfaceView不斷渲染,儘管更改渲染模式

但是,在我目前的實現中,儘管在我的GLSurfaceView上調用了setRenderMode(RENDERMODE_WHEN_DIRTY),但它的渲染模式似乎仍然是連續的。爲了檢查,我在我的onDrawFrame方法中拋出了一個println語句,並且當我運行我的應用程序時,輸出很快填滿了我的logcat而沒有播放器移動一次 - 這顯然不符合我的意圖。我還需要做些什麼才能讓視圖僅在被問到時才呈現?爲了簡明起見,我忽略了我的onDrawFrame,OnSurfaceChanged和onSurfaceCreated方法,因爲我沒有改變渲染模式或者在這些方法中的任何地方請求渲染,所以我忽略了我的onDrawFrame,OnSurfaceChanged和onSurfaceCreated方法。 。如果有人認爲它可能是相關的,我也可以發佈這些。)

public class SurfaceViewClass extends GLSurfaceView implements Renderer { 
    public SurfaceViewClass(Context context) { 
     super(context); 

     ... 

     this.setRenderer(this); 
     this.setRenderMode(RENDERMODE_WHEN_DIRTY); 
    } 

    public void highlightSpot(int x, int y) { 
     /* change some variables here */ 
     ... 

     this.requestRender(); 
    } 
} 

回答

6

好的,我想我已經整理出來了。設置渲染模式的地方似乎是包含您的GLSurfaceView對象的類,而不是在GLSurfaceView構造函數中。此外(我認爲我在the Android documentation for GLSurfaceView中忽略了一些內容)在設置渲染器之前,無法設置GLSurfaceView的渲染模式。這也許就是爲什麼試圖在構造函數中設置渲染模式不起作用的原因。

這似乎迫使它呈現只有當我把它想,這正是我想要的東西:

public class Game extends Activity { 
private GLSurfaceView glSurface; 
private SurfaceViewClass svc; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    glSurface = (GLSurfaceView) findViewById(R.id.SurfaceView01); 

    svc = new SurfaceViewClass(this); 
    glSurface.setRenderer(svc); 
    glSurface.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 
} 

public void movePlayer() { 
    svc.highlightSpot(location[PLAYER], 0); 
    glSurface.requestRender(); 
} 
} 
+0

注:固定在此之後,我也去掉了requestRender聲明我highlightSpot功能,因爲我現在請調用movePlayer()中的requestRender。我相信它可以在突出顯示中工作得很好,但我只需要調用一次即可。 – 2010-12-02 04:28:00