0

QuickTime X ウィンドウのようなウィンドウが必要です。丸みを帯びた角を持つ完全に不透明な窓。

カスタムボーダレスNSWindowを実装して取得しました:

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];

そしてカスタムNSView

- (void)drawRect:(NSRect)rect
{
    NSBezierPath* thePath = [NSBezierPath bezierPath];
    [thePath appendBezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
    [thePath fill];
}

期待どおりに機能しますが、ウィンドウのサイズが速く変更されると、ウィンドウが著しく遅くなります。

私は、この速度低下が によって与えられることを確認しました-setOpaque:NO。その行を削除すると、ウィンドウのサイズを再びすばやく変更できますが、コーナーは明らかに丸くなりません。

使用を避け、-setOpaque:NO角を丸くする方法はありますか? コーナー以外はすべて不透明なウィンドウを作成できますか?

ビューは であるNSOpenGLViewため、役立つ場合は OpenGL を活用できます。

4

3 に答える 3

0

Quartz/Core Graphics では、不透明な四角形は不透明でない四角形よりも合成が高速です。ただし、不透明なウィンドウは、長方形を描く必要があり、塗りつぶしていないものはすべて黒くなることを意味します。

エッジの鋭い長方形ではないカスタム ウィンドウが必要な場合は、ウィンドウを不透明に設定する必要があります。

とにかく、これはほぼ間違いなく、主なボトルネックではありません。

まず最初に、drawRect で多くのことを行うのをやめます。その NSBezierPath をプロパティにします。rect が実際にサイズを変更している場合にのみ置き換えてください。viewWillDraw: またはそれ以前のポイントでのみ実行してください。おそらく、ビューまたはウィンドウのいずれかが NSNotifications またはデリゲート メソッドのサイズを変更します。

drawRect: では、可能な限り実際に描画のみを行う必要があります。必要なものだけをできるだけ再描画する必要があります。

これはまだ小さく、おそらくボトルネックにはなりません。ウィンドウ内のすべてのビューで図面を調べる必要があります。

ウィンドウは、実際には OS X でアクセスできるルート CGContext (描画コンテキスト) です。コンテキスト内のすべてがすべてのサブビューです。すべてのサブビューは、描画のボトルネックになる可能性があります。

ウィンドウのライブ サイズ変更中の OpenGL ビューの描画は、最有力候補のように思えます。ビューまたはウィンドウのライブ サイズ変更中に、フレーム レートまたは何かを調整する場合があります。これで少しはきつくなるはずです。

さらに、ライブ サイズ変更中に描画しない NSWindow および NSView クラスから、パフォーマンスが向上することに気付くでしょう。

NSView クラスのドキュメントを参照してください。具体的には、「ライブ サイズ変更の管理」セクションに記載されているメソッドを参照してください。

  • inLiveResize
  • preservesContentDuringLiveResize
  • getRectsExposedDuringLiveResize:count:
  • rectPreservedDuringLiveResize
  • viewWillStartLiveResize
  • viewDidEndLiveResize

最後の 2 つは、描画の削減を挟むのに最適な場所のように見えますが、

于 2014-04-08T03:53:48.290 に答える
0

この Apple 開発者の例を参照してください: https://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html

于 2012-05-23T14:43:46.647 に答える
-1

NSWindow の setAlphaValue メソッドを使用してみてください。

于 2012-02-29T10:03:02.290 に答える