代码之家  ›  专栏  ›  技术社区  ›  pookie

从背景线程上的GLSurfaceView获取像素

  •  0
  • pookie  · 技术社区  · 6 年前

    HelloAR demo application

    onDrawFrame 我调用我的截图函数:

    @Override
    public void onDrawFrame(GL10 gl) {
        // Capture the screen
        createBitmapFromGLSurface(gl);
        ....
    }
    

    这是你的名字 createBitmapFromGLSurface 功能:

    public void createBitmapFromGLSurface(GL10 gl) {
        ByteBuffer buffer = ByteBuffer.allocate(w * h * 4);
        GLES20.glReadPixels(0, 0, w, h, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
        Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        bitmap.copyPixelsFromBuffer(buffer);
    
        //Do something with the bitmap
    }
    

    public void onDrawFrame(GL10 gl) {
        AsyncTask.execute(new Runnable() {
            @Override
            public void run() {
               createBitmapFromGLSurface(gl);
            }
    }
    

    但是,当我将位图保存到磁盘时,这只会给我一个完全空白(透明)的图像。

    如何加快速度,让它在后台线程或(最好)两者都工作?

    0 回复  |  直到 6 年前
        1
  •  0
  •   cactustictacs    6 年前

    OpenGL stuff在自己的专用线程上运行,该线程有一个GL上下文-您可能会得到一个空白屏幕,因为它在另一个线程上运行,而没有访问该上下文?

    韦斯顿的版本运行在同一个线程上,这应该是它工作的原因!但是您正在进行一系列的分配(如果您正在写位图,那么还有IO),这是您真正想要避免的 onDrawFrame . 你有16分钟的时间来完成所有的事情,以保持一个平滑的60帧每秒。这就是你所说的“慢”吗?

    我不会使用 AsyncTask 但它应该仍然有效-你只需要打电话 #execute from the UI thread