Есть ли в Android OpenGL функция вне экрана для отображения производительности drawbitmap? - PullRequest
0 голосов
/ 26 января 2019

У меня есть приложение для Android (targetSdkVersion 28), которое объединяет 2 TextureView, каждый из которых отображает вид с камеры, в 1 растровое изображение, а затем использует drawbitmap на поверхность медиа-рекордера для записи.Это вызывается из onSurfaceTextureUpdated.Похоже, что в финальном видео это сокращает скорость до 8-10 кадров в секунду.

Кто-нибудь знает, может ли OpenGL добиться этого более эффективным способом, или приведенный ниже код можно сделать болееPerformant?

Я пытался переместить создание растрового изображения и холста за пределы функции, и хотя оно немного лучше, объединенное растровое изображение имеет мерцание.

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 Ответ

0 голосов
/ 28 января 2019

Я не уверен, нужен ли вам рендеринг пользовательского интерфейса в текстуру или нормальный рендеринг в текстуру, возможно, один из них. Вы можете проверить, например, Можно ли отобразить представление Android на FBO OpenGL или текстуру? и https://gamedev.stackexchange.com/questions/41887/how-to-render-small-texture-on-another-texture

Также не забывайте всегда проверять https://www.khronos.org/opengl/wiki/Common_Mistakes

...