feat : 서버 로직 성능개선 / 결과 정리
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using LiteNetLib;
|
||||
using MMOserver.Game.Channel.Maps;
|
||||
|
||||
namespace MMOserver.Game.Channel;
|
||||
@@ -10,6 +11,9 @@ public class Channel
|
||||
// 채널 내 유저 상태 (hashKey → Player)
|
||||
private Dictionary<long, Player> connectUsers = new Dictionary<long, Player>();
|
||||
|
||||
// 채널 내 유저 NetPeer (hashKey → NetPeer) — BroadcastToChannel 교차 조회 제거용
|
||||
private Dictionary<long, NetPeer> connectPeers = new Dictionary<long, NetPeer>();
|
||||
|
||||
public int ChannelId
|
||||
{
|
||||
get;
|
||||
@@ -33,19 +37,27 @@ public class Channel
|
||||
ChannelId = channelId;
|
||||
}
|
||||
|
||||
public void AddUser(long userId, Player player)
|
||||
public void AddUser(long userId, Player player, NetPeer peer)
|
||||
{
|
||||
connectUsers[userId] = player;
|
||||
connectPeers[userId] = peer;
|
||||
UserCount++;
|
||||
}
|
||||
|
||||
public void RemoveUser(long userId)
|
||||
{
|
||||
connectUsers.Remove(userId);
|
||||
connectPeers.Remove(userId);
|
||||
UserCount--;
|
||||
}
|
||||
|
||||
// 채널 내 모든 유저의 hashKey 반환
|
||||
// 재연결(WiFi→LTE 등) 시 동일 유저의 peer 교체
|
||||
public void UpdatePeer(long userId, NetPeer peer)
|
||||
{
|
||||
connectPeers[userId] = peer;
|
||||
}
|
||||
|
||||
// 채널 내 모든 유저의 hashKey 반환 (채널 입장 시 기존 플레이어 목록 조회용)
|
||||
public IEnumerable<long> GetConnectUsers()
|
||||
{
|
||||
return connectUsers.Keys;
|
||||
@@ -57,6 +69,12 @@ public class Channel
|
||||
return connectUsers.Values;
|
||||
}
|
||||
|
||||
// 채널 내 모든 NetPeer 반환 — BroadcastToChannel 전용 (sessions 교차 조회 불필요)
|
||||
public IEnumerable<NetPeer> GetConnectPeers()
|
||||
{
|
||||
return connectPeers.Values;
|
||||
}
|
||||
|
||||
// 특정 유저의 Player 반환
|
||||
public Player? GetPlayer(long userId)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
namespace MMOserver.Game.Channel;
|
||||
using LiteNetLib;
|
||||
|
||||
namespace MMOserver.Game.Channel;
|
||||
|
||||
public class ChannelManager
|
||||
{
|
||||
@@ -37,12 +39,12 @@ public class ChannelManager
|
||||
return channels;
|
||||
}
|
||||
|
||||
public void AddUser(int channelId, long userId, Player player)
|
||||
public void AddUser(int channelId, long userId, Player player, NetPeer peer)
|
||||
{
|
||||
// 유저 추가
|
||||
connectUsers.Add(userId, channelId);
|
||||
// 채널에 유저 추가
|
||||
channels[channelId].AddUser(userId, player);
|
||||
// 채널에 유저 + peer 추가
|
||||
channels[channelId].AddUser(userId, player, peer);
|
||||
}
|
||||
|
||||
public bool RemoveUser(long userId)
|
||||
|
||||
@@ -68,7 +68,7 @@ public class GameServer : ServerBase
|
||||
{
|
||||
// 더미 클라다.
|
||||
ChannelManager cm = ChannelManager.Instance;
|
||||
cm.AddUser(1, hashKey, new Player());
|
||||
cm.AddUser(1, hashKey, new Player(), peer);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -134,7 +134,8 @@ public class GameServer : ServerBase
|
||||
|
||||
if (channelId >= 0)
|
||||
{
|
||||
// 재연결: 채널 유저 목록 전송 (채널 선택 스킵, 바로 마을로)
|
||||
// 재연결: Channel 내 peer 참조 갱신 후 채널 유저 목록 전송
|
||||
cm.GetChannel(channelId).UpdatePeer(hashKey, peer);
|
||||
SendIntoChannelPacket(peer, hashKey);
|
||||
}
|
||||
else
|
||||
@@ -263,16 +264,12 @@ public class GameServer : ServerBase
|
||||
// ============================================================
|
||||
|
||||
// 특정 채널의 모든 유저에게 전송 (exclude 지정 시 해당 피어 제외)
|
||||
// Channel이 NetPeer를 직접 보유하므로 sessions 교차 조회 없음
|
||||
private void BroadcastToChannel(int channelId, byte[] data, NetPeer? exclude = null, DeliveryMethod method = DeliveryMethod.ReliableOrdered)
|
||||
{
|
||||
Channel.Channel channel = ChannelManager.Instance.GetChannel(channelId);
|
||||
foreach (long userId in channel.GetConnectUsers())
|
||||
foreach (NetPeer targetPeer in channel.GetConnectPeers())
|
||||
{
|
||||
if (!sessions.TryGetValue(userId, out NetPeer? targetPeer))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (exclude != null && targetPeer.Id == exclude.Id)
|
||||
{
|
||||
continue;
|
||||
@@ -330,7 +327,7 @@ public class GameServer : ServerBase
|
||||
PlayerId = (int)(hashKey & 0x7FFFFFFF),
|
||||
};
|
||||
|
||||
cm.AddUser(packet.ChannelId, hashKey, newPlayer);
|
||||
cm.AddUser(packet.ChannelId, hashKey, newPlayer, peer);
|
||||
Log.Debug("[GameServer] INTO_CHANNEL HashKey={Key} ChannelId={ChannelId}", hashKey, packet.ChannelId);
|
||||
|
||||
// 접속된 모든 유저 정보 전달
|
||||
|
||||
Reference in New Issue
Block a user