ENet-CSharpのREADME和訳
このページはENet-CSharpのREADME.mdを和訳したものです。
和訳にはGPTから使い出力したmdファイルを一部私の方で修正しました。
ENet-CSharp 日本語ガイド
これは、C、C++、C# などの言語から利用できる、ENet の独立した実装です。通信プロトコルには独自の変更が加えられています。
ENet は、ゲームなどで使う UDP 通信を扱いやすくするためのライブラリです。通信相手との接続管理や、データを送受信する処理を助けてくれます。
主な特徴
- 軽量で扱いやすい
- メモリやCPUなどの使用量が少ない
- IPv4とIPv6の両方に対応
- 接続管理:通信相手との接続・切断を扱える
- 順序制御:データが届く順番を管理できる
- チャンネル:用途ごとに通信データを分けられる
- 信頼性の制御:必要に応じて、データが届くまで再送できる
- 分割と再構成:大きなデータを分割して送り、受信側で組み立てられる
- データのまとめ送り
- 通信状況への適応
- 複数の環境への移植性
実際に使い始める前に、よくある間違い(Common Mistakes) も読んでおくことをおすすめします。設定や使い方を間違えたときに起こりやすい問題が説明されています。
ビルド方法
「ビルド」とは、ソースコードなどから、実際に使えるプログラムやライブラリを作ることです。
ネイティブライブラリのビルド
利用するプラットフォームに応じて、次のツールが必要です。
- デスクトップ(Windows / Linux / macOS): CMake と GNU Make、または Visual Studio
- Android: Android NDK
- iOS: Xcode
コンパイルしたライブラリは、対象のOSだけでなく、CPUの種類にも合っている必要があります。例えば、異なるCPU向けに作られたライブラリは、そのままでは利用できないことがあります。
Nintendo Switch 向けのビルドについては、こちらのガイド を参照してください。
C#用アセンブリのビルド
C#用のアセンブリは、C# 3.0以降に対応したコンパイル環境でビルドできます。
「アセンブリ」とは、C#のプログラムをコンパイルして作る、実行や再利用のためのファイルです。
ビルド済みライブラリ
自分でビルドしなくても、次のページからビルド済みのファイルを入手できます。
パッケージには、次の種類があります。
ENet-CSharp:.NET環境向けのアセンブリとネイティブライブラリが含まれています。.NET Standard 2.1向けです。ENet-Unity:Unityで利用するためのスクリプトとネイティブライブラリが含まれています。
バージョンアップするときは、既存のバイナリ用フォルダーに新しいファイルを上書きするよりも、フォルダーをいったん削除してから新しいファイルを配置する方法が推奨されています。
ここで配布されているパッケージは、一般的なデスクトップ環境(Windows、Linux、macOS)のx64版を対象としています。
対応OSのバージョンは次のとおりです。
- Windows 7以降
- Linux 4.4以降
- macOS 10.12以降
使い方
利用を始める前に、ライブラリを初期化します。
ENet.Library.Initialize();
初期化は、ライブラリを使える状態にするための準備です。
利用が終わったら、後片付けとして次の関数を呼び出します。
ENet.Library.Deinitialize();
初期化と終了処理は、ライブラリの利用開始・終了に合わせて行ってください。
.NET環境
サーバーを起動する
次の例では、サーバーを作成し、クライアントの接続・切断や、受信したパケットを確認しています。
using (Host server = new Host()) {
Address address = new Address();
address.Port = port;
server.Create(address, maxClients);
Event netEvent;
while (!Console.KeyAvailable) {
bool polled = false;
while (!polled) {
if (server.CheckEvents(out netEvent) <= 0) {
if (server.Service(15, out netEvent) <= 0)
break;
polled = true;
}
switch (netEvent.Type) {
case EventType.None:
break;
case EventType.Connect:
Console.WriteLine("クライアント接続 - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
break;
case EventType.Disconnect:
Console.WriteLine("クライアント切断 - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
break;
case EventType.Timeout:
Console.WriteLine("クライアントがタイムアウト - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP);
break;
case EventType.Receive:
Console.WriteLine("パケット受信 - ID: " + netEvent.Peer.ID + ", IP: " + netEvent.Peer.IP + ", チャンネルID: " + netEvent.ChannelID + ", データ長: " + netEvent.Packet.Length);
netEvent.Packet.Dispose();
break;
}
}
}
server.Flush();
}
コードを見るときのポイント
Hostは、通信を管理するためのオブジェクトです。Addressには、接続先のポート番号などを設定します。EventType.Connectは接続、EventType.Disconnectは切断、EventType.Receiveはデータ受信を表します。EventType.Timeoutは、一定時間応答がなく、接続がタイムアウトしたことを表します。- 受信したパケットを使い終えたら、
Dispose()で解放します。 portやmaxClientsは、この例の前に用意しておく変数です。実際のプロジェクトに合わせて値を設定してください。
クライアントを起動する
クライアントは、サーバーのIPアドレスまたはホスト名とポート番号を指定して接続します。
using (Host client = new Host()) {
Address address = new Address();
address.SetHost(ip);
address.Port = port;
client.Create();
Peer peer = client.Connect(address);
Event netEvent;
while (!Console.KeyAvailable) {
bool polled = false;
while (!polled) {
if (client.CheckEvents(out netEvent) <= 0) {
if (client.Service(15, out netEvent) <= 0)
break;
polled = true;
}
switch (netEvent.Type) {
case EventType.None:
break;
case EventType.Connect:
Console.WriteLine("サーバーに接続しました");
break;
case EventType.Disconnect:
Console.WriteLine("サーバーから切断されました");
break;
case EventType.Timeout:
Console.WriteLine("サーバーとの接続がタイムアウトしました");
break;
case EventType.Receive:
Console.WriteLine("サーバーからパケットを受信 - チャンネルID: " + netEvent.ChannelID + ", データ長: " + netEvent.Packet.Length);
netEvent.Packet.Dispose();
break;
}
}
}
client.Flush();
}
コードを見るときのポイント
Hostはクライアント側でも使用します。address.SetHost(ip)で接続先を指定し、address.Portでポート番号を指定します。client.Connect(address)は接続を開始します。ただし、この呼び出しが終わった時点で接続完了とは限りません。接続完了はEventType.Connectのイベントで確認します。ipとportは、接続先に合わせて設定してください。
パケットを作成して送信する
「パケット」は、ネットワークで送るデータのまとまりです。次の例では、バイト配列をパケットにして送信します。
Packet packet = default(Packet);
byte[] data = new byte[64];
packet.Create(data);
peer.Send(channelID, ref packet);
dataは送信したいデータを入れる配列です。この例では64バイト分を用意しています。channelIDは送信に使うチャンネル番号です。peerは送信先の通信相手を表します。- この例では、データの内容を設定する処理は省略されています。実際に送る内容を
dataに入れてください。
パケットからデータをコピーする
受信したパケットの内容を、別のバイト配列にコピーする例です。
byte[] buffer = new byte[1024];
netEvent.Packet.CopyTo(buffer);
コピー先の配列 buffer は、受信データを格納できる大きさにしてください。
独自のメモリ管理方法を使う
通常とは異なるメモリ確保・解放の仕組みを使いたい場合は、コールバック関数を登録できます。コールバックとは、特定のタイミングでライブラリ側から呼び出してもらう関数のことです。
AllocCallback OnMemoryAllocate = (size) => {
return Marshal.AllocHGlobal(size);
};
FreeCallback OnMemoryFree = (memory) => {
Marshal.FreeHGlobal(memory);
};
NoMemoryCallback OnNoMemory = () => {
throw new OutOfMemoryException();
};
Callbacks callbacks = new Callbacks(OnMemoryAllocate, OnMemoryFree, OnNoMemory);
if (ENet.Library.Initialize(callbacks))
Console.WriteLine("独自のメモリ管理方法でENetを初期化しました");
この例は、メモリ管理を自分で制御したい場合の応用的な機能です。最初にENetを試す段階では、まず通常の初期化方法から始めるとよいでしょう。
Unityで使う場合
基本的な使い方は.NET環境とほぼ同じですが、コンソール向けの処理はUnityの機能に置き換える必要があります。
ゲームの更新処理(ゲームループ)の中で Host.Service() を呼び出す場合は、タイムアウト値を 0 にしてください。0 は「イベントがなくても待ち続けず、すぐに処理を戻す」という意味です。ゲームループの中で待ち続けると、ゲーム全体が止まってしまう可能性があります。
また、UnityのPlayer Settingsで、ゲームがバックグラウンドでも動作する設定を有効にしてください。
マルチスレッド
基本的な考え方
このライブラリを使う構成として、通信処理を専用のスレッド(I/Oスレッド)で動かし、ほかのスレッドとはメッセージを使ってデータを受け渡す方法が紹介されています。
「スレッド」は、プログラム内で処理を進める流れのことです。通信処理をゲームのメイン処理から分けると、通信の待ち時間がゲームの動作に影響しにくくなります。
スレッド間のデータ受け渡しには、ロックやミューテックスを使わずにデータをやり取りするキューなどが利用できます。例として、スレッド間メッセージングの説明 や Ring Bufferの紹介 が挙げられています。
ゲーム側の処理を複数のワーカーに分け、送受信するメッセージを通信スレッドとの間で受け渡す構成も考えられます。
スレッド利用時の注意
基本的に、ENetはスレッドセーフではありません。つまり、複数のスレッドから同じ機能を同時に使っても安全であるとは限りません。ただし、次のように条件付きで利用できる機能があります。
Packet:独自のメモリアロケーターを使っていない場合、パケットを値として別スレッドに渡す使い方ができます。Peer.ID:ネイティブ側からピアへのポインターを取得すると、IDがPeerに保存されます。同じIDに対応するオブジェクトを扱うために、Peer構造体を値として別スレッドへ渡すことはできます。ただし、別スレッドのサービス処理によってメモリ上の状態が変わることがあるため、Peerの関数がスレッドセーフになるわけではありません。Library.Time:内部でアトミック操作を利用し、単調増加するローカル時刻を管理しています。
スレッドを使う場合は、同じオブジェクトを複数スレッドから同時に操作しないよう、データの受け渡し方を設計してください。
APIリファレンス
APIリファレンスは、ライブラリで使える型・関数・プロパティの一覧です。ここでは、各項目の意味を簡単に説明します。
列挙型(Enumeration)
列挙型は、あらかじめ用意された選択肢の中から状態や設定値を選ぶための型です。
PacketFlags
Peer.Send() でパケットを送信するときに指定できるフラグです。
PacketFlags.None:順序を管理するものの、到着は保証しない送信方法です。PacketFlags.Reliable:相手に届くまで再送を試みる、信頼性を重視した送信方法です。PacketFlags.Unsequenced:ほかのパケットとの順序を管理せず、到着順が前後することがあります。到着も保証されません。PacketFlags.NoAllocate:パケット用のデータ領域をライブラリ側で確保しません。利用側でデータ領域を用意し、PacketFreeCallbackで寿命を管理する必要があります。PacketFlags.UnreliableFragmented:MTUを超えるパケットを、信頼性を保証しない形で分割して送信します。通常、大きすぎる信頼性のないパケットは、分割後に信頼性のある形で送信されます。このフラグは、分割後も信頼性を保証しないよう明示するために使います。PacketFlags.Instant:次のサービス処理までほかのパケットとまとめず、すぐに送信します。遅延を減らす代わりに、まとめて送る効率が下がる場合があります。同じパケットを複数回のPeer.Send()に使うことはできません。PacketFlags.Unthrottled:通常なら送信量の調整によって破棄される可能性がある、信頼性を保証しないパケットを、可能であれば送信します。PacketFlags.Sent:そのパケットが、登録されたすべての送信キューから送信されたことを示します。
EventType
Event.Type が返すイベントの種類です。
EventType.None:指定された時間内にイベントが発生しませんでした。EventType.Connect:Peer.Connect()で開始した接続が完了しました。Event.Peerから接続した相手を取得できます。Event.Dataには、接続時に利用者が設定したデータが入ります。設定していない場合は0です。EventType.Disconnect:通信相手が切断しました。Event.Peerから切断した相手を取得できます。Event.Dataには、設定されていれば切断時のデータが入ります。EventType.Receive:通信相手からパケットを受信しました。送信元はEvent.Peer、チャンネル番号はEvent.ChannelID、受信パケットはEvent.Packetから取得できます。受信パケットを使い終えたら、Event.Packet.Dispose()で解放してください。EventType.Timeout:通信相手との接続、または接続要求がタイムアウトしました。Event.Peerから対象の相手を取得できます。
PeerState
Peer.State が返す、通信相手との接続状態です。
PeerState.Uninitialized:まだ初期化されていません。PeerState.Disconnected:切断済み、またはタイムアウトしています。PeerState.Connecting:接続処理中です。PeerState.Connected:接続済みです。PeerState.Disconnecting:切断処理中です。PeerState.Zombie:正常な切断処理が完了していない状態です。
デリゲート(Delegate)
デリゲートは、呼び出す関数を変数のように扱うための仕組みです。ENetでは、特定の出来事が起きたときに呼び出される関数(コールバック)を登録するために使います。
メモリ関連のコールバック
アプリケーションのメモリ管理に関する通知です。
AllocCallback(IntPtr size):メモリを確保するときに呼び出されます。確保したメモリへのポインターを返します。FreeCallback(IntPtr memory):メモリを解放するときに呼び出されます。NoMemoryCallback():必要なメモリが足りないときに呼び出されます。
コールバックを登録した場合、そのデリゲートがガベージコレクションで回収されないように、参照を保持しておく必要があります。
パケット関連のコールバック
PacketFreeCallback(Packet packet):パケットが破棄されるときに呼び出されます。信頼性のあるパケットについて、相手から受信確認が返ってきたかどうかを確認する用途にも使われます。
ホスト関連のコールバック
InterceptCallback(ref Event @event, ref Address address, IntPtr receivedData, int receivedDataLength):生のUDPパケットを受信したときに呼び出されます。戻り値によって、そのイベントをどのように扱うかを指定します。1はイベントを通知する、0はENet側の通常処理に任せる、-1はエラーを表します。ChecksumCallback(IntPtr buffers, int bufferCount):送受信データのチェックサムを計算するときに呼び出されます。チェックサムは、データが壊れていないかを確認するための値です。戻り値は64ビットのチェックサムです。送信側と受信側の両方でチェックサム機能を有効にすると、ENetがパケットの整合性を確認します。ENet.Library.CRC64()を利用することもできます。
これらのコールバックも、登録後にデリゲートへの参照を保持しておく必要があります。
構造体(Structure)
構造体は、関連するデータをひとまとめに扱うための型です。
Address
接続先のホスト情報とポート番号を保持します。
Address.Port:ポート番号を取得または設定します。Address.GetIP():IPアドレスを取得します。Address.SetIP(string ip):IPアドレスを設定します。ローカルネットワーク内でIPv4ブロードキャストを使うクライアントでは、255.255.255.255を指定できます。ENetはブロードキャストに応答し、サーバーの実際のIPアドレスに更新します。Address.GetHost():アドレスからホスト名を逆引きしようとします。名前が解決できた場合はその名前、できない場合はIPアドレスを文字列で返します。Address.SetHost(string hostName):ホスト名またはIPアドレスを設定します。ネットワークインターフェースへの割り当てや、別のホストへの接続に利用できます。成功時はtrue、失敗時はfalseを返します。
Event
イベントの種類、通信相手、チャンネル番号、利用者が設定したデータ、パケットへの参照などをまとめて持ちます。
Event.Type:イベントの種類を返します。Event.Peer:接続・切断・受信・タイムアウトのイベントを発生させた相手を返します。Event.ChannelID:必要に応じて、イベントに関係するチャンネル番号を返します。Event.Data:必要に応じて、利用者が設定したデータを返します。Event.Packet:必要に応じて、イベントに関連するパケットを返します。
Packet
送受信するパケットを扱います。
Packet.Dispose():パケットを破棄します。EventType.Receiveで受信したパケットに対して呼び出してください。Packet.IsSet:パケットへの参照が設定されているかを返します。Packet.Data:パケットのデータへのポインターを返します。Packet.UserData:利用者が設定するデータを取得または設定します。Packet.Length:パケットに含まれるデータの長さを返します。Packet.HasReferences:パケットへの参照があるかを確認します。Packet.SetFreeCallback(PacketFreeCallback callback):パケットが破棄されるときに呼び出すコールバックを設定します。デリゲートの代わりに、コールバックを指すIntPtrを渡すこともできます。Packet.Create(byte[] data, int offset, int length, PacketFlags flags):送信するパケットを作成します。offsetは配列のどこからデータを使うか、lengthは何バイト使うかを指定します。各引数は省略でき、複数のフラグを同時に指定できます。バイト配列の代わりに、ネイティブ側のバッファを指すIntPtrを使うこともできます。Packet.CopyTo(byte[] destination):パケットのデータを、指定した配列へコピーします。
Peer
通信相手への参照と、キャッシュされたIDを保持します。ここでいう「ピア(peer)」は、ENetで通信する相手のことです。
Peer.IsSet:通信相手への参照が設定されているかを返します。Peer.ID:ピアのIDを返します。クライアント側では常に0です。Peer.IP:IPアドレスを文字列で返します。Peer.Port:ポート番号を返します。Peer.MTU:MTUを返します。MTUは、ネットワーク上で一度に扱えるデータの最大サイズに関係する値です。Peer.State:PeerStateで説明した接続状態を返します。Peer.RoundTripTime:往復通信時間(ミリ秒)を返します。Peer.LastRoundTripTime:最後の受信確認に関係する往復通信時間(ミリ秒)を返します。Peer.LastSendTime:最後にパケットを送信した時刻(ミリ秒)を返します。Peer.LastReceiveTime:最後にパケットを受信した時刻(ミリ秒)を返します。Peer.PacketsSent:接続中に送信したパケット数の合計を返します。Peer.PacketsLost:再送処理などの情報をもとに、失われたと判断されたパケット数を返します。Peer.PacketsThrottle:通信状況に応じた、パケット送信の調整状態を返します。Peer.BytesSent:接続中に送信したバイト数の合計を返します。Peer.BytesReceived:接続中に受信したバイト数の合計を返します。Peer.Data:利用者が設定するデータを取得または設定します。利用時には、適切な型への明示的なキャストが必要です。Peer.ConfigureThrottle(uint interval, uint acceleration, uint deceleration, uint threshold):通信相手ごとの送信量調整(スロットリング)を設定します。ENetは通信状況に応じて、信頼性を保証しないパケットを送らないことがあります。スロットリングは、そのパケットを送る確率を調整する仕組みです。intervalは通信時間を測定する期間(ミリ秒)、accelerationは送信確率を増やす量、decelerationは減らす量、thresholdは通信時間の変動に対するしきい値です。これらの値はLibrary.throttleScaleなどの定数や、通信相手との帯域幅にも関係します。decelerationを0にするとスロットリングを無効にできます。Wi-Fiなど、遅延の揺れが大きい環境で調整に利用できます。Peer.Send(byte channelID, ref Packet packet):パケットを送信キューに登録します。成功時はtrue、失敗時はfalseを返します。Peer.Receive(out byte channelID, out Packet packet):受信キューからパケットを1つ取り出そうとします。取り出せた場合はtrue、なければfalseを返します。Peer.Ping():通信相手に応答確認(ping)を送ります。ENetは通常、接続中の相手に定期的にpingを送りますが、より頻繁に確認したい場合に呼び出せます。Peer.PingInterval(uint interval):pingを送る間隔を設定します。pingは接続が生きているかの確認や、通信量が少ないときの送信量調整にも使われます。Peer.Timeout(uint timeoutLimit, uint timeoutMinimum, uint timeoutMaximum):応答がない場合にタイムアウトと判断するための設定を行います。信頼性のあるパケットへの受信確認が一定時間返らない場合、往復時間やその変動をもとに待機時間を調整します。設定された上限に達したあとも一定時間応答がない場合や、最大時間まで応答がない場合は、接続が切断されます。Peer.Disconnect(uint data):通信相手に切断を要求します。Peer.DisconnectNow(uint data):すぐに切断します。Peer.DisconnectLater(uint data):送信待ちのパケットをすべて送ったあとで切断するよう要求します。Peer.Reset():強制的に切断します。相手側には切断通知を送りません。そのため、相手側ではタイムアウトするまで接続が残っているように見える場合があります。
クラス(Class)
クラスは、データと、それを扱う処理をまとめるための仕組みです。
Host
通信を管理するホストを表します。サーバーにもクライアントにも使われます。
Host.Dispose():ホストを破棄します。Host.IsSet:ホストへの参照が設定されているかを返します。Host.PeersCount:接続中のピア数を返します。Host.PacketsSent:この通信セッションで送信したパケット数の合計を返します。Host.PacketsReceived:この通信セッションで受信したパケット数の合計を返します。Host.BytesSent:この通信セッションで送信したバイト数の合計を返します。Host.BytesReceived:この通信セッションで受信したバイト数の合計を返します。Host.Create(Address? address, int peerLimit, int channelLimit, uint incomingBandwidth, uint outgoingBandwidth, int bufferSize):通信を行うためのホストを作成します。接続を待ち受けるサーバーとして使う場合は、アドレスと接続相手の最大数を指定します。帯域幅の設定は、同時に送信中にできる信頼性のあるパケット数などに影響します。バッファサイズは、データグラムの送受信に使うソケットバッファの大きさです。待ち受けに使う場合、アドレスとピア数以外の引数は省略できるものがあります。Host.PreventConnections(bool state):新しい接続を受け付けるかどうかを設定します。接続を禁止すると、接続を試みた相手はタイムアウトします。Host.Broadcast(byte channelID, ref Packet packet, Peer[] peers):指定したピア、またはホストに関連付けられたすべてのピアへパケットを送信キューに登録します。対象配列に初期化されていないPeerがある場合、その相手には送信しません。配列の代わりに単一のPeerを渡し、その相手を送信対象から除外することもできます。Host.CheckEvents(out Event @event):待機中のイベントを確認し、あれば1つ取り出します。イベントを取り出した場合は0より大きい値、イベントがなければ0、失敗時は0より小さい値を返します。Host.Connect(Address address, int channelLimit, uint data):ほかのホストへの接続を開始します。成功すると通信相手を表すPeerを返します。失敗時は例外が発生します。戻り値を受け取っただけでは接続完了とは限らず、Host.Service()からEventType.Connectが通知されて初めて接続完了を確認できます。チャンネル数の上限や利用者データは省略できます。Host.Service(int timeout, out Event @event):ホストのイベントを確認し、パケットの送受信処理を進めます。ENetは、イベントが起きたときに通知する方式を採用しています。この関数は定期的に呼び出してください。呼び出さないと、送受信が滞り、通信遅延が大きくなることがあります。timeoutは待機する時間(ミリ秒)です。0を指定すると待たずにすぐ戻るため、ゲームループ内で呼び出す場合に適しています。Host.SetBandwidthLimit(uint incomingBandwidth, uint outgoingBandwidth):ホストの受信・送信帯域幅の上限を、1秒あたりのバイト数で設定します。Host.SetChannelLimit(int channelLimit):今後の接続で許可するチャンネル数の上限を設定します。Host.SetMaxDuplicatePeers(ushort number):同じホストから許可する重複ピア数の上限を設定します。上限を超える場合は接続を拒否します。初期値はLibrary.maxPeersで、1未満にはできません。Host.SetInterceptCallback(InterceptCallback callback):生のUDPパケットを受信したときに呼び出すコールバックを設定します。デリゲートの代わりにコールバックへのIntPtrを渡すこともできます。Host.SetChecksumCallback(ChecksumCallback callback):チェックサムを計算するときに呼び出すコールバックを設定します。デリゲートの代わりにコールバックへのIntPtrを渡すこともできます。Host.Flush():送信待ちになっているパケットを、宛先のピアへ送信します。
Library
ライブラリ全体に関係する定数や共通機能を提供します。
Library.maxChannelCount:利用できるチャンネル数の最大値です。Library.maxPeers:利用できるピア数の最大値です。Library.maxPacketSize:パケットサイズの最大値です。Library.version:ネイティブライブラリとの互換性に関係するバージョンです。Library.Time:アプリケーションが動作している間、リセットされずに進み続けるローカル時刻をミリ秒で返します。Library.Initialize(Callbacks callbacks):ネイティブライブラリを初期化します。通常は引数を省略できます。独自のメモリアロケーターを使う場合にのみ、コールバックを指定します。成功時はtrue、失敗時はfalseを返します。利用を始める前に呼び出してください。Library.Deinitialize():ネイティブライブラリを終了処理します。利用が終わったあとに呼び出してください。Library.CRC64(IntPtr buffers, int bufferCount):アンマネージドメモリ上のバッファに対してチェックサムを計算します。
サポーター
このプロジェクトは、次の企業・団体から支援を受けています。
初心者向けの補足
- サーバー:接続を待ち受け、複数のクライアントとの通信を管理する側です。
- クライアント:サーバーへ接続してサービスを利用する側です。
- UDP:通信の速さを重視した方式です。送ったデータが必ず届くとは限りません。ENetは、必要に応じて再送などの仕組みを追加できます。
- パケット:ネットワークで送るデータのまとまりです。
- チャンネル:通信データを用途ごとに分けるための番号です。
- 信頼性のある送信:データが届いたか確認し、必要に応じて再送する方式です。
- ネイティブライブラリ:CやC++などで作られ、OSやCPUに対応した形式でコンパイルされたライブラリです。
- マネージドコード:.NETの実行環境が管理するコードです。C#のコードは通常こちらに分類されます。
- アンマネージドメモリ:.NETの自動メモリ管理の外側で扱うメモリです。必要な場面以外では、初心者が直接操作する必要はありません。
和訳したGPTからのメッセージ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
この文書は、元のREADMEに書かれている内容を日本語で読みやすく整理したものです。
コード中のAPI名や定数名は、実際にプログラムで使う名前なので、原則として英語のまま残しています。
和訳したmtからのメッセージ
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
誤訳やリンク切れなどありましたら教えてください。
もともとC言語で書かれたENetをベースにC#などから利用できるように独自に実装、拡張したライブラリだそうです。
No Comments