10 秒后,Android 上 OpenGL ES 的 CPU 使用率大幅增加

Ben*_*ard 5 performance android opengl-es

我有一个在 Android 上运行的非常简单的 OpenGL ES 应用程序 - 它只是加载一个纹理图集,然后在预定位置绘制大量图块

它基于本教程:http : //androidblog.reindustries.com/a-real-open-gl-es-2-0-2d-tutorial-part-1/

渲染大约 10 秒后,CPU 大幅增加(如图所示),渲染每帧所需的时间从大约 1 毫秒增加到大约 14 毫秒(在我的 Nexus 5 上运行)

CPU 使用率图表

我对onDrawFrame方法中的所有内容进行了计时,这完全是GLES20.glDrawElements

我的整个渲染方法是这样的:

GLES20.glUseProgram(ShaderTools.sp_Image);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

int mPositionHandle = GLES20.glGetAttribLocation(ShaderTools.sp_Image, "vPosition");
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer);
GLES20.glEnableVertexAttribArray(mPositionHandle);

int mTexCoordLoc = GLES20.glGetAttribLocation(ShaderTools.sp_Image, "a_texCoord");
GLES20.glVertexAttribPointer(mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 0, uvBuffer);
GLES20.glEnableVertexAttribArray(mTexCoordLoc);

int mtrxhandle = GLES20.glGetUniformLocation(ShaderTools.sp_Image, "uMVPMatrix");
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, mtrxProjectionAndView, 0);

int mSamplerLoc = GLES20.glGetUniformLocation(ShaderTools.sp_Image, "s_texture");

GLES20.glUniform1i(mSamplerLoc, 0);

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mTexCoordLoc);
Run Code Online (Sandbox Code Playgroud)

如果有人能阐明可能导致这种情况的原因以及如何纠正它,那么我将不胜感激:-)

VB_*_*low 2

Nexus5 基于高通芯片组,并配有 Adreno 330 GPU。

众所周知,如果您的应用程序是图形密集型/没有 fps 限制器/以(大)本机分辨率渲染(因此不使用硬件缩放器),那么高通芯片组会快速限制 GPU 频率。

因此,可能发生的情况是 GPU 频率受到限制,然后您会看到 CPU 使用率较高,这表示帧结束时“CPU 正在等待 GPU”。

CPU 也有可能受到限制,但根据我的经验,由于DVFS ,这种情况往往会发生在三星手机上,而在 Nexus 上则不多......

好消息是,实际上存在一个工具可以监视 Qualcomm 设备上当前的 CPU 和 GPU 频率,它称为Trepn Profiler,您可以在非 root 设备上使用它。

因此,您应该安装此工具,将其配置为以叠加方式显示 GPU 频率和 CPU0 频率,然后启动您的应用程序,您将能够实时查看 GPU 和/或 CPU 如何随时间受到限制。

额外注意:手机充电时节流会更快。