Android OpenGLES设备问题

时间:2012-12-01 05:22:02

标签: android performance opengl-es live-wallpaper framebuffer

我最近开始用Android学习OpenGLES。我正在创建一个带有渲染的GLWallpaperService类的livewallpaper。

Android模拟器的问题是能够显示动画但在使用Android设备进行测试时(HTC Incredible S)FPS保持在45-50左右但屏幕仍为空白。

以下是代码段!!

onDrawFrame

public void onDrawFrame(GL10 gl) {
    float currLevel = curve[(MAX_CURVE_POINT_NO + curveStart - 1)
            % MAX_CURVE_POINT_NO];
    if (!isCreated) {
        isCreated = !isCreated;
        _spriteVerices = BufferFactory.createFloatBuffer(8);
        spriteTextCordinates = BufferFactory.createShortBuffer(8);
    }
    _spriteVerices.put(spriteVerices);
    spriteTextCordinates.put(spriteTextCordinatesArray);
    _spriteVerices.position(0);
    spriteTextCordinates.position(0);

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_BLEND);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glEnable(GL10.GL_POINT_SMOOTH);

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glScalef(0.8f, 0.8f, 1.0f);
    gl.glTranslatef(-0.2f, 0, 0);

    gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, _spriteVerices);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glTexCoordPointer(2, GL10.GL_SHORT, 0, spriteTextCordinates);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glPushMatrix();
    gl.glTranslatef(1.0f, currLevel, -0.01f);
    gl.glColor4f(0.0f, 0.5f, 1.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    curve[curveStart] = ekgMap[curveStart]; // ((rand()%32768)/32768.0)*0.4-0.2;
    curveStart = (curveStart + 1) % MAX_CURVE_POINT_NO;
}

onSurfaceChanged

public void onSurfaceChanged(GL10 gl, int width, int height) {

            gl.glViewport(0, 0, width, height);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl, 60f, (float) width / (float) height, 1f, 100f);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glTranslatef(0, 0, -5);
    gl.glRotatef(30f, 1, 0, 0);

    gl.glEnable(GL10.GL_LIGHTING);
    gl.glEnable(GL10.GL_RESCALE_NORMAL);
    gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

    // Set the color of light bouncing off of surfaces to respect the
    // surface color
    gl.glEnable(GL10.GL_COLOR_MATERIAL);

    setupLightSources(gl);

    // Turn on a global ambient light. The "Cosmic Background Radiation", if
    // you will.
    float[] ambientLightRGB = { 0.3f, 0.3f, 0.3f, 1.0f };
    gl.glLightModelfv(GL10.GL_LIGHT_MODEL_AMBIENT, ambientLightRGB, 0);
}

onSurfaceCreated

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

    this.loadTexture(gl, mContext, R.drawable.dot);

    gl.glClearDepthf(1f);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);

    // Turn on culling, so OpenGL only draws one side of the primitives
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glFrontFace(GL10.GL_CCW);
    gl.glCullFace(GL10.GL_BACK);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_BLEND);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_LINE_SMOOTH);
    gl.glEnable(GL10.GL_POINT_SMOOTH);
}

谢谢,

1 个答案:

答案 0 :(得分:2)

如果你确定你设置了正确的开放式,那么更常见的是问题不在于你在哪里画画。您可能正在绘制视图的范围。你的翻译要非常小心。

你也可能需要翻转你的聚合物,我知道在你看到它之前我已经遇到了这个问题,因为你的画面背对着你。

当我这样做时,我的抽奖看起来与此非常相似

*  This is where you draw the screen, called every auto onDraw Loop pass
         * ************************************************************************/
        //Log.d("Game", "Render");
        gl.glViewport(0, 0, Screen.SCREEN_WIDTH, Screen.SCREEN_HEIGHT);
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glOrthof(0, Screen.WIDTH_SCALE, 0, Screen.HEIGHT_SCALE, 1, -1);

        //gl.gltranslatef(x,y,z) will translate everything drawn here after by that amount, effectively scrolling the view.

        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);


        gl.glEnable(GL10.GL_TEXTURE_2D);
        MeshRect mRect; // this holds all of our rectangles

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
        /***************** so this is how it goes for rendering any object ****************************************************
        ball.Update(deltaTime);      //first update the object
        gl.glPushMatrix();
        gl.glLoadIdentity();
            gl.glTranslate(x,y,z);
            texture.bind(gl, Texture.TEXTURE_BALL2);       //then bind the texture we would like to use
            mRect = new MeshRect(ball.getMyRect());       //then create the rectangle at (0,0,0)
            mRect.Draw(GL10.GL_TRIANGLES, gl);       //Finally tell that rectangle to draw
        gl.glPopMatrix();
        ***********************************************************************************************************************

当然这是ortho,你的看起来是3d,但基本应该是差不多的。