我正在使用SignalR开发实时多人游戏。消息传递逻辑不是很简单,我无法通过使用组来处理它。
例如,一条消息将传递给用户,其中一些自定义属性等于某个动态值。这意味着
无法处理目标听众Clients.All
Clients.AllExcept
我有一个这样的映射类:
public class Player
{
public dynamic Client { get; set; }
public string ConnectionId { get; set; }
public string Name { get; set; }
}
不知怎的,我确实检测到了List对象中的所有受众。
向列表中的每个人发送消息的最佳方式是什么?枚举列表并调用
foreach (var loopPlayer in players)
{
player.Client.sendMessage(message);
}
或
List<string> ids = new List<string>();
foreach (var loopPlayer in players)
{
ids.Add(item.ConnectionId.ToString());
}
Clients.Clients(ids).sendMessage(message);
我对第一个问题的关注是,它会每次都将序列化。关于第二个,我不知道它是如何在幕后工作的。
这两种方法都有效,但我对性能感到担忧,并试图找到最佳实践。或者我可以使用哪种方法?
答案 0 :(得分:0)
正如你所说,每次枚举客户端列表序列化消息(并将这些序列化消息存储在内部缓冲区等)。如果消息相同,则这是不必要的CPU \内存开销。
Clients.Clients(ids)
只对消息进行一次序列化,因此非常有效。
消息传递逻辑不是很简单,我无法通过使用组来处理它。例如,一条消息将传递给用户,其中一些自定义属性等于某个动态值。
小组在扩展方案中开箱即用,如果您发现自己需要扩展,这将是一个巨大的好处。所以也许试着找到一些简化“群体分配逻辑”的方法,即使以向一些客户提供一些消息和“过滤”客户端的成本为代价......