2017-10-18 24 views
0

J'essaye de faire un prototype de réseau pour une application de type livre à colorier que je développe et qui permet aux utilisateurs de créer une image puis d'envoyer cette image à un serveur qui prend ensuite l'image et l'enveloppe autour d'un maillage instancié. Mon problème initial dans cette itération est la taille du tampon. Je reçois l'erreur:NetworkWriter WriteBytes: le buffer est trop grand

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() 

Comment augmenter la taille du tampon? Mes images seront dans la gamme 1.5-2mb. Jusqu'à présent, mon code est le suivant:

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

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

Code côté serveur:

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); 
    } 
} 

code côté client:

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"); 
    } 
} 

Répondre

1

Vous devez configurer une configuration personnalisée via la mise en NetworkManager.connectionConfig à un objet ConnectionConfig que vous avez configuré pour avoir une taille de paquet plus grande. L'exemple de code doit vous aider à démarrer:

+0

Où puis-je indiquer le type de canal à utiliser lorsque j'envoie le message? – greyBow

+0

connectionConfig est une propriété en lecture seule. cela ne semble pas fonctionner pour le moment. – greyBow

+0

@greyBow La documentation ne dit pas que c'est en lecture seule. Je ne l'ai jamais utilisé, tout ce que j'ai c'est la documentation. – Draco18s