상세 해설 - 스트리밍 바이트

목차

Photon Bolt는 대량의 데이터를 전송하는 데 사용할 수 있는 스트리밍 기능을 내장하고 있으며 일반 상태 전송 절차와 함께 작동합니다. 예를 들어 이미지, 사전, 지도 정보, 인벤토리 목록과 같은 직렬화된 데이터를 보내야 하는 경우 일반적인 Bolt 상태 속성은 이러한 경우에 가장 적합한 옵션이 아니므로 스트리밍이 매우 중요합니다.

설명

Bolt 스트림 시스템은 데이터를 사용하고 소비할 때 알아야 할 몇 가지 핵심 요소가 있습니다. 여기서는 나중에 스트리밍 구조를 설정하기 위한 아규먼트로 변환되는 설정에 대해 설명합니다.

  • 스트림 채널: 스트림 시스템은 다른 채널과 병렬로 데이터 블록을 주고받는 데 기본적으로 사용할 수 있는 식별 가능한 구조인 스트림 채널을 기반으로 합니다. 이를 통해 다양한 종류의 데이터를 전송하기 위해 특정 채널을 사용할 수 있는 매우 다재다능하고 강력한 시스템을 구축할 수 있습니다.
  • 채널 이름: 각 스트림 채널은 유일한 이름으로 구별되며, 디버깅 시에 매우 유용할 수 있습니다.
  • 채널 모드: 새로운 채널을 생성할 때, 유형 중 하나를 선택할 수 있습니다:
  • 비 신뢰: 이 유형의 채널은 원-파이어 동작을 사용하여 데이터 블록을 전송합니다. 즉, 다른 쪽 끝에는 도착한다는 보장이 없습니다. 또한 볼트 패킷 크기보다 큰 데이터는 보낼 수 없기 때문에 더 제한적입니다.
    • 신뢰: 이 유형으로 생성된 채널은 모든 크기의 데이터 블록을 보낼 수 있으며, 또한 데이터 블록의 무결성을 보장하고, 필요한 경우 데이터를 재전송하여 전체 정보가 목적지에 도착하도록 보장합니다.
  • 채널 우선순위: 각 채널은 다른 우선순위 순서로 구성할 수 있습니다. 즉, 특정 채널이 다른 채널보다 데이터를 전송할 때 더 먼저 전송한다는 의미입니다. 이 기능은 낮은 전송률과 더 중요한 다른 채널이 동시에 정보를 전송해야 하는 경우에 유용할 수 있습니다. 우선순위 번호가 클수록 중요도가 높아집니다.
  • 연결 대역 포: 스트림 시스템의 또 다른 중요한 측면은 데이터 스트리밍에 전용 대역폭을 얼마나 사용하는지에 대한 것입니다. 이 값은 연결당 쉽게 변경할 수 있으며 기본적으로 초당 전송되는 최대 바이트 수로 구성됩니다.

메인 화면으로

스트림 시스테 API

볼트 스트림 시스템은 BoltNetwork 클래스를 통해 주로 액세스할 수 있는 일부 다른 API로 구성되며 함께 작동하는 다른 개체에 대한 콜백 및 메소드를 제공합니다. 스트리밍이 제공할 수 있는 대부분의 기능을 얻으려면 이 API를 인식하는 것이 중요합니다.

메인 화면으로

스트림 패킷 크기 변경

Bolt SDK v1.3부터는 기본 스트림 패킷 크기를 기본 크기인 4096바이트에서 원하는 크기로 변경할 수 있습니다. 이 작업은 다음과 같이 BoltRuntimeSettings 내에 있는 BoltConfig 참조에서 기본값을 변경하여 수행할 수 있습니다.

public BoltConfig GetConfig
{
    get
    {
        var config = BoltRuntimeSettings.instance.GetConfigCopy();

        config.packetStreamSize = 1024; // your desired size in bytes

        return config;
    }
}

메인 화면으로

스트림 대역폭

피어 간에 데이터를 전송하는 주요 측면 중 하나는 장치당 보낼 수 있는 데이터양입니다. 이를 최대 대역폭이라고 합니다. 현재 피어에 연결된 각 BoltConnection에 대해(게임 서버의 경우 이 목록은 모든 클라이언트의 목록이며, 클라이언트는 게임 서버와의 연결입니다) 데이터를 전송하려는 최대 스트림 대역폭을 지정할 수 있습니다. 기본값은 약 80kb/s로 설정됩니다. 이 작업은 BoltConnection.StreamBandwidth을 사용하여 아래와 같이 쉽게 수행할 수 있습니다:

public class CustomStreamManager : Bolt.GlobalEventListener
{
    public override void Connected(BoltConnection connection)
    {
        // Configure this connection to send at max 20kb/s
        connection.SetStreamBandwidth(1024 * 20);
    }
}

메인 화면으로

스트림 채널 생성

스트리밍 시스템의 중심점은 Stream Channels입니다. 새 채널을 생성하려면 BoltNetwork.CreateStreamChannel 메소드를 사용해야 하고 위의 섹션에서 이미 설명한 모든 인수를 전달합니다. 나중에 확인하고 사용하려면 UdpKit.UdpChannelName 참조를 저장해야 합니다. 이 정보는 특정 정보를 전송하려는 채널을 Bolt로 보냅니다.

다음은 클라이언트와 게임 서버에 스트리밍 채널을 만드는 방법을 보여 줍니다.

public class CustomStreamManager : Bolt.GlobalEventListener
{
    private const string VoiceChannelName = "Voice";
    private const string RandomChannelName = "RandomChannelName";

    private static UdpKit.UdpChannelName Voice;
    private static UdpKit.UdpChannelName RandomChannel;

    public override void BoltStartBegin()
    {
        // Creating a Unreliable channel with priority 1
        Voice = BoltNetwork.CreateStreamChannel(VoiceChannelName, UdpKit.UdpChannelMode.Unreliable, 1);

        // Creating a Reliable channel with priority 4
        RandomChannel = BoltNetwork.CreateStreamChannel(RandomChannelName, UdpKit.UdpChannelMode.Reliable, 4);
    }
}

앞서 보신 것처럼 BoltNetwork.CreateStreamChannel은 (i) 채널 이름, (ii) 채널 신뢰성 모드 및 (iii) 채널 우선순위라는 세 가지 파라미터를 수신했습니다. 또한 UdpKit.UdpChannelName 유형의 채널 참조를 반환하며 나중에 사용할 수 있도록 액세스 가능한 변수에 저장하기만 하면 됩니다. 명심해야 할 한 가지 중요한 제한 사항은 채널은 BoltStartBegin 콜백 내에서만 생성될 수 있다는 것입니다. 그것은 Bolt가 시동할 때 모든 채널을 인지해야 하기 때문에 필요합니다.

메인 화면으로

스트림 채널 사용

채널 정의 후에는 이 기능을 사용하고 다른 BoltConnection으로 정보를 전송할 수 있는 방법을 여기에 제시합니다. 이를 위한 API는 두개의 파라미터가 필요한 BoltConnection.StreamBytes입니다.

  • UdpKit.UdpChannelName: 스트림 채널을 생성할 때 저장된 참조입니다.
  • Byte[] data: 전송할 바이트 배열입니다.

다음은 CustomStreamManager 클래스 내에 생성된 RandomChannel 채널에 대한 참조를 사용하여 이진 데이터를 게임 서버로 전송하는 예입니다.

public class CustomStreamManager : Bolt.GlobalEventListener
{
    //...
    public void SendRandomData()
    {
        byte[] data = CreateData(5);

        // Streaming bytes
        BoltNetwork.Server.StreamBytes(RandomChannel, data);
    }

    private byte[] CreateData(int size)
    {
        var data = new byte[1024 * size];
        var rand = new System.Random();

        rand.NextBytes(data);

        return data;
    }
}

거기서부터는 다른 조치를 취할 필요가 없습니다. 필요한 경우 Bolt가 정보를 조각내어 다른 엔드포인트로 보냅니다.

메인 화면으로

스트림 시스템 콜백

Bolt 스트리밍 시스템은 원격 연결로 전송되는 데이터 블록을 모니터링하고 주로 수신하는 데 사용할 수 있는 일련의 콜백 기능을 제공합니다. 다음은 이러한 각 콜백과 이러한 콜백이 서로 어떻게 관련되어 있는지에 대한 설명입니다. 평소와 마찬가지로 함수 오버라이딩을 한Bolt.GlobalEventListener 클래스를 통해 다음과 같은 모든 방법을 사용할 수 있습니다.

  • StreamDataStarted(BoltConnection connection, UdpChannelName channel, ulong streamID):새 데이터 스트림이 시작될 때 호출됩니다. 연결 원점, 전송 중인 스트림 채널 및 전송의 고유 ID에 대한 정보를 받게 됩니다.
public override void StreamDataStarted(BoltConnection connection, UdpChannelName channel, ulong streamID)
{
    BoltLog.Warn("Connection {0} is transfering data on channel {1} :: Transfer {2}...", connection, channel, streamID);
}
  • StreamDataProgress(BoltConnection connection, UdpChannelName channel, ulong streamID, float progress): 새 데이터가 수신될 때마다 호출됩니다. 또한 0에서 0.99 범위의 진행 파라미터에 액세스하여 전송 상태를 알려줍니다.
public override void StreamDataProgress(BoltConnection connection, UdpChannelName channel, ulong streamID, float progress)
{
    BoltLog.Info("[{3}%] Connection {0} is transfering data on channel {1} :: Transfer ID {2}", connection, channel, streamID, (int)(progress * 100));
}
  • StreamDataAborted(BoltConnection connection, UdpChannelName channel, ulong streamID): 전송이 중단되었을 때 호출됩니다. 원격 피어의 연결이 끊어졌거나 전송이 잘못된 경우 이 문제가 발생할 수 있습니다.
public override void StreamDataAborted(BoltConnection connection, UdpChannelName channel, ulong streamID)
{
    BoltLog.Error("Stream {0} on channel {1} from connection {2} has been aborted.", streamID, channel, connection);
}
  • StreamDataReceived(BoltConnection connnection, UdpStreamData data): 이 메서드는 전체 데이터 블록을 수신할 때마다 호출됩니다. 바이트 배열(data 필드) 및 정보 전송에 사용되는 스트림 채널(UdpKit.UdpChannelName)에서 연결 원점(BoltConnection)과 데이터 파라미터(UdpStreamData)를 호출합니다.
public override void StreamDataReceived(BoltConnection connection, UdpStreamData data)
{
    BoltLog.Info("Received data from {0} on channel {1}: {2} bytes", connection, data.Channel, data.Data.Length);
}


기술문서 TOP으로 돌아가기