【发布时间】:2019-10-21 07:18:35
【问题描述】:
在 Electron 中运行我们的 C++ 节点插件时,不考虑高 DPI 设置/标志。在与 Electron 打包之前,节点插件本身可以正常工作。
我们的节点插件单独在另一个进程中但从 Electron 中调用,创建一个带有 SDL 的新窗口,该窗口尝试通过 SDL_WINDOW_ALLOW_HIGHDPI 启用 DPI
我们没有使用 new BrowserWindow 并且希望 Chrome 在这种情况下调整大小!
在以下情况下不起作用:
- 通过
electron .运行 - 在打包的 .dmg 之后运行
Info.plist High Resolution Capable 中的 Key 设置为 YES——electron 似乎会自动生成一个默认的 info.plist。 (我们自己没有设置任何东西)也没有设置--extend-info
-
电子版:
- “电子”:“^6.0.9”, “电子制造商”:“^21.2.0”,
操作系统: macOS - 10.14.6
预期行为
程序应以高 DPI 模式显示并尊重传递给 SDL 的内容
例如,我们应该收到一个 SDL_WINDOWEVENT,告诉我们以新的宽度和高度调整纹理的大小。
实际行为
当将程序窗口(不是 Electron 创建的窗口)移动到 Retina 屏幕 (macbook pro) 时,它不会接收到新的渲染器输出来调整大小,并且不会显示高 DPI 感知
当我们单独运行节点插件时,只要我们将屏幕移动到不同的 DPI 屏幕,每次移动窗口都会重新配置纹理。
复制
在 SDL 中设置以下内容:
// init
SDL_Window *window = SDL_CreateWindow(
"App name", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height,
SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI)
SDL_Renderer *renderer =
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
// configure texture
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
int o_width = 0, o_height = 0;
int ret = SDL_GetRendererOutputSize(ctx->renderer, &o_width, &o_height);
if (ret != 0) {
throw runtime_error("Could not get output renderer size\n");
}
printf("Output renderer size: %dx%d\n", o_width, o_height);
问题
- 当我们做
electron .时,如何确保它在开发中有效 - 打包后如何使这项成功工作?
【问题讨论】:
-
SDL_GL_GetDrawableSize(window, &w, &h)返回的大小不同吗?