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 GameObject PlayerObject;
public List<NetworkedObject> OwnedObjects;
public List<NetworkedObject> OwnedObjects = new List<NetworkedObject>();
}
}

View File

@ -269,7 +269,11 @@ namespace MLAPI
}
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))
{
@ -280,7 +284,7 @@ namespace MLAPI
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;
@ -342,7 +346,6 @@ namespace MLAPI
if(targeted)
{
List<int> handlerIds = MessageManager.targetedMessages[messageType][targetNetworkId];
Debug.Log(handlerIds.Count);
for (int i = 0; i < handlerIds.Count; i++)
{
MessageManager.messageCallbacks[messageType][handlerIds[i]](clientId, incommingData);
@ -720,10 +723,12 @@ namespace MLAPI
{
if(NetworkConfig.HandleObjectSpawning)
{
Destroy(connectedClients[clientId].PlayerObject);
if (connectedClients[clientId].PlayerObject != null)
Destroy(connectedClients[clientId].PlayerObject);
for (int i = 0; i < connectedClients[clientId].OwnedObjects.Count; i++)
{
Destroy(connectedClients[clientId].OwnedObjects[i].gameObject);
if (connectedClients[clientId].OwnedObjects[i] != null)
Destroy(connectedClients[clientId].OwnedObjects[i].gameObject);
}
}
connectedClients.Remove(clientId);
@ -731,13 +736,13 @@ namespace MLAPI
if (isServer)
{
using (MemoryStream stream = new MemoryStream())
using (MemoryStream stream = new MemoryStream(4))
{
using (BinaryWriter writer = new BinaryWriter(stream))
{
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);
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))
{
@ -776,23 +798,10 @@ namespace MLAPI
}
if (NetworkConfig.HandleObjectSpawning)
{
int amountOfObjectsToSend = 0;
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{
if (pair.Value.ServerOnly)
continue;
else
amountOfObjectsToSend++;
}
writer.Write(amountOfObjectsToSend);
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{
if (pair.Value.ServerOnly)
continue;
else
amountOfObjectsToSend++;
if (pair.Value.ServerOnly)
continue;
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
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))
{
@ -822,7 +837,7 @@ namespace MLAPI
writer.Write(clientId);
}
}
Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray(), clientId);
Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer(), clientId);
}
}
else

View File

@ -70,7 +70,7 @@ namespace MLAP
lastSendTime = Time.time;
lastSentPos = transform.position;
lastSentRot = transform.rotation;
using (MemoryStream writeStream = new MemoryStream())
using (MemoryStream writeStream = new MemoryStream(24))
{
using (BinaryWriter writer = new BinaryWriter(writeStream))
{
@ -81,7 +81,7 @@ namespace MLAP
writer.Write(transform.rotation.y);
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.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))
{
@ -156,7 +156,7 @@ namespace MLAP
writer.Write(yRot);
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)
return;
GameObject go = spawnedObjects[networkId].gameObject;
if (netManager.isServer)
if (netManager != null && netManager.isServer)
{
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))
{
@ -97,13 +97,13 @@ namespace MLAPI.NetworkingManagerComponents
}
//If we are host, send to everyone except ourselves. Otherwise, send to all
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
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);
spawnedObjects.Remove(networkId);
}
@ -139,8 +139,8 @@ namespace MLAPI.NetworkingManagerComponents
spawnedObjects.Add(netId, netObject);
netObject.isSpawned = true;
if (clientOwnerId != null)
netObject.OwnerClientId = (int)clientOwnerId;
using (MemoryStream stream = new MemoryStream())
netObject.OwnerClientId = clientOwnerId.Value;
using (MemoryStream stream = new MemoryStream(13))
{
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 (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
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.ToArray());
netManager.Send("MLAPI_ADD_OBJECT", "MLAPI_RELIABLE_FRAGMENTED", stream.GetBuffer());
}
}
}