2017-10-18 3 views
0

Ich versuche, ein Stück Vernetzung für ein Malbuch Typ Anwendung, die ich entwickle, die Benutzer ein Bild erstellen können und dann das Bild an einen Server senden, der dann das Bild erstellt und wickelt es um ein instanziiertes Netz. Mein anfängliches Problem bei dieser Iteration ist die Puffergröße. Ich erhalte den Fehler:NetworkWriter WriteBytes: Puffer ist zu groß

NetworkWriter WriteBytes: buffer is too large (699064) bytes. The maximum buffer size is 64K bytes. 
UnityEngine.Networking.NetworkWriter:WriteBytesFull(Byte[]) 
TextureMessage:Serialize(NetworkWriter) 
UnityEngine.Networking.NetworkServer:SendToAll(Int16, MessageBase) 
Server:SendTexture(Texture2D, String) (at Assets/Scripts/Server.cs:32) 
Server:SendOnButtonPress() (at Assets/Scripts/Server.cs:19) 
UnityEngine.EventSystems.EventSystem:Update() 

Wie vergrößere ich die Puffergröße? Meine Bilder werden im Bereich 1,5-2mb liegen. Mein Code so weit ist wie folgt:

public class MyMsgType 
{ 
    public static short texture = MsgType.Highest + 1; 
} 

public class TextureMessage : MessageBase 
{ 
    public byte[] textureBytes; 
    public string message; //Optional 
} 

Server-Side-Code:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.Networking; 

public class Server : MonoBehaviour { 

    public Texture2D textureToSend; 
    string messageToSend = "Test Message"; 

    // Use this for initialization 
    void Start() { 
     NetworkManager.singleton.StartHost(); 
     Debug.Log("Server Started."); 
    } 

    public void SendOnButtonPress() 
    { 
     SendTexture(textureToSend, messageToSend); 
    } 

    //Call to send the Texture and a simple string message 
    public void SendTexture(Texture2D texture, string message) 
    { 
     TextureMessage msg = new TextureMessage(); 

     //Convert Texture2D to byte array 

     msg.textureBytes = texture.GetRawTextureData(); 
     msg.message = message; 

     NetworkServer.SendToAll(MyMsgType.texture, msg); 
    } 
} 

clientseitigen Code:

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEngine.Networking; 

public class Client : MonoBehaviour 
{ 
    NetworkClient myClient; 

    // Use this for initialization 
    void Start() { 
     NetworkManager.singleton.StartClient(); 
     Debug.Log("Client Started."); 

     setupClient(); 
    } 

    // Create a client and connect to the server port 
    public void setupClient() 
    { 
     //Create new client 
     myClient = new NetworkClient(); 
     //Register to connect event 
     myClient.RegisterHandler(MsgType.Connect, OnConnected); 
     //Register to texture receive event 
     myClient.RegisterHandler(MyMsgType.texture, OnTextureReceive); 

     //Connect to server 
     myClient.Connect("127.0.0.1", 4444); 
    } 

    //Called when texture is received 
    public void OnTextureReceive(NetworkMessage netMsg) 
    { 
     TextureMessage msg = netMsg.ReadMessage<TextureMessage>(); 

     //Your Received message 
     string message = msg.message; 
     Debug.Log("Texture Messsage " + message); 

     //Your Received Texture2D 
     Texture2D receivedtexture = new Texture2D(4, 4); 
     receivedtexture.LoadRawTextureData(msg.textureBytes); 
     receivedtexture.Apply(); 
    } 

    public void OnConnected(NetworkMessage netMsg) 
    { 
     Debug.Log("Connected to server"); 
    } 
} 

Antwort

1

Sie benötigen eine benutzerdefinierte Konfiguration über die Einstellung NetworkManager.connectionConfig einrichten zu einem ConnectionConfig Objekt, das Sie eingerichtet haben, um eine größere Paketgröße zu haben. Der Beispielcode sollte Ihnen den Anfang geben:

void Start() 
{ 
    ConnectionConfig myConfig = new ConnectionConfig(); 
    myConfig.AddChannel(QosType.Unreliable); 
    myConfig.AddChannel(QosType.UnreliableFragmented); 
    myConfig.PacketSize = 1440; 
    NetworkManager.connectionConfig = myConfig; 
} 
+0

Wo sage ich welchen Kanaltyp zu verwenden, wenn ich die Nachricht tatsächlich sende? – greyBow

+0

connectionConfig ist eine schreibgeschützte Eigenschaft. das scheint momentan nicht zu funktionieren. – greyBow

+0

@greyBow Die Dokumentation sagt nicht, dass es nur gelesen wird. Ich habe es nie benutzt, also habe ich nur die Dokumentation. – Draco18s