使用OpenGL ES、JNI和C++的安卓系统上的框架似乎出现了问题

Frames seem out of order on Android with OpenGL-ES, JNI and C++

本文关键字:框架 问题 系统 ES OpenGL JNI C++ 使用      更新时间:2023-10-16

我制作了一个Android应用程序,在该应用程序中,我通过JNI使用OpenGL ES 2.0和C++渲染所有内容,除一件事外,一切都很好。"渲染缓冲区"似乎不知怎么出了问题,图像看起来像是在跟踪一个阴影。不知怎么的,就像运动模糊,我不知道是什么原因造成的。

我只使用GLSurfaceView创建一个"活动",该活动具有渲染器类,绘图的渲染调用位于该类中。是什么导致了这种奇怪的行为?

创建所有东西的Java代码(减去一些无关的东西)如下所示:

public class Main extends Activity  
{   static  MainLoop    mloop   = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {   super.onCreate(savedInstanceState);
        mloop = new MainLoop()
        setContentView(mloop);
    }
    .
    .
    .
}

呈现的Java代码看起来是这样的(再次减去一些无关的东西):

public class MainLoop extends GLSurfaceView
{   .
    .
    public MainLoop()
    {   super(parent);
        setEGLContextClientVersion(2);
        setEGLConfigChooser(8, 8, 8, 8, 0, 0)
        //
        this.getHolder().setFormat(PixelFormat.TRANSLUCENT);
        //
        setRenderer(new Renderer());        
    }
    .
    .
    private static class Renderer implements GLSurfaceView.Renderer 
    {   public void onDrawFrame(GL10 gl)
        {   JNIRender();
        }
        public void onSurfaceChanged(GL10 gl, int width, int height)
        {   JNIChanged();   
        }
        public void onSurfaceCreated(GL10 gl, EGLConfig config)
        {   JNICreate();
        }
    }
}

整个渲染都是用C++中的JNIRender调用完成的,除了乱序之外,看起来很好,所有的渲染看起来都像是在跟踪一个阴影。是否有什么事情需要我考虑,或者我做错了?

这只是一个粗略的猜测,但在绘制任何内容之前是否清除了缓冲区?

在你的c++代码中,在画任何东西之前使用这个:

glClearColor(0,0,0,1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BIT);

我检查了一下,发现我的c++代码中有一个swapbuffer命令,在java中使用时很糟糕,因为缓冲区无论如何都是自动显示的,这会混淆事情。

我将swapbuffer命令封装在一个ifdef中,在使用gcc编译时从未使用过它。