ゲーム エンジン (Unity) から Android フォンに UDP を介して画面を共有できるようにするコードに取り組んでいます。
このプロセスは、実際にはスクリーンショットを撮り、それらを jpeg バイト配列にデコードし、それらのバイト配列を複数のパッケージに分割するだけです (必要な場合)。
プロジェクトを実行すると、実際には画像が送信されますが、受信時に歪んだり、めちゃくちゃになったりするものがあります。
そのため、バッファ サイズを少しいじってみたところ、受信 UDP クライアントのバッファ サイズを大きくすると、実際にデータの損失や破損が改善されることがわかりました。しかし、残念なことに、ユーザーが無視できない破損したデータがまだ多すぎます。
しばらくすると、ホスト (私の電話) がクラッシュします。これはパッケージのバッファサイズと関係があると思いますが、フラッディングを超えたのでしょうか?
とにかく、ここに接続を処理するコードがあります。現在、データを一方向(コンピューター -> 電話)でのみ送信していますが、電話からコンピューターに他の情報も送信するように設定されています(ただし、これは後で行うため、最初にこれを機能させる必要があります)。
public void OpenConnection(string hostname, int bufferSize, int port = 12005)
{
ep1 = new IPEndPoint(IPAddress.Any, port);
receiveThread = new Thread(new ThreadStart((delegate
{
receiveClient = new UdpClient();
receiveClient.Client.ReceiveBufferSize = bufferSize;
receiveClient.ExclusiveAddressUse = false;
receiveClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
receiveClient.Client.Bind(ep1);
while(true)
{
try
{
byte[] buffer = receiveClient.Receive(ref ep1);
if(buffer != null && onDataReceived != null) onDataReceived(buffer);
}
catch(Exception ex)
{
Debug.Log("Error: " + ex.ToString());
}
}
})));
sendClient = new UdpClient();
sendClient.Client.SendBufferSize = bufferSize;
sendClient.ExclusiveAddressUse = false;
sendClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
ep2 = new IPEndPoint(IPAddress.Parse(hostname), port);
sendClient.Client.Bind(ep1);
receiveThread.Start();
}
public void SendData(byte[] data)
{
if(sendClient != null){
try
{
sendClient.Send(data, data.Length, ep2);
}
catch(Exception ex)
{
Debug.Log("error: " + ex.ToString());
}
}
}
現在、変数bufferSize
を に設定しており、スライスされた画像データ パッケージは、合計サイズがish20.000
のシリアル化されたクラス (フレーム ID、パッケージ ID、画像データなど)です。15.200
UDP の結果はわかっていますが、できる限りレイテンシを低くする必要があります。TCP に切り替える必要がありますか? 現在の画像サイズは、青色の背景にいくつかの粒子がある立方体の画像をテストしているだけです。より複雑な画像をストリーミングすると、JPEG 圧縮ファイルも増加すると思います。
ありがとう!