Android OpenGL 是不是具有用于绘制位图性能的离屏功能

Posted

技术标签:

【中文标题】Android OpenGL 是不是具有用于绘制位图性能的离屏功能【英文标题】:Does Android OpenGL have an off-screen function for drawbitmap performanceAndroid OpenGL 是否具有用于绘制位图性能的离屏功能 【发布时间】:2019-06-19 18:58:01 【问题描述】:

我有一个 android 应用程序 (targetSdkVersion 28),它结合了 2 个 TextureView,每个将相机视图显示为 1 个位图,然后使用 drawbitmap 到 mediarecorder 表面进行记录。这是从 onSurfaceTextureUpdated 调用的。在最终视频中,这似乎将其限制在每秒 8 到 10 帧左右。

有谁知道 OpenGL 是否可以以更高效的帧速率方式实现这一点,或者是否可以使以下代码具有更高的性能?

我尝试在函数之外移动创建位图和画布,虽然效果稍微好一些,但组合的位图会闪烁。

class thScreenShot extends AsyncTask

    @Override
    protected Object doInBackground(Object... params) 

        try 

            List<TextureView> tilingViews = getAllTextureViews(rootLayout);
            if (tilingViews.size() > 0) 
                final Bitmap bitmap = Bitmap.createBitmap(DISPLAY_WIDTH, DISPLAY_HEIGHT, Bitmap.Config.RGB_565);
                final Canvas canvas = new Canvas(bitmap);
                for (TextureView tilingTextureView : tilingViews) 
                    Bitmap bitmap1 = tilingTextureView.getBitmap(tilingTextureView.getWidth(), tilingTextureView.getHeight());
                    int[] location = new int[2];
                    tilingTextureView.getLocationInWindow(location);
                    Rect dest = new Rect(location[0], location[1], bitmap.getWidth(), bitmap.getHeight());
                    canvas.drawBitmap(bitmap1, dest, dest, null);
                
                if (isRecording) 
                     if (surfaceS == null)
                     
                          surfaceS = mMediaRecorder.getSurface();
                     
                     synchronized (surfaceS) 
                          canvasS = surfaceS.lockHardwareCanvas();
                          canvasS.drawBitmap(bitmap, 0, 0, null);
                          surfaceS.unlockCanvasAndPost(canvasS);
                          FPSCount++;
                     
                
            
            return null;
        
        catch (Exception ex)
        
            return null;
        
    


public List<TextureView> getAllTextureViews(View view)

    List<TextureView> tilingViews = new ArrayList<TextureView>();
    if (view instanceof TextureView) 
        tilingViews.add((TextureView)view);
    
    else if(view instanceof ViewGroup)
    
        ViewGroup viewGroup = (ViewGroup)view;
        for (int i = 0; i < viewGroup.getChildCount(); i++) 
            tilingViews.addAll(getAllTextureViews(viewGroup.getChildAt(i)));
        
    
    return tilingViews;

【问题讨论】:

【参考方案1】:

我不确定您是否需要 UI 渲染到纹理或正常渲染到纹理,可能是其中之一。您可以检查例如Is it possible to render an Android View to an OpenGL FBO or texture? 和https://gamedev.stackexchange.com/questions/41887/how-to-render-small-texture-on-another-texture

还记得经常检查https://www.khronos.org/opengl/wiki/Common_Mistakes

【讨论】:

谢谢。将检查这一切。干杯。

以上是关于Android OpenGL 是不是具有用于绘制位图性能的离屏功能的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL / GLU:是不是有用于绘制圆的内置函数?

如何在Android上使用OpenGL ES 2.0绘制点

具有 0 个颜色位和 0 个深度位的 SDL2 OpenGL 4.2 上下文

opengl打开本地bmp图片绘制

Android中的OpenGL使用初探

我的OpenGL学习进阶之旅EGL简介