gpt4 book ai didi

Android:性能问题多个纹理 Opengl ES

转载 作者:行者123 更新时间:2023-11-29 16:59:18 25 4
gpt4 key购买 nike

我在 android 中制作的游戏是基于 Canvas 的,出于性能原因,我将把这个游戏提升到 OpenGL ES。

问题仍然是性能 - 我有一个背景和一个在屏幕周围弹跳的 Sprite - 这工作得很好,但它似乎是与使用 Canvas 相同的性能问题。有时 Sprite 动画不是很流畅。我想我的设计很糟糕或者真的很糟糕。

每一帧都调用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(),另一方面用于加载位图。您只需调用一次即可加载纹理。它将位图加载到当前绑定(bind)的纹理中。

在绘制调用中,您应该通过调用 GLES20.glBindTexture( target, texture ) 绑定(bind)到所需的纹理。 targetGL_TEXTURE_2DGL_TEXTURE_CUBE_MAPtexture 是在调用 GLUtils.texImage2D() 之前绑定(bind)的纹理名称。

此外,不要忘记在每次绘制调用和初始化后使用 GLES20.glBindTexture( target, 0 ) 解除当前纹理的绑定(bind)。

关于Android:性能问题多个纹理 Opengl ES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43558283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com