Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t实现60帧/秒的简单四维渲染,Android,Opengl ES 2.0_Android_Optimization_Opengl Es 2.0 - Fatal编程技术网

Can';t实现60帧/秒的简单四维渲染,Android,Opengl ES 2.0

Can';t实现60帧/秒的简单四维渲染,Android,Opengl ES 2.0,android,optimization,opengl-es-2.0,Android,Optimization,Opengl Es 2.0,我正在开发一款简单的乒乓球游戏,以熟悉opengl和android,在性能方面似乎遇到了困难 我将游戏逻辑放在一个单独的线程上,通过阻塞队列将draw命令发送到gl线程。问题是我被困在40fps左右,而且我尝试过的任何东西似乎都不能提高帧速率 为了保持简单,我使用以下工具设置opengl: GLES20.glDisable(GLES20.GL_CULL_FACE); GLES20.glDisable(GLES20.GL_DEPTH_TEST); GLES20.glDisable(GLES20.G

我正在开发一款简单的乒乓球游戏,以熟悉opengl和android,在性能方面似乎遇到了困难

我将游戏逻辑放在一个单独的线程上,通过阻塞队列将draw命令发送到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输出的屏幕截图:

对我来说,glClear似乎让GLThread睡了23毫秒。。。虽然我怀疑这是真的

我完全不知道如何才能使这更有效,没有什么奇怪的事情发生。为了获得更好的渲染性能,我已切换到我描述的多线程方法,关闭alpha混合和深度测试,更改为批处理绘制方法(不适用于此简单示例),并将着色器中的所有内容切换到lowp

如果您能帮助我们将此速度提高到60 fps,我们将不胜感激

布鲁斯


编辑我们来谈谈过度思考问题。原来我在过去的一周里已经打开了省电模式。。。它似乎将渲染锁定为40fps。

当使用Galaxy S3打开节能模式时,会发生此行为


似乎节能模式将帧速率锁定为40fps。关闭它很容易达到所需的60fps。

不确定您是否可以控制设备表面的EGL设置,但如果可以,有办法将更新设置为在“非同步”模式下运行


这并非在所有设备上都可用,但允许对渲染进行一些控制。

这听起来像是对设备的限制,一些制造商限制设备帧速率以节省电源(my Atrix限制为30fps)。40fps应该足够快,我想,我不会担心的。对不起,我不知道最好的地方是哪里。。。我的设备是Galaxy S3,所以我希望它能比40fps做得更好。当quad以速度移动时,你可以看到不同,这是必须的。S3上的Android版本是什么?我们谈谈过度思考的问题。原来我在过去的一周里已经打开了省电模式。。。它似乎将渲染锁定为40fps。
egl.eglSwapInterval( dpy, 0 )