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

本·埃扎德

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

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

渲染大约10秒钟后,CPU急剧增加(如图所示),渲染每帧所需的时间从大约1ms增加到大约14ms(在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);

如果有人能弄清可能是什么原因以及如何纠正它,那么我将不胜感激:-)

VB_溢出

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

如果您的应用程序需要大量图形处理/没有fps限制器/以(巨大)原始分辨率进行渲染(因此不使用硬件缩放器),则已知高通芯片组可以快速调节GPU频率

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

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

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

因此,您应该安装此工具,对其进行配置以将GPU频率和CPU0频率显示为叠加,然后启动您的应用,您将能够实时查看GPU和/或CPU如何随着时间而节流。

补充说明:节流将在手机充电时更快地发生。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章