アットウィキロゴ

Display Buffer

Playdateのディスプレイバッファは、そのユニークなハードウェア仕様(Sharp Memory LCD)を反映した非常にストレートな構造をしています。


1. 基本スペック

解像度
400 x 240 ピクセル
色深度
1ビット(1ピクセル = 1ビット)。0 が黒、1 が白です
リフレッシュレート
標準 30 fps(最大 50 fpsまで設定可能)

2. メモリレイアウト(Strideの罠)

C APIなどで直接バッファを操作する場合、最も重要なのが「行ごとのバイト数(Stride)」です。
  • 論理的な幅: 400 ピクセル ÷ 8 ビット = 50 バイト
  • 物理的な幅(Stride):52 バイト
Playdateのメモリは行ごとに 52 バイト確保されています。400 ビット(50 バイト)の画像データの後に、16 ビット(2 バイト)のパディングが存在します。
このパディングを無視して 50 バイトごとに改行処理を書くと、画面が斜めにズレて崩れる(いわゆるスキュー現象)が発生します。*** 3. バッファへのアクセス方法
C API (最も低レイヤー)
playdate->graphics->getFrame() を呼び出すことで、現在のフレームバッファへのポインタ(uint8_t*)を直接取得できます。Rustなどで自作エンジンを書く場合もここを叩くことになります。
uint8_t* frame = pd->graphics->getFrame();
// (x, y) の位置のバイトを特定する式
int index = y * 52 + (x / 8);
 
Lua SDK API
Luaでは直接ポインタをいじることはできませんが、playdate.graphics.getDisplayImage() を使うことで、現在の画面の状態を playdate.graphics.image オブジェクトとして取得できます。

4. Dirty Rectangles(汚染矩形)による最適化

Playdateの描画システムは、毎フレーム全画面を書き換えるのではなく、「変化があった場所だけを更新する」という仕組み(Dirty Rectangles)を持っています。
  • スプライトを動かすと、その「移動前」と「移動後」の領域が自動的に「Dirty(汚染)」としてマークされます。
  • sprite.update() 実行時、システムはこのDirtyな領域だけを再描画して、ディスプレイに転送します。
これによって、CPU負荷と消費電力を大幅に削減できます。

5. 注意点:反転(Inverted)処理

Playdateのディスプレイは、メモリ上の 1 が「白」として表示されますが、playdate.display.setInverted(true) を呼ぶことで論理的に反転させることが可能です。

また、液晶の特性上、「前のフレームの残像」はほぼありませんが、1ビット特有のディザリング(網点)を多用すると、激しい動きの際に視認性が落ちることがあります。バッファをいじる際は、この「物理的な見え方」も考慮する必要があります。

関連ページ

最終更新:2026年04月22日 13:54