【问题标题】:Programmatically-created NSWindow slow to resize以编程方式创建的 NSWindow 调整大小很慢
【发布时间】:2017-03-24 02:31:50
【问题描述】:

如果我手动创建NSWindow

NSWindow* window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 600, 500)
                                               styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable
                                                 backing:NSBackingStoreBuffered defer:YES];

...然后与 Storyboard 中的窗口相比,调整它的大小很慢且滞后。为什么?

【问题讨论】:

    标签: macos cocoa nswindow


    【解决方案1】:

    给窗口的内容视图一层:

    window.contentView.wantsLayer = YES;
    

    这是情节提要窗口的默认设置:

    【讨论】:

    • 为什么调整大小会更快?你会认为这实际上会增加开销。
    • 当一个非图层支持的窗口被调整大小时,应用程序将其内容重绘到窗口服务器提供的缓冲区中——除了最小的窗口之外的所有未压缩图像数据的兆字节。调整图层支持窗口的大小可能只涉及更改组成窗口的图层的属性——将标题栏背景拉伸到新的宽度、设置此按钮的位置等——同时保留它们现有的内容。
    • 发挥它对内存使用的影响也很有趣。当窗口尽可能小时,具有非层支持窗口的示例应用程序使用 14MB,当窗口是我的 MBP 屏幕的全尺寸时,使用 53MB。当我使窗口层支持时,无论窗口大小如何,它都保持在 14MB(因为不需要单独表示纯灰色背景的每个像素)。
    • 令人着迷。我记得当打开 layer-backing 时有可能破坏某些窗口元素的显示。
    猜你喜欢
    • 2015-03-17
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多