尽管改变渲染模式,GLSurfaceView仍会不断渲染

Jas*_*ank 9 android opengl-es glsurfaceview

我正在尝试创建一个显示游戏区域地图的GLSurfaceView.当玩家移动时,游戏活动会调用highlightSpot,而后者又会触发渲染请求.我想重新绘制视图的唯一时间是玩家移动时.

然而,在我当前的实现中,尽管调用setRenderMode(RENDERMODE_WHEN_DIRTY)了我的GLSurfaceView,但它的渲染模式似乎仍然是连续的.为了检查,我在我的onDrawFrame方法中抛出了一个println语句,当我运行我的应用程序时,输出很快就会填满我的logcat,而玩家甚至不会移动一次 - 它显然不符合我的预期.还有什么我需要做的才能在被问到时才进行视图渲染吗?

(此代码的大部分内容来自http://insanitydesign.com/wp/projects/nehe-android-ports/上的教程.为了简洁起见,我省略了我的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jas*_*ank 7

好的,我想我已经解决了这个问题.设置渲染模式的位置似乎是包含GLSurfaceView对象的类,而不是GLSurfaceView构造函数中的类.另外(我认为我在GLSurfaceView的Android文档中忽略了这一点)在设置渲染器之前,无法设置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();
}
}
Run Code Online (Sandbox Code Playgroud)