SDL导致CEF3生成额外的窗口
SDL causes CEF3 to spawn additional windows
我想让CEF3(铬嵌入式框架:https://bitbucket.org/chromiumembedded/cef)与SDL(简单的DirectMedia层:https://www.libsdl.org/)一起工作。
我对这两个库的预期用途是使用SDL打开一个窗口,从它接收事件并渲染OpenGL图形(与其他库如GLEW一起)。我想使用CEF3为屏幕外的用户界面渲染图形元素,然后通过OpenGL纹理在屏幕上显示它们。所有这些工作,我可以打开SDL窗口,处理事件,我可以绘制OpenGL纹理,并从CEF3的屏幕外渲染中获得OpenGL兼容的数据。
问题是,如果我在测试环境中同时运行SDL和CEF3, CEF3会产生多个额外的窗口。
这是我使用CEF3的代码。
void Example::webTest()
{
//Args
CefMainArgs cefArgs;
//Settings
CefSettings cefSettings;
cefSettings.pack_loading_disabled = true;
cefSettings.windowless_rendering_enabled = true;
//Initialize
CefInitialize(cefArgs, cefSettings, nullptr, nullptr);
//Render Handler
renderHandler = new InterfaceRenderHandler();
//Window Info
CefWindowInfo cefWindowInfo;
//cefWindowInfo.SetAsWindowless(0, true);
cefWindowInfo.windowless_rendering_enabled = true;
cefWindowInfo.transparent_painting_enabled = true;
//Interface Browser
CefRefPtr<InterfaceBrowserClient> cefClient;
cefClient = new InterfaceBrowserClient(renderHandler);
//Browser
CefBrowserSettings cefBrowserSettings;
cefBrowserSettings.windowless_frame_rate = 60;
CefBrowserHost::CreateBrowser(cefWindowInfo, cefClient.get(), "http://www.stackoverflow.com", cefBrowserSettings, nullptr);
//Threaded Loops
thread renderThread(renderLoop);
thread sdlThread(sdlLoop);
//Main Loop
CefRunMessageLoop();
//Unthread
renderThread.join();
sdlThread.join();
//Shutdown
CefShutdown();
}
关于这段代码的几点说明:
- renderLoop函数旨在收集完成的纹理,但目前没有做任何事情。 函数sdlLoop只是在SDL窗口轮询事件,然后丢弃它们。
- CefRunMessageLoop锁定程序。(我猜里面有一个循环)。
- CefRunMessageLoop需要为页面渲染发生而运行,并且当不在主线程中运行时它似乎行为不正确。
- InterfaceBrowserClient是一个类我实现基于CefClient,简单地返回renderHandler调用时,它是创建和不做任何其他。
- InterfaceRenderHandler是一个基于CefRenderHandler实现的类。它向CEF3提供预期渲染区域的尺寸,并从CEF3接收完成的图像数据。
- 我已经把代码的类在这里http://pastebin.com/sBm9AAQZ以防有人需要看到他们。
如果我在运行这段代码之前初始化一个SDL窗口,会出现两个额外的窗口,一个出现在new InterfaceBrowserClient(renderHandler);
,另一个出现在CefRunMessageLoop();
。这些窗口与SDL窗口具有相同的尺寸,具有相同的标题和相同的内容(纯白色)。然后甚至坐在屏幕上完全相同的位置,这样只有顶部是可见的。然而,当原始窗口响应时,Windows认为这些窗口没有响应,就好像它们没有运行事件循环一样。我已经尝试改变渲染大小是不同的窗口大小(这是在InterfaceRenderHandler内完成),我确信这是他们正在复制的SDL窗口的大小,而不是渲染区域的大小。
如果我不初始化SDL窗口,则根本不会出现任何窗口(当然除了命令提示符),并且渲染照常进行(这可以从控制台在加载页面时打印警告来识别)。
了解窗口系统的人是否了解为什么会发生这种情况,更重要的是,我如何摆脱这些额外的窗口?我没有在任何其他操作系统上测试过这个,因为我对Linux c++编译不太了解,但如果这个问题仍然存在,我会尝试一下。
谢谢。
多个窗口可能是CEF
产生它的子进程,GPU
, Render
等
在子进程的情况下,你只需要调用CefExecuteProcess
并返回它的退出代码。这必须在其他代码执行之前发生。您可以在cefsimple
应用程序中看到一个工作示例。
https://bitbucket.org/chromiumembedded/cef/src/aefb5ccce879f308f0bcc3ac719c86defe2f9715/tests/cefsimple/cefsimple_win.cc?at=master cl-51
// CEF applications have multiple sub-processes (render, plugin, GPU, etc)
// that share the same executable. This function checks the command-line and,
// if this is a sub-process, executes the appropriate logic.
int exit_code = CefExecuteProcess(main_args, app.get(), sandbox_info);
if (exit_code >= 0) {
// The sub-process has completed so return here.
return exit_code;
}
- 如何在Qt窗口小部件中使用QStringView(或QStringRef)
- 为什么抓取窗口标题的代码会导致应用崩溃?
- OpenGL 纹理会导致 ImGUI 窗口永久失焦
- 在 d3d->CreateDevice 中D3DERR_INVALIDCALL,导致在 Allegro 5 D3D 程序中启动时窗口闪烁
- MPI_Win_free会导致无效窗口错误
- 什么会导致"静态"标签在窗口上不显示WS_VISIBLE
- QT对话框窗口禁用ewerningOntonop会导致窗口关闭
- QT QMediaPlayer小工具导致出现白色小窗口
- 调整窗口大小后交换渲染缓冲区会导致问题
- 哪些窗口事件会影响 MDIGetActive()?导致OnMDIActivate()的事件并不是唯一的事件
- Xlib:关闭窗口总是会导致致命的 IO 错误
- 禁用 DWM 会导致 OpenGL 窗口中的前端缓冲区损坏
- 关闭康科尔窗口会导致崩溃
- Gtk::Window set_visible导致一个空白窗口
- 多重XOpenDisplay(NULL)导致不映射窗口
- 为什么未初始化的返回值会导致createwindowwex的无效窗口句柄错误
- SDL导致CEF3生成额外的窗口
- 调整窗口大小会导致右边框附近出现涂抹
- 将关键部分替换为boost::detail::spinlock导致窗口死锁
- 在c++中使用system()函数导致命令提示符窗口出现和消失