GLSurfaceView постоянно рендерится, несмотря на изменение режима рендеринга - PullRequest
9 голосов
/ 02 декабря 2010

Я пытаюсь создать GLSurfaceView, который отображает карту игровой зоны. Когда игрок движется, игровая активность вызывает highlightSpot, что, в свою очередь, должно вызвать запрос рендеринга. Единственный раз, когда я хочу перерисовать вид, это когда игрок двигается.

Однако, с моей текущей реализацией, несмотря на вызов setRenderMode(RENDERMODE_WHEN_DIRTY) для моего GLSurfaceView, его режим рендеринга все еще кажется непрерывным. Чтобы проверить, я бросил один оператор println в свой метод onDrawFrame, и когда я запускаю свое приложение, вывод быстро заполняет мой 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();
    }
}

1 Ответ

7 голосов
/ 02 декабря 2010

ОК, я думаю, что с этим разобрались. Кажется, местом установки режима рендеринга является класс, содержащий ваш объект GLSurfaceView, а не конструктор GLSurfaceView. Также (что, я думаю, я пропустил в документации Android по 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();
}
}
...