렌더러를 프로파일 링하려고하는데 설명 할 수없는 이상한 프로파일 링 동작이 나타납니다.왜 glClear가 OpenGLES에서 차단 되었습니까?
계속 렌더링하도록 설정된 glSurfaceView를 사용하고 있습니다.
이 내 onDrawFrame()
이
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
executeAllDrawCommands();
}
이 경부 하에서 천천히 행동했다 구조화, 그래서 타이머 클래스를 생성하고,이 몇 가지 프로파일 시작 방법입니다. 나는 내가 본 것에 놀랐다.
public void onDrawFrame(GL10 unused) {
swapTimer.end();
clearTimer.start();
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
clearTimer.end();
drawTimer.start();
executeAllDrawCommands();
drawTimer.end();
swapTimer.start();
}
clearTimer
조치 그것이 내 모든 그리기 호출을 실행하는 데 걸리는 시간 glClear, drawTimer
조치를 호출하는 데 걸리는 시간, swapTimer
측정 시간 :
, 나는 내가 설명 할 수없는 정말 이상한 숫자를 가지고 : 나는 내가 믿는대로 장치가 VSYNC를 강제가 다소 약간 큰 것으로 스왑 시간을 예상
swapTimer : 20ms (average)
clearTimer : 11ms (average)
drawTimer : 2ms (average)
~ 30fps에서 사용 가능하게 설정했는데 실제로 '명확한'통화가 11 밀리 초 동안 차단되는 이유를 모르겠습니다. 비동기 명령을 내 보내서 반환한다고 가정 했습니까?
내가 훨씬 더 바쁜 장면을 그릴 때, 숫자가 꽤 변경 : 내 드로우 호출 그것은 수직 동기화 시간을 많이 숨어처럼 보인다 너무 많은 시간을내어이 장면에서
swapTimer : 2ms (average)
clearTimer : 0ms (average)
drawTimer : 44ms (average)
을 , 맑은 전화의 블록은 완전히 사라집니다.
가볍게로드 된 장면에서 glClear가 차단되는 이유에 대한 설명이 있습니까? 경우 누군가 내 '타이머'클래스 소스 코드에
링크 내 측정 기술의 의심 : http://pastebin.com/bhXt368W
clearTimer.start() 메소드를 사용하기 전에 GLES20.glFinish()를 호출하여 시간이 어떻게 변하는 지 확인할 수 있습니까? –
glFinish (와 그 주위에 finishTimer.start()/end()를 넣었습니다. 그리고 glClear에서 항상 벗어납니다. 대신 glFinish는 몇 밀리 초가 걸리며 glClear는 즉시가됩니다. vsync 시간이 glClear 내부에 나타나는 것을보고 놀랐지 만 vsync와 관련된 것 같습니다. – Tim