用户实测三台电脑(Win10×2/Win11×1)安装后白屏,远程与非远程均有;进程与 HTTP 服务完全健康(manifest 可访问、cmd 无报错)——纯渲染层失败。属于 Flutter Windows 引擎 GPU/ANGLE 渲染在真实环境的已知兼容性问题 (flutter/flutter#74856:RDP 会话 OpenGL 不可用白屏;老/虚拟显卡同理)。 方案:wWinMain 入口(引擎创建前)设置 FLUTTER_ENGINE_SWITCHES= --enable-software-rendering,全部环境统一软件渲染。本应用为轻量状态页 (列表/卡片/图标),软件渲染性能无感;换来 RDP、老显卡、驱动缺失等 一切图形环境可用。此前 ANGLE_PLATFORM_BACKEND=d3d9 试验失败(Flutter 自带的 ANGLE 仅含 d3d11 后端),软件渲染是为该场景设计的官方开关。
50 lines
1.7 KiB
C++
50 lines
1.7 KiB
C++
#include <flutter/dart_project.h>
|
|
#include <flutter/flutter_view_controller.h>
|
|
#include <windows.h>
|
|
|
|
#include "flutter_window.h"
|
|
#include "utils.h"
|
|
|
|
int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
|
|
_In_ wchar_t *command_line, _In_ int show_command) {
|
|
// 统一软件渲染:Flutter 的 GPU/ANGLE 渲染在多种真实环境下初始化失败导致
|
|
// 白屏窗口(RDP 远程会话、老显卡/驱动、虚拟显卡——实测远程与非远程机器
|
|
// 均有白屏,而进程与 HTTP 服务本身健康)。本应用界面为轻量状态页,软件
|
|
// 渲染性能足够;引擎开关必须在引擎创建前经 FLUTTER_ENGINE_SWITCHES 注入。
|
|
SetEnvironmentVariable(L"FLUTTER_ENGINE_SWITCHES", L"--enable-software-rendering");
|
|
|
|
// Attach to console when present (e.g., 'flutter run') or create a
|
|
// new console when running with a debugger.
|
|
if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
|
|
CreateAndAttachConsole();
|
|
}
|
|
|
|
// Initialize COM, so that it is available for use in the library and/or
|
|
// plugins.
|
|
::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
|
|
|
|
flutter::DartProject project(L"data");
|
|
|
|
std::vector<std::string> command_line_arguments =
|
|
GetCommandLineArguments();
|
|
|
|
project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
|
|
|
|
FlutterWindow window(project);
|
|
Win32Window::Point origin(10, 10);
|
|
Win32Window::Size size(1000, 660);
|
|
if (!window.Create(L"资安信插件助手", origin, size)) {
|
|
return EXIT_FAILURE;
|
|
}
|
|
window.SetQuitOnClose(true);
|
|
|
|
::MSG msg;
|
|
while (::GetMessage(&msg, nullptr, 0, 0)) {
|
|
::TranslateMessage(&msg);
|
|
::DispatchMessage(&msg);
|
|
}
|
|
|
|
::CoUninitialize();
|
|
return EXIT_SUCCESS;
|
|
}
|