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

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

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

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

我在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);

如果有人能够解释可能造成这种情况的原因,以及如何纠正它,那么我将非常感激:-)

最佳答案 Nexus5基于Qualcomm芯片组,拥有Adreno 330 GPU.

如果您的应用程序图形密集型/没有fps限制器/渲染(巨大的)原始分辨率(因此不使用hardware scaler),高通芯片组可以快速控制GPU频率.

所以可能发生的事情是GPU频率受到限制,然后你会看到一个高CPU使用率,代表帧结束时的“CPU等待GPU”.

CPU也有可能受到限制,但根据我的经验,这种情况往往发生在三星手机上,因为DVFS,Nexus并不多…

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

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

额外注意事项:手机充电时节流会更快.

点赞