0

I want to have a window which is like QuickTime X window. An all opaque window with rounded corners.

I've obtained it implementing a custom borderless NSWindow with:

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

and a custom NSView with:

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

It works as expected but the window becomes noticeably slow when it gets resized fast.

I've identified that this slowdown is given by -setOpaque:NO; if I remove that line, the window can be resized fast again but corners are obviously no more rounded.

Is there a way to avoid using -setOpaque:NO and still be able to have rounded corners? Maybe one can have a window which is all opaque except for the corners?

The view is a NSOpenGLView so I can leverage on OpenGL if it may helps.

4

3 回答 3

0

请参阅此 Apple 开发人员示例:https ://developer.apple.com/library/mac/#samplecode/RoundTransparentWindow/Introduction/Intro.html

于 2012-05-23T14:43:46.647 回答
0

在 Quartz/Core Graphics 中,不透明矩形比不透明矩形合成得更快。但是不透明的窗口意味着您需要绘制一个矩形,而您未填充的任何内容都是黑色的。

如果您想要一个不是锐边矩形的自定义窗口,则必须将窗口设置为不透明。

无论如何,这几乎可以肯定,而不是您的主要瓶颈。

首先是停止在 drawRect 中做这么多事情:使 NSBezierPath 成为一个属性。只有在矩形实际改变大小时才更换它。仅在 viewWillDraw: 或更早的时候这样做。可能是视图或窗口之一调整大小 NSNotifications 或委托方法。

在 drawRect: 中,你应该尽可能地只做真正的绘图。你应该尽可能地只重绘你需要的东西。

这仍然很小,可能不是您的瓶颈。您需要检查窗口中所有视图中的绘图。

您的窗口实际上是您可以在 OS X 上访问的根 CGContext(绘图上下文)。上下文中的所有内容都是您的所有子视图。每个子视图都是潜在的绘图瓶颈。

在实时调整窗口大小期间绘制 OpenGL 视图听起来像是主要候选者。您可能会在实时调整视图或窗口大小期间限制帧速率或其他内容。这应该让它更活泼一点。

除此之外,您会从 NSWindow 和 NSView 类中注意到,在实时调整大小期间不绘制是性能上的胜利。

请参阅 NSView 类文档,特别是在管理实时调整大小部分中提到的方法

  • 实时调整大小
  • 保留ContentDuringLiveResize
  • getRectsExposedDuringLiveResize:count:
  • rectPreservedDuringLiveResize
  • viewWillStartLiveResize
  • viewDidEndLiveResize

最后两个看起来像是减少绘画的好地方,

于 2014-04-08T03:53:48.290 回答
-1

尝试使用 NSWindow 的 setAlphaValue 方法。

于 2012-02-29T10:03:02.290 回答