我正在为Android开发一个OpenGL 2.0动态壁纸,并且渲染是滞后的(~11fps)。我绝不是专家,但我找不到任何在线资源来回答我的问题。基准测试,我发现'onDrawFrame(GL10 glUnused)'由于我使用了多少个对象而失速。如果我将它限制为渲染~100个对象,我得到一个OK帧率,但我的壁纸包含~1000个三角形的栅格。这是问题吗?这是代码:
public void onDrawFrame(GL10 glUnused) {
if (para.xOffset > f) {
Matrix.translateM(mViewMatrix, 0, (para.xOffset - f) * 10, 0, 0);
f = para.xOffset;
} else {
Matrix.translateM(mViewMatrix, 0, (para.xOffset - f) * 10, 0, 0);
f = para.xOffset;
}
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
GLES20.glUseProgram(mPerVertexProgramHandle);
mMVPMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
"u_MVPMatrix");
mMVMatrixHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
"u_MVMatrix");
mLightPosHandle = GLES20.glGetUniformLocation(mPerVertexProgramHandle,
"u_LightPos");
mPositionHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
"a_Position");
mColorHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
"a_Color");
mNormalHandle = GLES20.glGetAttribLocation(mPerVertexProgramHandle,
"a_Normal");
Matrix.setIdentityM(mLightModelMatrix, 0);
Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, -5.0f);
Matrix.translateM(mLightModelMatrix, 0, 0.0f, 0.0f, 2.0f);
Matrix.multiplyMV(mLightPosInWorldSpace, 0, mLightModelMatrix, 0,
mLightPosInModelSpace, 0);
for (newHexagon nha[] : h.hfgrd) {
for (newHexagon nh : nha) {
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, nh.PosX, nh.PosY, -5);
final FloatBuffer colors;
colors = ByteBuffer
.allocateDirect(nh.colors.length * mBytesPerFloat)
.order(ByteOrder.nativeOrder()).asFloatBuffer();
colors.put(nh.colors).position(0);
drawthis(colors);
}
}
GLES20.glUseProgram(mPointProgramHandle);
h.draw(0, 0);
}
编辑:附加信息:三角形是不均匀的,并排列在屏幕的平面六边形平铺中。
CPU:双核1.2 GHz Scorpion
GPU:Adreno 220
设备:HTC Sensation
Android v4.0.3
答案 0 :(得分:0)
您的代码中至少存在3个主要问题:
glGetUniformLocation
- 在着色器编译后将它们分配给字段一次。获得制服/属性是一项相当昂贵的操作。glDrawElements
或glDrawArrays
)。您的drawthis()
方法应该至少发出一次绘制调用。现代硬件可以处理最大200-500绘图调用。每个绘制调用都具有驱动程序到GPU通信的小开销,因此最佳做法是尽可能多地批量绘制多个绘制调用。但请提供drawthis()
的代码以便更好地理解问题。ByteBuffer.allocateDirect()
。你必须避免任何内存分配,而你是在循环中进行。