flutter - 从图像加载调色板后极度滞后
问题描述
我目前正在 Flutter 中制作壁纸应用程序。我正在使用palette_generator包从图像中提取颜色。问题是当应用程序从图像中提取颜色时。UI 冻结 3 秒,然后颜色显示在屏幕上。渲染颜色后,整个屏幕都会出现卡顿和延迟。该屏幕上的所有动画都表现得很糟糕。弹出该屏幕可消除卡顿和滞后。这是我正在使用的代码:
Future<PaletteGenerator?> updatePalette() async {
var cache = DefaultCacheManager();
File file = await cache.getSingleFile(widget.wall.url);
ui.Image image = await load(file);
palette = await PaletteGenerator.fromImage(
image,
maximumColorCount: 7,
);
return palette;
}
Future<ui.Image> load(File file) async {
var data = await file.readAsBytes();
ui.Codec codec = await ui.instantiateImageCodec(data);
ui.FrameInfo fi = await codec.getNextFrame();
return fi.image;
}
FutureBuilder<PaletteGenerator?>(
future: updatePalette(),
builder: (context, snapshot) {
if (snapshot.hasData)
return MyBottomSheet(
wall: widget.wall, palette: snapshot.data);
return LinearProgressIndicator();
}),
我能做些什么来解决这个问题吗?
解决方案
我推荐使用flutter_isolate包来实现隔离。您正在使用的功能是一个繁重的功能。使用隔离可避免对主线程施加太大压力。
示例代码:
void updatePalette() async {
var cache = DefaultCacheManager();
File file = await cache.getSingleFile(url);
var port = ReceivePort();
var isolate = await FlutterIsolate.spawn(
computePalette,
[file.readAsBytesSync(), port.sendPort],
);
port.listen((msg) {
List<int> data = msg;
data.forEach((d) => colorList.add(Color(d));
isolate.kill();
port.close();
});
}
void computePalette(List<Object> args) async {
var image = args[0] as Uint8List;
var port = args[1] as SendPort;
var img = Image.memory(image);
var palette = await PaletteGenerator.fromImageProvider(
img.image,
maximumColorCount: 7,
);
List<int> colors = [];
palette.colors.forEach((element) => colors.add(element.value));
port.send(colors);
}
推荐阅读
- python - 如何重新定位 Maya UI 窗口元素?
- jquery - AWS CORS 没有“访问控制允许来源”错误
- sql - 通过 SQL Query 获取具有非表列(由自己的名称创建)名称的表
- laravel - 在 laravel8 中播种后的空表?
- excel - 合并文件夹中的工作表并按列追加
- javascript - 使用 json2csv 后,我现在需要使用 Node 将其转换回 JSON
- java - 使用 Java Stream == > 将自定义对象的 HashMap 过滤到 HashSet
- python - 如果我使用按钮将项目添加到列表中,如何在另一个按钮中使用更新后的列表?
- jenkins-pipeline - 具有本地项目依赖项的项目的 Jenkins 配置
- python - 如何迭代和更改 numpy 数组的所有元素?