少なくともモニターのリフレッシュレートと同じリフレッシュレートでOpengGLを使用して描画する必要があるアプリに取り組んでいます。また、描画が激しいUIアクションによってロックされないように、別のスレッドで描画を実行する必要があります。
実はとNSOpenGLView
組み合わせて使っておりCVDisplayLink
、問題なく60-80FPSを達成することができます。
このビューの上にいくつかのココアコントロールも表示する必要があるため、 LayerBackedOpenGLView Appleの例NSOpenGLView
に従って、サブクラス化してレイヤーバックにしようとしました。
結果は満足のいくものではなく、多くのアーティファクトが発生します。
NSWindow
したがって、ココアコントロールをホストするために別のウィンドウを使用し、このウィンドウをを含むメインウィンドウの子ウィンドウとして追加することで問題を解決しましたNSOpenGLView
。それは正常に動作し、最初の実装とまったく同じFPSを取得できます。
私はこのソリューションを汚いハックのように考えているので、必要なものを達成するための代替のよりクリーンな方法を探しています。
数日前に出くわしNSOpenGLLayer
、それが私の問題の実行可能な解決策として使用できると思いました。
最後に、このすべての前文の後に、私の質問があります:コールバックNSOpenGLLayer
を使用して別のスレッドからに描画することは可能ですCVDisplayLink
か?
CVDisplayLink
これまでこれを実装しようとしましたが、コールバックから引き出すことができません。-setNeedsDisplay:TRUE
コールバックNSOpenGLLayer
からのみ実行でき、 cocoaによって自動的に呼び出されたときにCVDisplayLink
描画を実行できます。-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
でも、このようにメインスレッドから描いていると思いますよね?
これをグーグルで調べた後、私はこの投稿を見つけました。この投稿では、Lionの下での描画は内部でのみ発生する可能性があるとユーザーが主張しています-drawInOpenGLContext:pixelFormat:forLayerTime:displayTime:
。
私は現在SnowLeopardを使用していますが、アプリはLionでも問題なく動作するはずです。
私は何かが足りないのですか?