我知道Flutter支持使用WASM CanvasKit 中的Skia代替DomCanvas在Flutter Web中绘图,即“Skia + WebAssembly”。
我听说这可以显著提高性能,但是我不知道如何启用它。
您可以通过提供Dart环境常量,在Flutter Web中启用CanvasKit / Skia:
flutter run -d chrome --dart-define=FLUTTER_WEB_USE_SKIA=true
Flutter
工具现在有一个很好的快捷方式:
flutter run -d chrome --web-renderer canvaskit
--dart-define=FLUTTER_WEB_USE_SKIA=true
参数将设置常量以使用Skia。您还需要在flutter build web
中提供它:
flutter build web --web-renderer canvaskit
--web-renderer
有三个选项:
auto (默认)
- 自动选择要使用的渲染器。当应用在移动浏览器上运行时,此选项选择HTML渲染器;当应用在台式机浏览器上运行时,则选择CanvasKit渲染器。html
- 始终使用HTML渲染器。canvaskit
- 始终使用CanvasKit渲染器。请查看选择要使用的选项以决定使用哪个选项。
上述内容可在flutter/engine/initialization.dart
文件中找到。请务必检查master
分支,以确认信息是否仍然最新。
在那里,您可以看到配置Flutter Web使用CanvasKit的其他选项:
FLUTTER_WEB_AUTO_DETECT
--dart-define=FLUTTER_WEB_AUTO_DETECT=true
现在也可以使用以下方法来完成此操作:
--web-renderer auto
提供此常量将启用渲染器检测的自动检测:
仅当您未指定window.flutterWebRenderer
时才成立。
window.flutterWebRenderer
如果您启用了自动检测(请参见上文),您可以在JavaScript代码/HTML文件中动态指定渲染器:...
<script>
// This sets the Flutter web renderer in auto detect mode.
// See https://dev59.com/zVIG5IYBdhLWcg3wiApO#64583462.
window.flutterWebRenderer = 'canvaskit';
</script>
<!-- This script installs service_worker.js to provide PWA functionality to
application. For more information, see:
https://developers.google.com/web/fundamentals/primers/service-workers -->
<script>
var serviceWorkerVersion = null;
...
在发现自动检测 PR之后,我真的很感激以下对当前情况的总结:
如果启用了自动检测(通过环境变量
FLUTTER_WEB_AUTO_DETECT
设置),开发人员将被允许将window.flutterWebRender
设置为canvaskit
或html
以选择渲染后端。 如果未设置window.flutterWebRender
,Flutter引擎将在桌面设备上使用canvaskit
,而在移动设备上使用html
。 如果将window.flutterWebRender
设置为无效值(既不是canvaskit
也不是html
),它将默认为html
。如果禁用了自动检测,则会检查环境变量
FLUTTER_WEB_USE_SKIA
的值。如果为true,则使用canvaksit
。否则,使用html
。
如Web渲染器文档所述,以下是使用canvaskit模式构建/运行Web的有效命令:
flutter build web --web-renderer canvaskit
flutter run -d chrome --web-renderer canvaskit
flutter run -d Chrome --dart-define=FLUTTER_WEB_USE_SKIA=true --release
flutter run -d Chrome --dart-define=FLUTTER_WEB_CANVASKIT_URL=true --release
flutter run -d Chrome --dart-define=FLUTTER_WEB_CANVASKIT_FORCE_CPU_ONLY=true --release
您还可以在运行时强制执行它,将其添加到您的web/index.html
中:
window.addEventListener('load', function (ev) {
// Download main.dart.js
_flutter.loader.loadEntrypoint({
serviceWorker: {
serviceWorkerVersion: serviceWorkerVersion,
},
onEntrypointLoaded: async function(engineInitializer) {
// Configure the engine options
let engineOptions = new _flutter.JsFlutterConfiguration();
engineOptions.renderer = "canvaskit";
// Initialize the Flutter engine
let appRunner = await engineInitializer.initializeEngine(engineOptions);
// Run the app
await appRunner.runApp();
}
});
});
这里是Web渲染器和自定义Web应用程序初始化的文档。
useCanvasKit
(请查看答案中的链接文件)。然而,我不确定如何在 Flutter 应用程序中导入引擎库。 - creativecreatorormaybenot