【发布时间】:2019-08-09 10:45:56
【问题描述】:
我使用具有以下功能的 VBO/IBO 在 GlSurfaceView 上绘制 2d 内容:
override fun onDrawFrame(gl: GL10?) {
val renderTime= measureTimeMillis {
GLES20.glClearColor(bgComps[0], bgComps[1], bgComps[2], 1f)
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT or GLES20.GL_COLOR_BUFFER_BIT)
bindAttributes()
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo)
//draw half of the polygons
val pieces = GameDataLoader.GameData.piecesByDiff(gameData.diff)
piecesProgram!!.setUniforms(projMatrix,imageTextureId,maskTextureId,PointF(4f,4f),0f)
GLES20.glDrawElements(
GLES20.GL_TRIANGLE_STRIP,
pieces * MeshBuilder.INDICES_PER_PIECE,
GLES20.GL_UNSIGNED_SHORT,
0
)
//draw another half
piecesProgram!!.setUniforms(projMatrix,imageTextureId,maskTextureId,PointF(10f,10f),sin(frame.toFloat() / 60 * 2 * PI).toFloat())
GLES20.glDrawElements(
GLES20.GL_TRIANGLE_STRIP,
pieces * MeshBuilder.INDICES_PER_PIECE,
GLES20.GL_UNSIGNED_SHORT,
pieces * MeshBuilder.INDICES_PER_PIECE * MeshBuilder.BYTES_PER_SHORT
)
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0)
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0)
}
val newFrameTS=System.currentTimeMillis()
if (lastFrameTS!=-1L)
println("frame time:${newFrameTS - lastFrameTS},render time:$renderTime")
lastFrameTS=newFrameTS
frame++
}
屏幕上大约有 5.6K 多边形。运行此代码时,我在控制台中看到帧时间:~33ms,渲染时间:0-2ms(!)。在大多数情况下,渲染时间=0。
如果我评论除 glClearColor 和 glClear 之外的所有内容,渲染时间会跳到 30 毫秒。为什么短代码的执行速度比长代码快?
UPD:这个问题与安卓操作系统有关。我在模拟器和真实设备上都观察到了这种行为。
问题不是为什么 onDrawFrame 调用发生得太频繁或太少(事实上,最后一次 onDraw 调用之间的时间是可以测量的。问题是我如何测量 onDrawFrame 函数中 opengl 调用的时间?这些调用怎么能花费 0 毫秒?
【问题讨论】:
标签: kotlin opengl-es performance-testing glsurfaceview