2010-12-02 62 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