Fixed minor issues and reduced memory allocations when creating memorystreams

This commit is contained in:
Albin Corén 2018-01-10 09:48:33 +01:00
parent eb4df1ab61
commit 0d099c83b2
4 changed files with 54 additions and 39 deletions

View File

@ -7,6 +7,6 @@ namespace MLAPI
{ {
public int ClientId; public int ClientId;
public GameObject PlayerObject; public GameObject PlayerObject;
public List<NetworkedObject> OwnedObjects; public List<NetworkedObject> OwnedObjects = new List<NetworkedObject>();
} }
} }

View File

@ -269,7 +269,11 @@ namespace MLAPI
} }
else else
{ {
using (MemoryStream writeStream = new MemoryStream()) int sizeOfStream = 32;
if (NetworkConfig.ConnectionApproval)
sizeOfStream += 2 + NetworkConfig.ConnectionData.Length;
using (MemoryStream writeStream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(writeStream)) using (BinaryWriter writer = new BinaryWriter(writeStream))
{ {
@ -280,7 +284,7 @@ namespace MLAPI
writer.Write(NetworkConfig.ConnectionData); writer.Write(NetworkConfig.ConnectionData);
} }
} }
Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_RELIABLE_FRAGMENTED", writeStream.ToArray()); Send(clientId, "MLAPI_CONNECTION_REQUEST", "MLAPI_RELIABLE_FRAGMENTED", writeStream.GetBuffer());
} }
} }
break; break;
@ -342,7 +346,6 @@ namespace MLAPI
if(targeted) if(targeted)
{ {
List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId]; List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId];
Debug.Log(handlerIds.Count);
for (int i = 0; i < handlerIds.Count; i++) for (int i = 0; i < handlerIds.Count; i++)
{ {
MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData); MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData);
@ -720,9 +723,11 @@ namespace MLAPI
{ {
if(NetworkConfig.HandleObjectSpawning) if(NetworkConfig.HandleObjectSpawning)
{ {
if (connectedClients[clientId].PlayerObject != null)
Destroy(connectedClients[clientId].PlayerObject); Destroy(connectedClients[clientId].PlayerObject);
for (int i = 0; i < connectedClients[clientId].OwnedObjects.Count; i++) for (int i = 0; i < connectedClients[clientId].OwnedObjects.Count; i++)
{ {
if (connectedClients[clientId].OwnedObjects[i] != null)
Destroy(connectedClients[clientId].OwnedObjects[i].gameObject); Destroy(connectedClients[clientId].OwnedObjects[i].gameObject);
} }
} }
@ -731,13 +736,13 @@ namespace MLAPI
if (isServer) if (isServer)
{ {
using (MemoryStream stream = new MemoryStream()) using (MemoryStream stream = new MemoryStream(4))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
writer.Write(clientId); writer.Write(clientId);
} }
Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray(), clientId); Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer(), clientId);
} }
} }
} }
@ -761,7 +766,24 @@ namespace MLAPI
GameObject go = SpawnManager.SpawnPlayerObject(clientId, networkId); GameObject go = SpawnManager.SpawnPlayerObject(clientId, networkId);
connectedClients[clientId].PlayerObject = go; connectedClients[clientId].PlayerObject = go;
} }
using (MemoryStream writeStream = new MemoryStream())
int sizeOfStream = 4 + 4 + ((connectedClients.Count - 1) * 4);
int amountOfObjectsToSend = 0;
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{
if (pair.Value.ServerOnly)
continue;
else
amountOfObjectsToSend++;
}
if(NetworkConfig.HandleObjectSpawning)
{
sizeOfStream += 4;
sizeOfStream += 13 * amountOfObjectsToSend;
}
using (MemoryStream writeStream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(writeStream)) using (BinaryWriter writer = new BinaryWriter(writeStream))
{ {
@ -776,23 +798,10 @@ namespace MLAPI
} }
if (NetworkConfig.HandleObjectSpawning) if (NetworkConfig.HandleObjectSpawning)
{ {
int amountOfObjectsToSend = 0;
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{
if (pair.Value.ServerOnly)
continue;
else
amountOfObjectsToSend++;
}
writer.Write(amountOfObjectsToSend); writer.Write(amountOfObjectsToSend);
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects) foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{ {
if (pair.Value.ServerOnly)
continue;
else
amountOfObjectsToSend++;
if (pair.Value.ServerOnly) if (pair.Value.ServerOnly)
continue; continue;
writer.Write(pair.Value.isPlayerObject); writer.Write(pair.Value.isPlayerObject);
@ -802,11 +811,17 @@ namespace MLAPI
} }
} }
} }
Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_RELIABLE_FRAGMENTED", writeStream.ToArray()); Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_RELIABLE_FRAGMENTED", writeStream.GetBuffer());
} }
//Inform old clients of the new player //Inform old clients of the new player
using (MemoryStream stream = new MemoryStream())
if(NetworkConfig.HandleObjectSpawning)
sizeOfStream = 13;
else
sizeOfStream = 4;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -822,7 +837,7 @@ namespace MLAPI
writer.Write(clientId); writer.Write(clientId);
} }
} }
Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray(), clientId); Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer(), clientId);
} }
} }
else else

View File

@ -70,7 +70,7 @@ namespace MLAP
lastSendTime = Time.time; lastSendTime = Time.time;
lastSentPos = transform.position; lastSentPos = transform.position;
lastSentRot = transform.rotation; lastSentRot = transform.rotation;
using (MemoryStream writeStream = new MemoryStream()) using (MemoryStream writeStream = new MemoryStream(24))
{ {
using (BinaryWriter writer = new BinaryWriter(writeStream)) using (BinaryWriter writer = new BinaryWriter(writeStream))
{ {
@ -81,7 +81,7 @@ namespace MLAP
writer.Write(transform.rotation.y); writer.Write(transform.rotation.y);
writer.Write(transform.rotation.z); writer.Write(transform.rotation.z);
} }
SendToServerTarget("MLAPI_OnRecieveTransformFromClient", "MLAPI_POSITION_UPDATE", writeStream.ToArray()); SendToServerTarget("MLAPI_OnRecieveTransformFromClient", "MLAPI_POSITION_UPDATE", writeStream.GetBuffer());
} }
} }
@ -145,7 +145,7 @@ namespace MLAP
transform.position = new Vector3(xPos, yPos, zPos); transform.position = new Vector3(xPos, yPos, zPos);
transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot)); transform.rotation = Quaternion.Euler(new Vector3(xRot, yRot, zRot));
} }
using (MemoryStream writeStream = new MemoryStream()) using (MemoryStream writeStream = new MemoryStream(24))
{ {
using(BinaryWriter writer = new BinaryWriter(writeStream)) using(BinaryWriter writer = new BinaryWriter(writeStream))
{ {
@ -156,7 +156,7 @@ namespace MLAP
writer.Write(yRot); writer.Write(yRot);
writer.Write(zRot); writer.Write(zRot);
} }
SendToNonLocalClientsTarget("MLAPI_OnRecieveTransformFromServer", "MLAPI_POSITION_UPDATE", writeStream.ToArray()); SendToNonLocalClientsTarget("MLAPI_OnRecieveTransformFromServer", "MLAPI_POSITION_UPDATE", writeStream.GetBuffer());
} }
} }
} }

View File

@ -84,12 +84,12 @@ namespace MLAPI.NetworkingManagerComponents
if (!spawnedObjects.ContainsKey(networkId) || !netManager.NetworkConfig.HandleObjectSpawning) if (!spawnedObjects.ContainsKey(networkId) || !netManager.NetworkConfig.HandleObjectSpawning)
return; return;
GameObject go = spawnedObjects[networkId].gameObject; GameObject go = spawnedObjects[networkId].gameObject;
if (netManager.isServer) if (netManager != null && netManager.isServer)
{ {
releasedNetworkObjectIds.Push(networkId); releasedNetworkObjectIds.Push(networkId);
if (!spawnedObjects[networkId].ServerOnly) if (spawnedObjects[networkId] != null && !spawnedObjects[networkId].ServerOnly)
{ {
using (MemoryStream stream = new MemoryStream()) using (MemoryStream stream = new MemoryStream(4))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -97,13 +97,13 @@ namespace MLAPI.NetworkingManagerComponents
} }
//If we are host, send to everyone except ourselves. Otherwise, send to all //If we are host, send to everyone except ourselves. Otherwise, send to all
if (netManager.isHost) if (netManager.isHost)
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray(), -1); netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer(), -1);
else else
netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray()); netManager.Send("MLAPI_DESTROY_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer());
} }
} }
} }
if (destroyGameObject) if (destroyGameObject && go != null)
MonoBehaviour.Destroy(go); MonoBehaviour.Destroy(go);
spawnedObjects.Remove(networkId); spawnedObjects.Remove(networkId);
} }
@ -139,8 +139,8 @@ namespace MLAPI.NetworkingManagerComponents
spawnedObjects.Add(netId, netObject); spawnedObjects.Add(netId, netObject);
netObject.isSpawned = true; netObject.isSpawned = true;
if (clientOwnerId != null) if (clientOwnerId != null)
netObject.OwnerClientId = (int)clientOwnerId; netObject.OwnerClientId = clientOwnerId.Value;
using (MemoryStream stream = new MemoryStream()) using (MemoryStream stream = new MemoryStream(13))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) using (BinaryWriter writer = new BinaryWriter(stream))
{ {
@ -151,9 +151,9 @@ namespace MLAPI.NetworkingManagerComponents
} }
//If we are host, send to everyone except ourselves. Otherwise, send to all //If we are host, send to everyone except ourselves. Otherwise, send to all
if (netManager.isHost) if (netManager.isHost)
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray(), -1); netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer(), -1);
else else
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray()); netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer());
} }
} }
} }