gpt4 book ai didi

android - 无法实现 60fps 渲染简单四边形,Android,Opengl ES 2.0

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:05:49 25 4
gpt4 key购买 nike

我正在开发一款简单的乒乓球类游戏以掌握 opengl 和 android,但似乎在性能方面遇到了瓶颈。

我的游戏逻辑在一个单独的线程上,绘制命令通过一个阻塞队列发送到 gl 线程。问题是我一直停留在 40fps 左右,而且我尝试过的任何方法似乎都无法提高帧率。

为了简单起见,我设置了 opengl:

GLES20.glDisable(GLES20.GL_CULL_FACE);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
GLES20.glDisable(GLES20.GL_BLEND);

opengl 程序的设置和绘图由以下类处理:

class GLRectangle {
private final String vertexShaderCode =
"precision lowp float;" +
// This matrix member variable provides a hook to manipulate
// the coordinates of the objects that use this vertex shader
"uniform lowp mat4 uMVPMatrix;" +

"attribute lowp vec4 vPosition;" +
"void main() {" +
// the matrix must be included as a modifier of gl_Position
" gl_Position = vPosition * uMVPMatrix;" +
"}";

private final String fragmentShaderCode =
"precision lowp float;" +
"uniform lowp vec4 vColor;" +
"void main() {" +
" gl_FragColor = vColor;" +
"}";

protected static int mProgram = 0;

private static ShortBuffer drawListBuffer;
private static short drawOrder[] = { 0, 1, 2, 0, 2, 3};//, 4, 5, 6, 4, 6, 7 }; // order to draw vertices

// number of coordinates per vertex in this array
private static final int COORDS_PER_VERTEX = 3;
private static final int vertexStride = COORDS_PER_VERTEX * 4; // bytes per vertex



GLRectangle(){

int vertexShader = GameRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = GameRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

mProgram = GLES20.glCreateProgram(); // create empty OpenGL ES Program
GLES20.glAttachShader(mProgram, vertexShader); // add the vertex shader to program
GLES20.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
GLES20.glLinkProgram(mProgram); // creates OpenGL ES program executables

// initialize byte buffer for the index list
ByteBuffer dlb = ByteBuffer.allocateDirect(
// (# of coordinate values * 2 bytes per short)
drawOrder.length * 2);
dlb.order(ByteOrder.nativeOrder());
drawListBuffer = dlb.asShortBuffer();
drawListBuffer.put(drawOrder);
drawListBuffer.position(0);
}

protected static void Draw(Drawable dObj, float mvpMatrix[])
{
FloatBuffer vertexBuffer = dObj.vertexBuffer;

GLES20.glUseProgram(mProgram);
//GameRenderer.checkGlError("glUseProgram");

// get handle to fragment shader's vColor member
int mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
//GameRenderer.checkGlError("glGetUniformLocation");

// get handle to shape's transformation matrix
int mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
//GameRenderer.checkGlError("glGetUniformLocation");

// get handle to vertex shader's vPosition member
int mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
//GameRenderer.checkGlError("glGetAttribLocation");

// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
//GameRenderer.checkGlError("glUniformMatrix4fv");

// Set color for drawing the quad
GLES20.glUniform4fv(mColorHandle, 1, dObj.color, 0);
//GameRenderer.checkGlError("glUniform4fv");

// Enable a handle to the square vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
//GameRenderer.checkGlError("glEnableVertexAttribArray");

// Prepare the square coordinate data
GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
//GameRenderer.checkGlError("glVertexAttribPointer");

// Draw the square
GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
//GameRenderer.checkGlError("glDrawElements");

// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
//GameRenderer.checkGlError("glDisableVertexAttribArray");
}
}

我做了很多分析和谷歌搜索,但找不到任何东西可以使这项工作更快......我已经包含了 DDMS 输出的屏幕截图:

DDMS Output

对我来说,看起来 glClear 导致 GLThread 休眠了 23 毫秒……尽管我怀疑情况是否如此。

我完全不知道如何使它更有效率,没有什么特别的。为了寻求更好的渲染性能,我已经切换到我描述的多线程方法,关闭 alpha 混合和深度测试,更改为批处理绘制方法(不适用于这个简单的示例),并将着色器中的所有内容切换为 lowp .

如果您能提供帮助以达到 60fps,我们将不胜感激!

布鲁斯

编辑 好吧,谈谈对问题的过度思考。事实证明,我在过去一周内打开了省电模式...它似乎将渲染锁定为 40fps。

最佳答案

在使用 Galaxy S3 时打开省电模式时会出现此行为。

看来省电模式将帧速率锁定为 40fps。将其关闭很容易达到所需的 60fps。

关于android - 无法实现 60fps 渲染简单四边形,Android,Opengl ES 2.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13334754/

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