· Sharp.go Team
エンジンの内部: sharp.goが361個の石を60fpsで描画する方法
5年前、3D検査をフル搭載した60fpsの碁盤はレンダラーにとっての夢でした。いまや午後仕事の一コマです。この記事は、私たちが始めた頃に存在してほしかった注釈付きの解説 — アーキテクチャの選択、行き止まり、そして違いを生んだ些細な詳細 — です。
● 課題
01なぜこれが難しいのか
3Dエンジンに形を与えた3つの制約。
碁は線ではなく木です。どの瞬間でも、プレイヤーは何千もの別継続に分岐でき、それぞれが19×19の盤上に独自の石の幻想を抱えています。私たちは3つを同時に欲しがりました。インタラクティブな3Dカメラ、100ms未満の解析遅延、そして200手目以降でも崩れない棋譜再生です。
それぞれは単独でなら解けます。問題は、3つすべてが同じホットパス — 石が盤に置かれる瞬間 — に触れ、しかもそれぞれが異なる時間を要求することです。
● 着手符号化
0221バイトのワイヤーフォーマット
コンパクトで決定論的、バージョンを超えて再生可能。
sharp.goのすべての着手は21バイトのペイロードです。JSON、CBOR、protobufを試してから、手書きのバイナリに落ち着きました。フォーマットは十分に小さく、実戦の400手は8.4 KBに収まります — 盤の圧縮JPEGとほぼ同じサイズです。
- 01.
バイト0 — 色
黒は0x00、白は0x01。1バイト、交渉不要。
- 02.
バイト1〜2 — 座標
リトルエンディアンの2バイト: 行 (0–18) と列 (0–18)。19×19格子の361有効位置。
- 03.
バイト3〜6 — シーケンス
符号なし32ビットの着手インデックス。対局内では連番で、再生間で決定論的。
- 04.
バイト7〜10 — 壁時計タイムスタンプ
対局開始からのミリ秒。再生スクラブに使用。
- 05.
バイト11〜14 — 局面ハッシュ
32ビットZobristハッシュ。盤全体を走査せずに重複局面とスーパーコウを検出可能。
- 06.
バイト15〜20 — エンジン信号用に予約
取った石、コウマーカー、パスフラグ。前方互換性のため予約。
"
バイナリフォーマットを発明しに行ったのではありません。解析を即時に感じさせるために行き、バイト数が最後に緩める最も容易な制約だと判明しました。
"
● レンダリングパイプライン
033パス、1キャンバス
順序はコストより重要。
レンダラーは厳格な3パイプラインです。パス間でソート・ブレンド・反射を行わず — 各パスは自身のテクスチャに書き込み、次のパスがそれを読みます。
● Tabs
● 設計判断
04最初に3Dで出す理由
2Dを否定するものではなく、最初の製品の設計根拠。
● Comparison
エンジン比較
| ● Feature | sharp.go | 2Dクライアント | スマホアプリ |
|---|---|---|---|
| 3D盤面検査 | ✓ | ✗ | ✗ |
| 100ms未満のAIフィードバック | ✓ | ✗ | ✓ |
| オープンな棋譜フォーマット | ✓ | ✓ | ✗ |
| 共同レビュー | ✓ | ✗ | ✗ |
| 2クリックの共有リンク | ✓ | ✗ | ✓ |
| ブラウザのみモード | ✓ | ✗ | ✗ |
- ✓
盤全体でのインスタンス化レンダリング
361インスタンス、1ドローコール。それ以外は遅かった。
- ✓
リアルタイムではないキャッシュされた反射
5°超のカメラ移動で再描画。プレイヤーは気づかない。
- ✓
ディスク上のバイナリ着手フォーマット
コンパクトで決定論的、2026年の対局再生は2027年でも読み込める。
- ✓
一等市民のURLとしてのディープリンク
すべての局面に安定したURL。盤の共有はスクリーンショットではなくコピペ。
● よくある質問
01 なぜ局面のハッシュにZobristを使うのですか? ▾
Zobristハッシュは着手ごとにO(1)で更新でき (変更ビットをxor)、32ビット1回の比較でスーパーコウと重複局面を検出できます。19×19なら毎手盤全体走査でも問題ありませんが、サポート予定の25×25にはスケールしません。
02 別デバイスでURLから対局を再生できますか? ▾
はい。すべての対局は着手シーケンスをパスにエンコードした安定したURLを持ちます。任意のデバイス、任意のブラウザで開けば、同じ局面から再生が始まります。
03 オフラインでもAIは同じレベルで打ちますか? ▾
はい。デバイス上のAIは完全にオフラインで動作し、初期設定では初級レベルにキャリブレーションされています。メニューから上のレベルに引き上げることもでき、ネットワーク通信は不要です。
04 バイナリ着手フォーマットがパブリック仕様に文書化されていないのはなぜ? ▾
安定性のためです。フォーマットは再生互換性保証の一部です。1.0エンジンが出荷され次第、安定したv1仕様を公開します。それまでは、マイナーバージョン間で変更される可能性があります。
● 今後
05ロードマップ、約束ではない
現在取り組んでいること、予想コスト順。
これからの6か月は再生の可搬性についてです。プレイしたすべての対局が、それをプレイしたクライアントより長生きすること。
"
最高の碁UIは消えるものです。見るのはアプリではなく盤です。
"