概要
- MacBookのノッチ付きディスプレイ でのフルスクリーンゲーム描画問題の解説
- CGDisplayCopyAllDisplayModes APIの仕様と問題点
- ゲーム開発者・ユーザー が取るべき対策
- 主要な 影響タイトル と正しい解決策の紹介
- Appleが改善すべき点 と今後の提案
MacBookのノッチ付きディスプレイでのフルスクリーンゲーム描画問題
- Appleノッチ付きMacBook では、ゲームがフルスクリーン時に 誤った解像度 で描画される現象
- 多くのゲームが CGDisplayCopyAllDisplayModes で取得した最初の解像度を採用しがち
- この最初の解像度は 画面全体(ノッチ含む) であり、実際に描画可能な範囲(ノッチ下)とは異なる
- 結果として 縦方向が圧縮され、ぼやけた表示 になる問題
- AppKitやCatalyst でフルスクリーンゲームを開発する場合、 解像度選択に注意 が必要
ノッチ付きディスプレイのレイアウトの仕組み
- 3つの領域 に注意
- ディスプレイ全体領域 :ノッチやメニューバーを含む
- セーフエリア(safe area) :ノッチ直下の領域、NSScreenの safeAreaInsets で取得可能
- フルスクリーンアプリ領域 :メニューバー直下から下端まで
- CGDisplayCopyAllDisplayModes は
- ディスプレイ全体 と メニューバー下の領域 両方の解像度を返却
- リスト内で混在 しており、区別する手段が標準では用意されていない
- 多くのゲームが リストの最初の解像度 (全体領域)を選び、 描画領域と一致せず 画面が潰れる
具体的な問題例
- Shadow of the Tomb Raider :3456 x 2234(ノッチ含む)で起動、実際に描画可能なのは3456 x 2160(ノッチ下)
- 74ピクセルの高さ差 が画像の圧縮・ぼやけの原因
- safeAreaInsets はセーフエリアのみを示すため、 フルスクリーン領域と完全一致しない
- 正しい解像度選択 には工夫が必要
解決策・ワークアラウンド
- ゲームユーザーは 16:10解像度 を選ぶことを推奨
- 開発者向けには safeAreaInsetsを利用しつつ、より広い解像度をフィルタリング する方法を提案
- 例:NSScreen拡張による safeAreaResolutions メソッド
- safeArea内に収まる解像度のみを抽出するロジック(下記サンプルコード参照)
extension NSScreen {
func safeAreaResolutions() -> Array<CGDisplayMode> {
let screenResolution = frame
let safeAreaInset = safeAreaInsets
let safeScreenResolution = CGSize(
width: screenResolution.size.width - (safeAreaInset.left + safeAreaInset.right),
height: screenResolution.size.height - (safeAreaInset.top + safeAreaInset.bottom)
)
let safeAreaAspectRadio = safeScreenResolution.width / safeScreenResolution.height
let screenNumber = deviceDescription[NSDeviceDescriptionKey.init("NSScreenNumber")] as! CGDirectDisplayID
guard let resolutions = CGDisplayCopyAllDisplayModes(screenNumber, nil) as? Array<CGDisplayMode> else {
fatalError()
}
return resolutions.filter { resolution in
(CGFloat(resolution.width)/CGFloat(resolution.height)) > safeAreaAspectRadio
}
}
}
- この方法では 4:3解像度 など一部が除外される副作用あり
- 根本解決はAppleによる対応が必要
影響を受ける主なゲームタイトル
- 影響あり
- Shadow of the Tomb Raider :デフォルトで潰れた解像度
- Control Ultimate Edition :独自の解像度リストを生成、ネイティブ解像度が選べない
- No Man’s Sky :潰れた解像度が初期値、両方の解像度が混在
- Riven :潰れた解像度が初期値
- Stray :16:10でない解像度が初期値
- 正しく動作
- Cyberpunk 2077 :16:10(例:1728×1080)でデフォルト起動、最大解像度も正しい
- World of Warcraft :レガシーAPI利用でノッチ領域まで描画可能、正しい解像度
Appleへの改善要望と今後の提案
- HIG(Human Interface Guidelines)の更新
- ノッチ・解像度選択問題を明記し、ベストプラクティスを提示
- Game Porting Toolkitサンプルの改善
- CGDisplayMode APIの拡張
- フルスクリーンCocoaアプリ向けの解像度のみをフィルタ可能に
- ゲーム向け新APIの開発
- ハードコード解像度リストの回避推奨
- コントロールのような一律リストは非推奨、 実際の描画領域に合わせて動的生成 が理想
- レンダースケール 設定のような柔軟なアプローチも選択肢
まとめ
- ノッチ付きMacBook でのフルスクリーンゲームは 解像度選択に注意 が必要
- ユーザー・開発者双方 が正しい設定や実装方法を知ることが重要
- Appleによる公式対応・ガイドライン更新 が根本解決への鍵