- Пиксельный режим: рисование индексированных пикселей с помощью CustomPainter
- Режим фильтра (CRT/LCD): преобразование кадрового буфера в байты BGRA и вызов ui.decodeImageFromPixels, затем передача ui.Image во фрагментный шейдер
Упрощенный код:
Код: Выделить всё
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(),
);
}
}
Каков рекомендуемый способ передачи часто меняющихся пиксельных данных во фрагментный шейдер без повторного декодирования каждого кадра? Кроме того, есть ли способ сохранять данные о графическом процессоре между кадрами в чистом Flutter (без канала платформы/плагина FBO)?
Цель — 60 кадров в секунду в Интернете и Android и динамический кадровый буфер низкого разрешения с шейдером постобработки.
Подробнее здесь: https://stackoverflow.com/questions/798 ... frame-drop
Мобильная версия