在SignalR

时间:2015-05-30 16:50:46

标签: signalr

我正在使用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);

我对第一个问题的关注是,它会每次都将序列化。关于第二个,我不知道它是如何在幕后工作的。

这两种方法都有效,但我对性能感到担忧,并试图找到最佳实践。或者我可以使用哪种方法?

1 个答案:

答案 0 :(得分:0)

正如你所说,每次枚举客户端列表序列化消息(并将这些序列化消息存储在内部缓冲区等)。如果消息相同,则这是不必要的CPU \内存开销。 Clients.Clients(ids)只对消息进行一次序列化,因此非常有效。

消息传递逻辑不是很简单,我无法通过使用组来处理它。例如,一条消息将传递给用户,其中一些自定义属性等于某个动态值。

小组在扩展方案中开箱即用,如果您发现自己需要扩展,这将是一个巨大的好处。所以也许试着找到一些简化“群体分配逻辑”的方法,即使以向一些客户提供一些消息和“过滤”客户端的成本为代价......