【问题标题】:frame rendering time measurement anomaly帧渲染时间测量异常
【发布时间】: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。
如果我评论除 glClearColorglClear 之外的所有内容,渲染时间会跳到 30 毫秒。为什么短代码的执行速度比长代码快?

UPD:这个问题与安卓操作系统有关。我在模拟器和真实设备上都观察到了这种行为。
问题不是为什么 onDrawFrame 调用发生得太频繁或太少(事实上,最后一次 onDraw 调用之间的时间是可以测量的。问题是我如何测量 onDrawFrame 函数中 opengl 调用的时间?这些调用怎么能花费 0 毫秒?

【问题讨论】:

    标签: kotlin opengl-es performance-testing glsurfaceview


    【解决方案1】:

    这通常是由V-sync 引起的。驱动程序在每一帧结束时等待,直到下一个图像可以显示在监视器上并延迟程序的执行。

    根据您的硬件,您可以强制启用/禁用此功能。大多数 PC 硬件允许应用程序选择是否要等待。在其他设备上,尤其是在移动设备上,您不能。

    【讨论】:

    • 我不确定您使用的是哪个系统,因为该问题标有opengl,表示桌面OpenGL,但也标有glsurfaceview,表示您将使用android 和OpenGL-es。
    • 我的目标是安卓设备。用一些改进更新了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2015-07-29
    • 1970-01-01
    • 2014-09-25
    • 2015-07-18
    相关资源
    最近更新 更多