【问题标题】:Mac OS X: Can one process render to another process's window?Mac OS X:一个进程可以渲染到另一个进程的窗口吗?
【发布时间】:2010-10-09 15:38:58
【问题描述】:

您好!

我目前正在将 Web 浏览器插件从 Win32 移植到 MacOSX。该插件的一个特点是,当插件被加载时,它会产生一个单独的进程,作为插件的“引擎”,并在插件的窗口中执行绘图操作(具体来说,通过将 OpenGL 上下文附加到父进程的窗口并在该上下文中执行 OpenGL 渲染命令)。我们这样做是因为插件通常作为浏览器进程中的线程加载,因此插件中的崩溃会导致整个浏览器崩溃。通过将“繁重的工作”划分为一个单独的进程并保持插件代码非常精简,我们可以保护用户免受此类崩溃的影响。

我想在 MacOSX 上保留这种子进程渲染器架构,但我听说过一个令人讨厌的谣言(与 Google Chrome 网络浏览器有关),即 MacOSX 不允许进程手动访问其窗口到另一个进程。我自己在这个领域的搜索一直没有结果。如果有人对这个问题有任何了解,并且可以就如何实现这一目标提供一些建议,或者提供更确定的“无法完成”,那将非常有帮助。

感谢您的帮助!

【问题讨论】:

标签: macos process quartz-graphics window-handles


【解决方案1】:

大约一年前,我正在研究解决此问题的方法。我在苹果邮件列表上开了几个线程:

http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg08056.html

http://www.mail-archive.com/quartzcomposer-dev@lists.apple.com/msg01878.html

http://lists.apple.com/archives/mac-opengl/2008/May/msg00099.html

我不得不恢复到使用 CGWindowListCreateImage 的解决方案,该解决方案获取了 opengl 进程窗口的屏幕抓取并将其转换为位图以显示在主进程窗口中。这远没有效率,因为像素数据是从视频内存传输到系统内存的。

我还尝试了浮动窗口解决方案。 opengl 进程窗口浮动在主进程窗口上方,并响应主窗口中的鼠标移动。但我在拖动滞后和窗口 z 顺序时遇到了问题。

您会认为 NSWindowSharingReadWrite 会满足您的要求,但当时的文档/示例几乎不存在。

但也许去年情况发生了变化。如果您发现任何新内容,请随时通知我!

祝你好运

JC

【讨论】:

  • 在调查了这个问题大约一周后,我或多或少地落在了这里。我在这个问题上向 Apple 提出了未解决的请求,但没有人回复我如何利用 NSWindowSharingType 设置为 NSWindowSharingReadWrite 的窗口。从 Mac OS 10.5 开始,我将不得不将写入 Windows 称为“不存在”或“文档记录太差以至于无法关心”。我使用的解决方案是使用 shm_open 和 mmap 创建一个共享内存缓冲区,将 glReadPixels 从进程 A 中创建到该缓冲区中,然后 glTexImage2D 并在进程 B 中渲染到一个四边形。它足够快。
  • 我也尝试了opengl进程窗口浮动在主进程之上的方法。处理 Spaces 需要您使用私有 API,当用户切换屏幕或使用 Expose 时,该 API 会为您提供通知。最糟糕的部分是处理点击,这会导致主窗口的 z 位置位于 opengl 窗口的前面,但我在 [NSWindow sendEvent] 中找到了一个私有函数,可以部分解决它。这很难看,我也在寻找更好的解决方案。
【解决方案2】:

这是从 Apple 开发团队收到的总体答复。

在 MacOSX 10.5 和更早的版本中基本上没有办法做到这一点,就像将 OpenGL 渲染上下文附加到另一个进程的窗口一样干净。在这些情况下,人们开发的 hack 可能是最好的解决方案。

我们在 MacOS 10.6 中最接近的东西是the IOSurface system;在 10.6 中使用它似乎是最干净的解决方案。如果您希望渲染进程拦截渲染进程中的点击,您必须自己捆绑事件并使用您认为最合适的任何方法将它们传递给渲染进程。

更多关于IOSurface的信息可以在this StackOverflow entry找到

【讨论】:

    【解决方案3】:

    如果NSWindowSharingType 设置为NSWindowSharingReadWrite,则另一个进程可以写入一个进程中的窗口。这是在 Leopard 中添加的。请注意,我自己没有使用过它,但我想说它至少为您消除了“无法完成”的障碍;-)

    【讨论】:

      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-07
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多