読者です 読者をやめる 読者になる 読者になる

Cocoa API解説(macOS/iOS)

iOS , Mac アプリケーション開発のために使われる主要フレームワークの日本語情報です。

目次

描画バッファ

コラム ApplicationKit

INDEX>AppKit

描画バッファについて

NSWindowの作成の時など、backingという引数がついているが、これはなんだろうか?

今は画面を描画するのに、GPUに書くべき命令を渡して、後はよろしく!って感じなんだろうけれど、その昔NeXTの時代、にはGPUの性能が高くなくてCPUが直接書き込んでいた。
徐々にグラフィック周りの性能が高くなっていって、描画をお任せできるようになっていった。
全部直接描く(NSBackingStoreNonretained )->必要なところだけ直接描く(NSBackingStoreRetained)->全部お任せ!(NSBackingStoreBuffered)という流れになっていった。

だから、現在(更新時点)ではNSBackingStoreBufferedでOK



Objective-C

enum {
   NSBackingStoreRetained     = 0,
   NSBackingStoreNonretained  = 1,
   NSBackingStoreBuffered     = 2
};
typedef NSUInteger NSBackingStoreType;

Swift

enum NSBackingStoreType : UInt {
    case Retained
    case Nonretained
    case Buffered
}

【NSBackingStoreType】
● NSBackingStoreBuffered
全ての描画をバッファに描画します。
通常はこのモードを使用してください。
ハードウエアでの高速化などの恩恵が受けられます。

● NSBackingStoreRetained
バッファを使用しますが、可能な場合には直接描画します。
このモードは使用しないでください。過去のハードウエア性能が低い時期に実装されました。


● NSBackingStoreNonretained
バッファを使用せずに全てを直接描画します。
このモードを使用しないでください。過去のOSでの描画のために残されています。
なにがしかの理由でこのモードを使用する場合は描画領域を限定して描画するなどをしないと速度の低下を招きます。

参照


backingType - Cocoa API解説(iOS/OS X)


initWithContentRect:styleMask:backing:defer: - Cocoa API解説(iOS/OS X)

関連記事(外部リンク)

https://developer.apple.com/search/?q=nswindow%20buffer&platform=OS%20XHigh Resolution Guidelines for OS X
How a Window is Displayed

サンプルコード

Swift

    //NSWindow backingType
    @IBAction func function027(sender: AnyObject) {
        var aWindow : NSWindow = NSWindow(contentRect: NSMakeRect(0.0, 0.0, 300, 200), styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask, backing: .Buffered, defer: false)
        windowArray.addObject(aWindow) //ウインドウを保持するための配列に追加。アプリ終了時に配列は破棄
        aWindow.center()//ウインドウをスクリーンの中心に
        aWindow.title = "ウインドウタイトル"//タイトル設定
        aWindow.orderFront(self)//前面に
        aWindow.makeKeyAndOrderFront(self)//表示
        
        switch (aWindow.backingType){
        case NSBackingStoreType.Retained:
            NSLog("Retained")
        case .Nonretained:
            NSLog("Nonretained")
        case .Buffered:
            NSLog("Buffered")
        default:
            NSLog("None")
        }
        
    }
}

編集時のバージョン

10.10