У меня есть приложение для 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;
}