OpengGLで描画する必要のあるアプリケーションでは、少なくともリフレッシュレートをモニタのリフレッシュレート以上にする必要があります。また、私は描画を別のスレッドで実行する必要があります。そのため、強力なUIアクションによって描画がロックされることはありません。NSOpenGLLayerとは別のスレッドから描画します
実際には私はと組み合わせてNSOpenGLView
を使用していますが、60-80FPSは問題なく使用できます。
私はこのビューの上にいくつかのココアコントロールを表示する必要があるので、NSOpenGLView
サブクラス化し、レイヤーバックにしました。LayerBackedOpenGLViewアップルの例に従います。
結果は満足のいくものではなく、多くのアーチファクトがあります。
したがって、別のNSWindow
を使用して、ココアコントロールをホストし、このウィンドウをNSOpenGLView
を含むメインウィンドウの子ウィンドウとして追加するという問題を解決しました。 それはうまく動作し、私は最初の実装と全く同じFPSを得ることができます。
私はこのソリューションを汚れたハックのように思っていますので、私は必要なものを満たすための代替的かつよりクリーンな方法を探しています。
数日前に私はNSOpenGLLayer
に出くわしました。私はそれが私の問題の実行可能な解決策として使用できると考えました。
最後に、このすべてのプリアンブルの後に、私の質問になります:コールバックを使用して別のスレッドからNSOpenGLLayer
に描画することは可能ですか。
これまで実装しようとしましたが、CVDisplayLink
コールバックから描画できません。 CVDisplayLink
コールバックからにある-setNeedsDisplay:TRUE
のみをコールし、ココアによって自動的に呼び出されるときに-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
で図面を実行します。しかし、私はこの方法でメインスレッドから描画していると思いますか?
私はこれを見つけたところで、ユーザーがの中でのみライオンの下で起こると主張する投稿をthisで見つけました。
私は現在、Snow Leopardにいますが、アプリはLionでも完璧に動作するはずです。
何か不足していますか?
ありがとうございました!現在のアプリもビデオプレーヤーです。私は、VLCがそのコントロールに子ウィンドウを使用していることを知らなかった。私はそのソースコードを見たことがない。一方、子供のウィンドウのソリューションは、iMac上で正常に動作するようだが、それは2009年のMacBookにいくつかのグラフィックの問題を与えるようだ。しかし、それらの問題が子ウィンドウや他のものに関係しているかどうかはわかりません。あなたが私の他の質問で提案した解決策を試してみましょう。もしそれがより良い性能を与えないなら、私はコントロールのために子供のウィンドウに固執します。どうもありがとうございました!! – Andrea3000
私はCVDisplayLinkと組み合わせてperformSelectorOnMainThreadを使用しました。それは素晴らしい作品です。 CATransaction .Flushを使用すると、ユーザインタラクションとフレームアニメーションを組み合わせようとすると問題が発生します。それは使用できますが、将来のすべてのコードでそれを考慮する必要があります。 performSelectorOnMainThreadメソッドを使いやすくする。ここに私とMeckiとの間のconvoと、この件に関する私の所見もあります:http://chat.stackoverflow.com/rooms/104337/opengl-on-macos-x-and-threadingまた、このMeckiに対するあなたの最終的なコメントが大好きです。再度、感謝します。 – eonist