アットウィキロゴ

フレームバッファ

フレームバッファは、ディスプレイに表示する1画面分(1フレーム)の画像データを一時的に格納するメモリ領域です。


概要

Playdateの開発におけるフレームバッファ(Frame Buffer)は、画面に表示される内容を保持するメモリ領域であり、その特殊なハードウェア構成(1-bit ディスプレイ)により、非常にユニークな構造を持っています。
1. 基本仕様
Playdateのディスプレイは「Sharp Memory LCD」を採用しており、低消費電力で高い視認性を持ちますが、色の表現は1ビット(白と黒のみ)に限定されています。
  • 解像度: 400 × 240 ピクセル
  • 色深度: 1ビット(1ピクセル = 1ビット)
  • リフレッシュレート: 標準30fps、最大50fps

2. メモリレイアウトとデータ構造
C言語APIなどでフレームバッファを直接操作する場合、そのメモリ配置を理解する必要があります。
ビットの極性
  • 1:白 (White)
  • 0:黒 (Black)
アライメントとストライド (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