DecodeImageFromPixels на кадр для шейдерного конвейера во Flutter приводит к потере кадров; лучший способ подачи фрагменAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 DecodeImageFromPixels на кадр для шейдерного конвейера во Flutter приводит к потере кадров; лучший способ подачи фрагмен

Сообщение Anonymous »

У меня есть 2 пути рендеринга:
  • Пиксельный режим: рисование индексированных пикселей с помощью CustomPainter
  • Режим фильтра (CRT/LCD): преобразование кадрового буфера в байты BGRA и вызов ui.decodeImageFromPixels, затем передача ui.Image во фрагментный шейдер
Режим фильтра плохо удаляет кадры в веб-эмуляторе и эмуляторе Android.
Упрощенный код:

Код: Выделить всё

class FilteredFrameViewState extends State {
ui.Image? _image;
FrameData? _pendingFrame;
bool _decoding = false;

void onFrame(FrameData frame) {
_pendingFrame = frame;
if (!_decoding) {
_decodeNext();
}
}

void _decodeNext() {
final frame = _pendingFrame;
if (frame == null) return;

_pendingFrame = null;
_decoding = true;

final bytes = Uint8List.view(frame.bgraBuffer.buffer);
ui.decodeImageFromPixels(
bytes,
128,
128,
ui.PixelFormat.bgra8888,
(image) {
if (!mounted) return;
setState(() {
final old = _image;
_image = image;
old?.dispose();
_decoding = false;
});

if (_pendingFrame != null) {
_decodeNext();
}
},
);
}

@override
Widget build(BuildContext context) {
if (_image == null) return const SizedBox.shrink();
return CustomPaint(
painter: ShaderPainter(image: _image!, program: shaderProgram),
child: const SizedBox.expand(),
);
}
}
Является ли decodeImageFromPixels слишком дорогим для покадрового использования во Flutter?
Каков рекомендуемый способ передачи часто меняющихся пиксельных данных во фрагментный шейдер без повторного декодирования каждого кадра? Кроме того, есть ли способ сохранять данные о графическом процессоре между кадрами в чистом Flutter (без канала платформы/плагина FBO)?
Цель — 60 кадров в секунду в Интернете и Android и динамический кадровый буфер низкого разрешения с шейдером постобработки.

Подробнее здесь: https://stackoverflow.com/questions/798 ... frame-drop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»