mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 11:00:32 +00:00
NetworkIdentity.observers returns m_Observers directly without creating a new ReadOnlyCollection every time. This was a performance nightmare because we looped through observers all the time in NetworkServer.SendToObservers/SendToReady via observers[i], observers.Count, etc. Furthermore we don't even worry about ReadOnlyCollections in any other place. The user could clear and break all other collections all the time too.
This commit is contained in:
parent
a754eaac4f
commit
f2d4fac170
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UnityEditor;
|
using UnityEditor;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -80,12 +81,12 @@ public override void OnInspectorGUI()
|
|||||||
if (m_ShowObservers)
|
if (m_ShowObservers)
|
||||||
{
|
{
|
||||||
EditorGUI.indentLevel += 1;
|
EditorGUI.indentLevel += 1;
|
||||||
foreach (NetworkConnection observer in m_NetworkIdentity.observers)
|
foreach (KeyValuePair<int, NetworkConnection> kvp in m_NetworkIdentity.observers)
|
||||||
{
|
{
|
||||||
if (observer.playerController != null)
|
if (kvp.Value.playerController != null)
|
||||||
EditorGUILayout.ObjectField("Connection " + observer.connectionId, observer.playerController.gameObject, typeof(GameObject), false);
|
EditorGUILayout.ObjectField("Connection " + kvp.Value.connectionId, kvp.Value.playerController.gameObject, typeof(GameObject), false);
|
||||||
else
|
else
|
||||||
EditorGUILayout.TextField("Connection " + observer.connectionId);
|
EditorGUILayout.TextField("Connection " + kvp.Value.connectionId);
|
||||||
}
|
}
|
||||||
EditorGUI.indentLevel -= 1;
|
EditorGUI.indentLevel -= 1;
|
||||||
}
|
}
|
||||||
|
@ -161,9 +161,9 @@ public override void OnPreviewGUI(Rect r, GUIStyle background)
|
|||||||
observerRect.x += 20; // indent names
|
observerRect.x += 20; // indent names
|
||||||
observerRect.y += observerRect.height;
|
observerRect.y += observerRect.height;
|
||||||
|
|
||||||
foreach (var info in m_Identity.observers)
|
foreach (KeyValuePair<int, NetworkConnection> kvp in m_Identity.observers)
|
||||||
{
|
{
|
||||||
GUI.Label(observerRect, info.address + ":" + info.connectionId, m_Styles.componentName);
|
GUI.Label(observerRect, kvp.Value.address + ":" + kvp.Value.connectionId, m_Styles.componentName);
|
||||||
observerRect.y += observerRect.height;
|
observerRect.y += observerRect.height;
|
||||||
lastY = observerRect.y;
|
lastY = observerRect.y;
|
||||||
}
|
}
|
||||||
|
@ -114,13 +114,7 @@ internal void ForceAuthority(bool authority)
|
|||||||
public NetworkConnection connectionToServer { get { return m_ConnectionToServer; } }
|
public NetworkConnection connectionToServer { get { return m_ConnectionToServer; } }
|
||||||
public NetworkConnection connectionToClient { get { return m_ConnectionToClient; } }
|
public NetworkConnection connectionToClient { get { return m_ConnectionToClient; } }
|
||||||
|
|
||||||
public ReadOnlyCollection<NetworkConnection> observers
|
public Dictionary<int, NetworkConnection> observers { get { return m_Observers; } }
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return m_Observers != null ? new ReadOnlyCollection<NetworkConnection>(m_Observers.Values.ToList()) : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint s_NextNetworkId = 1;
|
static uint s_NextNetworkId = 1;
|
||||||
internal static NetworkInstanceId GetNextNetworkId()
|
internal static NetworkInstanceId GetNextNetworkId()
|
||||||
|
@ -224,14 +224,13 @@ static bool SendToObservers(GameObject contextObj, short msgType, MessageBase ms
|
|||||||
{
|
{
|
||||||
if (LogFilter.logDev) { Debug.Log("Server.SendToObservers id:" + msgType); }
|
if (LogFilter.logDev) { Debug.Log("Server.SendToObservers id:" + msgType); }
|
||||||
|
|
||||||
var uv = contextObj.GetComponent<NetworkIdentity>();
|
NetworkIdentity uv = contextObj.GetComponent<NetworkIdentity>();
|
||||||
if (uv != null && uv.observers != null)
|
if (uv != null && uv.observers != null)
|
||||||
{
|
{
|
||||||
bool result = true;
|
bool result = true;
|
||||||
for (int i = 0; i < uv.observers.Count; ++i)
|
foreach (KeyValuePair<int, NetworkConnection> kvp in uv.observers)
|
||||||
{
|
{
|
||||||
var conn = uv.observers[i];
|
result &= kvp.Value.Send(msgType, msg);
|
||||||
result &= conn.Send(msgType, msg);
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -273,12 +272,11 @@ public static bool SendToReady(GameObject contextObj, short msgType, MessageBase
|
|||||||
if (uv != null && uv.observers != null)
|
if (uv != null && uv.observers != null)
|
||||||
{
|
{
|
||||||
bool result = true;
|
bool result = true;
|
||||||
for (int i = 0; i < uv.observers.Count; ++i)
|
foreach (KeyValuePair<int, NetworkConnection> kvp in uv.observers)
|
||||||
{
|
{
|
||||||
NetworkConnection conn = uv.observers[i];
|
if (kvp.Value.isReady)
|
||||||
if (conn.isReady)
|
|
||||||
{
|
{
|
||||||
result &= conn.Send(msgType, msg);
|
result &= kvp.Value.Send(msgType, msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
Reference in New Issue
Block a user