描画バッファ
描画バッファについて
NSWindowの作成の時など、backingという引数がついているが、これはなんだろうか?
今は画面を描画するのに、GPUに書くべき命令を渡して、後はよろしく!って感じなんだろうけれど、その昔NeXTの時代、にはGPUの性能が高くなくてCPUが直接書き込んでいた。
徐々にグラフィック周りの性能が高くなっていって、描画をお任せできるようになっていった。
全部直接描く(NSBackingStoreNonretained )->必要なところだけ直接描く(NSBackingStoreRetained)->全部お任せ!(NSBackingStoreBuffered)という流れになっていった。
だから、現在(更新時点)ではNSBackingStoreBufferedでOK
enum { NSBackingStoreRetained = 0, NSBackingStoreNonretained = 1, NSBackingStoreBuffered = 2 }; typedef NSUInteger NSBackingStoreType;
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
サンプルコード
//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