[附图]用户列表的实现纠正[新手必看]

因为看到有人在群里面讨论用户列表的实现, 虽然一个简单的用户列表。但说法各异,在此就写一个简单的思路教程吧。推荐FMS应用的新手必看

用户列表,相信很多应用都会用到。像FMS经常做的聊天室, 网络游戏都有用户列表。虽然用户列表看似简单,但实现却不简单。 在此我先把错误的思路及方法说下吧

很多新手做用户列表都是用非常简单的方式。 建立一个数组 连入用户时.push这个数组并且把这个数组广播给客户端,断开用户的时候。找到数组中的位置splice掉。 然后又把这个数组广播给客户端。 这个方法虽然能行,但却是大错特错的方法。除非是小应用还可以用下,用这方法别想做大应用。问题在哪?  我下面来分析

问题就出在数据量上面,这样来考虑。如果是一个2000人在线的应用,那这个用户列表就相当于长度2000的数组。如果随便1个人进进出出就相当于广播了2000次左右。如果这个数组记录的仅仅是人名还问题不大,但如果还有其他数据。那可想而知...一进一出就刷2000人的长度2000的数据量,是多么可怕的数据量....相当于发送了2000*2000的数据量

那如何解决呢?就是建立用户列表映射。看以下思路. 同样还是2000人的应用
服务端同样用数组。 当用户登录时只向该用户发送长2000数组(在此分清,是只向登录者这1个人发送并不是向2000人广播这数组)  这样就把用户列表映射到登录者客户端。服务端push后这时候再广播登录者信息(注意,在此指的是广播登录者的单独的单元信息比如用户名而不是广播整个数组。) 客户端在收到这个单独信息的时候也做push。 当用户退出的时候服务端做splice处理,处理完后记录splice的数组指针即可。 然后广播这个指针。客户端同步映射根据这个指针做splice处理。(而不是把整个数组的广播扔给客户端)  这就是整个映射过程。

这样就相当于只向1个人(登录者)发送了2000长度的数组。而广播的仅仅是要push的信息和删除的ID 而不是向所有用户发送整个数组。这样2000人的应用效率就降低成了1/2000。

我现在用FMS开发的RPG游戏及以之前开发IU富亨及IU猜谜屋。包括以前开发的14款棋牌游戏都是用的这方法。
具体的代码开发工作比较忙就不再单独写了,只要看懂思路后会发现非常简单。

同理在开发网络游戏中这样的情况很多见了,为了降低网络流量很多地方都得做数据印射(客户端和服务端各持一份)。比如游戏中的地图数据组,装备数据组等等。并且映射后不影响数据安全,客户端只管显示。核心判断还是在服务端。所以就算映射后在客户端被用户修改那也只是修改他自身的显示而不影响其他正常用户的显示。


今天附上一张图片说明,如果图片过宽显示不完全。请另存后看。



[本日志由 admin 于 2010-07-20 02:01 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags:
相关日志:
评论: 0 | 引用: 0 | 查看次数: 176
发表评论
你没有权限发表评论!