フレームバッファ
フレームバッファは、ディスプレイに表示する1画面分(1フレーム)の画像データを一時的に格納する
メモリ領域です。
概要
Playdateの開発におけるフレームバッファ(Frame Buffer)は、画面に表示される内容を保持するメモリ領域であり、その特殊なハードウェア構成(
1-bit ディスプレイ)により、非常にユニークな構造を持っています。
1. 基本仕様
Playdateのディスプレイは「
Sharp Memory LCD」を採用しており、低消費電力で高い視認性を持ちますが、色の表現は1ビット(白と黒のみ)に限定されています。
- 解像度: 400 × 240 ピクセル
- 色深度: 1ビット(1ピクセル = 1ビット)
- リフレッシュレート: 標準30fps、最大50fps
2. メモリレイアウトとデータ構造
C言語APIなどでフレームバッファを直接操作する場合、そのメモリ配置を理解する必要があります。
- ビットの極性
- アライメントとストライド (Stride)
- 各行は32ビット(4バイト)境界でアライメントされています。
- 1行は400ピクセル(400ビット = 50バイト)ですが、アライメントのために52バイト(416ビット)確保されます
- 末尾の2バイト(16ビット)は未使用データとして無視されます
- エンディアン (Byte Order)
- Playdateのフレームバッファでは "MSB-first" となります(最上位ビットが左端のピクセル)
- 例えば、あるバイトの 0x80(1000 0000)がセットされていれば、その行の最初のピクセルが白になります
3. フレームバッファの操作 (C API)
Lua APIではシステムが自動で管理しますが、C APIでは playdate->graphics->getFrame() を使用してバッファのポインタを直接取得し、高速な描画が可能です。
- 主要な関数
- getFrame(): 現在のディスプレイフレームバッファへのポインタを返します
- markUpdatedRows(start, end): バッファを書き換えた後、どの行を更新したかをシステムに通知します。これにより、変更があった部分のみが物理ディスプレイに転送され、パフォーマンスが向上します
- display->flush(): 通常はフレームの最後に自動で呼ばれますが、手動でバッファの内容を画面に反映させる際に使用します
4. 描画の最適化とテクニック
1ビットという制限の中で豊かな表現を行うため、以下の手法が一般的です。
- ディザリング (Dithering)
- グレーの階調を表現するために、白と黒のドットを特定のパターンで配置します。
- SDKには標準でディザリングパターンが含まれています。
- Dirty Rows (部分更新)
- 画面全体を書き換えるのではなく、変化があった行(Row)だけをシステムに通知することで、CPU負荷と電力消費を抑えます。
- ビット演算の活用
- 1ピクセルが1ビットであるため、複数のピクセルをまとめて(32ビット単位など)ビット演算(AND, OR, XOR)で処理することで、非常に高速な画像合成が可能です。
関連ページ
最終更新:2026年04月21日 06:33