Android OpenGLES 设备问题

标签 android performance opengl-es live-wallpaper framebuffer

我最近开始使用 Android 学习 OpenGLES。我正在使用带有渲染功能的 GLWallpaperService 类创建动态壁纸。

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

这是代码 fragment !!

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);
}

谢谢,

最佳答案

如果您确定您正确设置了 open gl,那么通常情况下问题不在于您在何处绘图。您可能会超出 View 范围。在翻译等方面要非常小心。

你可能还需要翻转你的多边形,我知道我之前遇到过这个问题,因为你的画是背对着你的。

当我这样做的时候,我的画看起来和这个非常相似

*  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();
        ***********************************************************************************************************************

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

关于Android OpenGLES 设备问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13656653/

相关文章:

android - 为什么我不能回复 PlayStore 评论?

android - 线程导致应用程序无响应

c# - 监控 C# 方法性能的工具

java - OpenGL "Invalid operation error"android 手机上的 glDrawElements 函数后

opengl-es - 如何在OpenGL ES中使用片段着色器绘制球体错觉?

objective-c - 需要向我的非 3D 应用程序添加交互式 3D 模型

Android waveshare 触摸屏

java - 将 Vector2 乘以标量 (LibGDX)

algorithm - 自适应IO优化问题

java - 在java中翻转标志的计数器