Android:性能问题多个纹理 Opengl ES
Android: performance issue multiple textures Opengl ES
我在 android 制作的游戏基于 canvas,出于性能原因,我将把这款游戏提升到 OpenGL ES。
问题仍然是性能 - 我有一个背景和一个在屏幕上跳动的精灵 - 这工作得很好,但它似乎是与使用 Canvas 相同的性能问题。有时精灵动画不是很流畅。我想我的设计很糟糕或者真的很糟糕。
每一帧都调用texImage2D是不是错了?有什么替代方案?
谢谢!!!
@Override
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
long speedFactor = 5000;
long time = SystemClock.uptimeMillis() % speedFactor;
float angleInDegrees = (360.0f / speedFactor) * ((int) time);
GLES20.glUseProgram(mProgramHandle);
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVMatrix");
mColorHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Color");
mNormalHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Normal");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
//BACKGROUND
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, background, 0);
//GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, background);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, 0, 0.0f, -2.00001f);
drawTriangle(mCubePositions);
// THE MOVING SPRITE.
int rest = 0;
if (modulo > 0) {
rest = frameCntr % modulo;
}
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, alien[bitmapIndex], 0);
//GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, alien[bitmapIndex]);
if (rest == 0) {
bitmapIndex++;
}
if (bitmapIndex == alien.length) {
bitmapIndex = 0;
}
frameCntr++;
float deltaX = (motion.get_velocityX() * motion.get_xDirection());
float deltaY = (motion.get_velocityY() * motion.get_yDirection());
anim_x += deltaX;
anim_y += deltaY;
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, anim_x, anim_y, -7f);
//Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 1.0f, 0.0f);
drawTriangle(mAlienPositions);
calcPos();
collision.collisionWalls(motion, xPos, yPos, game_width, game_height);
}
实际上,GLUtils.texImage2D()
调用了 glTexImage2D()
。
glTexImage2D()
,另一方面用于加载位图。您只需调用一次即可加载纹理。它将位图加载到当前绑定的纹理中。
在绘图调用中,您应该通过调用 GLES20.glBindTexture( target, texture )
绑定到所需的纹理。 target
是 GL_TEXTURE_2D
或 GL_TEXTURE_CUBE_MAP
。 texture
是在调用 GLUtils.texImage2D()
.
之前绑定的纹理名称
此外,不要忘记在每次绘制调用和初始化后使用 GLES20.glBindTexture( target, 0 )
取消绑定当前纹理。
我在 android 制作的游戏基于 canvas,出于性能原因,我将把这款游戏提升到 OpenGL ES。
问题仍然是性能 - 我有一个背景和一个在屏幕上跳动的精灵 - 这工作得很好,但它似乎是与使用 Canvas 相同的性能问题。有时精灵动画不是很流畅。我想我的设计很糟糕或者真的很糟糕。
每一帧都调用texImage2D是不是错了?有什么替代方案?
谢谢!!!
@Override
public void onDrawFrame(GL10 unused) {
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
long speedFactor = 5000;
long time = SystemClock.uptimeMillis() % speedFactor;
float angleInDegrees = (360.0f / speedFactor) * ((int) time);
GLES20.glUseProgram(mProgramHandle);
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
mMVMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVMatrix");
mColorHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Color");
mNormalHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Normal");
mTextureCoordinateHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoordinate");
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
//BACKGROUND
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, background, 0);
//GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, background);
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, 0, 0.0f, -2.00001f);
drawTriangle(mCubePositions);
// THE MOVING SPRITE.
int rest = 0;
if (modulo > 0) {
rest = frameCntr % modulo;
}
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, alien[bitmapIndex], 0);
//GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, alien[bitmapIndex]);
if (rest == 0) {
bitmapIndex++;
}
if (bitmapIndex == alien.length) {
bitmapIndex = 0;
}
frameCntr++;
float deltaX = (motion.get_velocityX() * motion.get_xDirection());
float deltaY = (motion.get_velocityY() * motion.get_yDirection());
anim_x += deltaX;
anim_y += deltaY;
Matrix.setIdentityM(mModelMatrix, 0);
Matrix.translateM(mModelMatrix, 0, anim_x, anim_y, -7f);
//Matrix.rotateM(mModelMatrix, 0, angleInDegrees, 0.0f, 1.0f, 0.0f);
drawTriangle(mAlienPositions);
calcPos();
collision.collisionWalls(motion, xPos, yPos, game_width, game_height);
}
实际上,GLUtils.texImage2D()
调用了 glTexImage2D()
。
glTexImage2D()
,另一方面用于加载位图。您只需调用一次即可加载纹理。它将位图加载到当前绑定的纹理中。
在绘图调用中,您应该通过调用 GLES20.glBindTexture( target, texture )
绑定到所需的纹理。 target
是 GL_TEXTURE_2D
或 GL_TEXTURE_CUBE_MAP
。 texture
是在调用 GLUtils.texImage2D()
.
此外,不要忘记在每次绘制调用和初始化后使用 GLES20.glBindTexture( target, 0 )
取消绑定当前纹理。