sharp.go
← 戻る

· Sharp.go Team

エンジンの内部: sharp.goが361個の石を60fpsで描画する方法

5年前、3D検査をフル搭載した60fpsの碁盤はレンダラーにとっての夢でした。いまや午後仕事の一コマです。この記事は、私たちが始めた頃に存在してほしかった注釈付きの解説 — アーキテクチャの選択、行き止まり、そして違いを生んだ些細な詳細 — です。

課題

01

なぜこれが難しいのか

3Dエンジンに形を与えた3つの制約。

碁は線ではなく木です。どの瞬間でも、プレイヤーは何千もの別継続に分岐でき、それぞれが19×19の盤上に独自の石の幻想を抱えています。私たちは3つを同時に欲しがりました。インタラクティブな3Dカメラ、100ms未満の解析遅延、そして200手目以降でも崩れない棋譜再生です。

それぞれは単独でなら解けます。問題は、3つすべてが同じホットパス — 石が盤に置かれる瞬間 — に触れ、しかもそれぞれが異なる時間を要求することです。

着手符号化

02

21バイトのワイヤーフォーマット

コンパクトで決定論的、バージョンを超えて再生可能。

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 — エンジン信号用に予約

    取った石、コウマーカー、パスフラグ。前方互換性のため予約。

節区切り

"

バイナリフォーマットを発明しに行ったのではありません。解析を即時に感じさせるために行き、バイト数が最後に緩める最も容易な制約だと判明しました。

"

Naomi S. / リードエンジンエンジニア

レンダリングパイプライン

03

3パス、1キャンバス

順序はコストより重要。

レンダラーは厳格な3パイプラインです。パス間でソート・ブレンド・反射を行わず — 各パスは自身のテクスチャに書き込み、次のパスがそれを読みます。

Tabs

各石はPBRマテリアルを備えた単一のインスタンス化キューブ。361位置をすべてオフスクリーン盤深度テクスチャに描画。空の位置は完全にスキップし、占有位置のみインスタンス毎のトランスフォームを取得。
定常状態のフレームレート 60fps
着手フォーマットデコードのスループット 1.1GB/s
ワイヤ上の着手あたりバイト数 21B

設計判断

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か月は再生の可搬性についてです。プレイしたすべての対局が、それをプレイしたクライアントより長生きすること。

エンジンを試す

本物の3D盤で対局

インストール不要。ブラウザで対局を開き、キャリブレーション済みAIと対局し、ワンクリックで局面を共有。

"

最高の碁UIは消えるものです。見るのはアプリではなく盤です。

"

The sharp.go team / 香港、2026年5月
enginerenderingperformance