RakNet バックエンドの比較
bedrock-protocol は UDP 低レイヤプロトコル RakNet の実装を差し替え可能にしており、3つのバックエンドから選択できます。デフォルトは raknet-native で、インストールが失敗した場合はフォールバックとして jsp-raknet が自動選択されます(src/rak.js 参照)。
一覧比較
| raknet-native | jsp-raknet | raknet-node | |
|---|---|---|---|
| 実装言語 | C++ | JavaScript(Node.js) | Rust |
| 作者 | extremeheat | JSPrismarine / extremeheat | b23r0 |
| npm パッケージ名 | raknet-native | jsp-raknet | raknet-node |
| 最新バージョン | 1.2.3 (2023) | 2.2.0 (2022) | 0.5.0 (2022) |
| プレビルド | あり(64bit Win/Linux/macOS) | 不要(純 JS) | あり |
| ビルドツール必要? | C++ コンパイラ + CMake(プレビルド失敗時) | 不要 | Rust コンパイラ(プレビルド失敗時) |
| パフォーマンス | ★★★ 最速(ネイティブバイナリ) | ★ 低速(純 JS) | ★★ 中速(Rust JNI) |
| Worker モード | — | クライアントのみ(useRaknetWorker) | — |
| 安定性 | 既定値・汎用 | 非推奨("not stable" — jsp-raknet README) | 代替案 |
| ウィルス誤検知 | 稀に(ネイティブバイナリのため) | なし | なし |
各バックエンドの詳細
raknet-native(C++ 実装) — 既定値
C++ で書かれた node-raknet-native のビンドリングです。64ビットの Windows / Linux / macOS 用にプレビルドバイナリが配布されており、通常は npm install でそのまま使います。
- 利点: 最も高速。UDP ソケット操作がネイティブスピードで、接続数が多いサーバーに向く
- 注意: プレビルドが利用できないプラットフォーム(ARM、32bit 等)では C++ コンパイラ + CMake が必要
- ウィルス誤検知: Windows Defender がネイティブバイナリを誤検知するケースがある(FAQ参照)
js
// 明示的に指定する場合(既定値なので省略も可)
const client = bedrock.createClient({
raknetBackend: 'raknet-native', // 既定値
// ...
})jsp-raknet(純 JavaScript 実装) — フォールバック
JSPrismarine/RakNet による完全な JavaScript 実装です。ネイティブバイナリを一切使わないため、ビルドツール不要で全プラットフォームで動作します。
- 利点: インストールが最も簡単。ビルドツール不要。サーバー側の Worker モードは未実装だが、クライアント側は
useRaknetWorker: trueでメインスレッド負荷を軽減可能 - 注意: README に "This is not stable" と明記されている。ネイティブ実装に比べてパフォーマンスが低く、高負荷環境では問題が出やすい
- 利用場面: プレビルドが使えない環境、ビルドツールが用意できないコンテナ、簡易的な接続テスト
js
// フォールバック先
const client = bedrock.createClient({
raknetBackend: 'jsp-raknet',
useRaknetWorker: true, // クライアント: Worker で RakNet 処理を分離
// ...
})自動フォールバック
raknetBackend を指定しない(既定値)場合、raknet-native の読み込みに失敗すると自動的に jsp-raknet にフォールバックし、コンソールにデバッグメッセージが出ます。確実にネイティブを使いたい場合は明示的に指定してください。
raknet-node(Rust 実装)
b23r0/rust-raknet の Node.js バインドです。Rust で書き直されたバイナリをネイティブリンクします。
- 利点: Rust の安全性と性能の中間。C++ コンパイラが不要で Cargo ベース
- 注意: 2021 年以降の更新が限定的(最新 v0.5.0、2021年10月)。他の2つと同等の互換性テストが不足している可能性がある
- 利用場面: C++ ビルド環境を避けつつネイティブ性能が必要な場合
js
const client = bedrock.createClient({
raknetBackend: 'raknet-node',
// ...
})選択ガイド
| 状況 | 推奨バックエンド |
|---|---|
| 本番環境・サーバー運用 | raknet-native |
| ローカル開発・テスト | raknet-native(既定値) |
| ARM / 32bit / ビルドツールなし | jsp-raknet |
| ボット数が少ない(10未満) | jsp-raknet でも十分 |
| Rust 環境がある + C++ 不要にしたい | raknet-node |
| Cloud Functions / ブラウザ(将来) | jsp-raknet 以外は使えない |
パフォーマンスの目安
- クライアント(ボット): 接続 1 台だけならバックエンドの違いは体感ほぼなし。10 台以上の接続管理になるとネイティブの差が出ます
- サーバー: 接続数が 10 を超えると
raknet-nativeが安定。20 以上はjsp-raknetでは不具合報告のリスクがあります