22

ご挨拶!

私は現在、Web ブラウザ プラグインを Win32 から MacOSX に移植しています。プラグインの機能の 1 つは、プラグインが読み込まれると、プラグインの「エンジン」として機能する別のプロセスを生成し、プラグインのウィンドウへの描画操作を実行することです (具体的には、OpenGL コンテキストを親プロセスのウィンドウとそのコンテキストへの OpenGL レンダリング コマンドの実行)。これは、通常、プラグインがブラウザ プロセス内のスレッドとして読み込まれるためです。プラグインがクラッシュすると、ブラウザ全体がダウンしてしまいます。「重労働」を別のプロセスに分割し、プラグイン コードを非常にスリムに保つことで、ユーザーをこのようなクラッシュから保護することができます。

この子プロセス レンダラー アーキテクチャを MacOSX で保持したいのですが、MacOSX ではプロセスがそのウィンドウへのアクセスを別のプロセスに渡すことを許可していないという (Google Chrome Web ブラウザーに関連する) 嫌な噂を耳にしました。 . この分野での私自身の調査は決定的ではありませんでした。誰かがこの問題について何らかの知識を持っていて、この目標を達成する方法についてアドバイスを提供できるか、より決定的な「実行できない」場合は、非常に役に立ちます。

ご協力ありがとうございました!

4

3 に答える 3

10

私はほぼ1年前にこれに対する解決策を調査していました。Apple メーリング リストでいくつかのスレッドを開始しました。

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

opengl プロセス ウィンドウのスクリーン グラブを取得し、それをビットマップに変換してメイン プロセス ウィンドウに表示する CGWindowListCreateImage を使用するソリューションに戻す必要がありました。これは、ピクセル データがビデオ RAM からシステム RAM に転送されるため、効率的とは言えません。

また、フローティング ウィンドウ ソリューションも試しました。OpenGL プロセス ウィンドウは、メイン プロセス ウィンドウの上に浮かび、メイン ウィンドウからのマウスの動きに応答します。しかし、ラグとウィンドウの z オーダーのドラッグに問題がありました。

NSWindowSharingReadWrite は必要なことを行うと思うかもしれませんが、当時の文書/例は実際には存在しませんでした。

しかし、おそらく昨年は状況が変わったのでしょう。何か新しいものを見つけたら、私に知らせてください!

幸運を

JC

于 2009-04-16T10:07:06.933 に答える
6

Appleの開発チームから受け取った全体的な回答は次のとおりです。

MacOSX 10.5 以前では、OpenGL レンダリング コンテキストを別のプロセスのウィンドウにアタッチするのと同じくらいクリーンなこれを行う方法は基本的にありません。人々が開発したハックは、そのような場合の最善の解決策かもしれません.

MacOS 10.6 に最も近いのは IOSurface システムです。10.6でそれを使用するのが最もクリーンなソリューションのようです。レンダリング先プロセスでのクリックをレンダリング プロセスでインターセプトする場合は、イベントを自分でまとめて、最も適切な方法を使用してレンダリング プロセスに渡す必要があります。

IOSurface の詳細については、この StackOverflow エントリを参照してください。

于 2009-11-12T21:11:49.083 に答える
4

あるプロセスのウィンドウは、別のプロセスによって書き込むことができます。これは、NSWindowSharingTypeがに設定されている場合のようですNSWindowSharingReadWrite。それはLeopardで追加されました。私はこれを自分で使用したことはありませんが、少なくとも「できない」障害を取り除くことができると思います;-)

于 2009-02-28T08:09:24.213 に答える