地图服务器、视野的控制方法和系统转让专利

申请号 : CN201210210449.1

文献号 : CN103514799B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 蔡铭福丁晓成

申请人 : 腾讯科技(深圳)有限公司

摘要 :

一种地图服务器包括:用户列表获取模块,用于获取以当前用户为中心的九宫格内的用户列表;距离队列生成模块,用于获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的用户;视野列表生成模块,用于根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;距离范围越近,距离队列对应的权重越高。本发明还提供对应的视野的控制系统和方法,通过多个预设的距离范围将九宫格内用户分类到多个距离列队中,根据各个距离列队的不同权重选取部分用户视野列表,从而降低了服务器的压力。

权利要求 :

1.一种地图服务器,其特征在于,所述地图服务器包括:

用户列表获取模块,用于获取以当前用户为中心的九宫格内的用户列表;

距离队列生成模块,用于获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户;

视野列表生成模块,用于根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高;

所述视野列表生成模块还用于在距离队列中随机选取一个用户,从所述随机选取的用户开始,按照预设的选取粒度从距离队列中顺序选取用户加入视野列表中。

2.根据权利要求1所述的地图服务器,其特征在于,所述地图服务器还包括:选取名额分配模块,用于根据所述权重和预设的视野上限分配与所述距离队列对应的选取名额;

选取粒度生成模块,用于根据所述选取名额和所述距离队列中的用户数量生成选取粒度;其中,所述选取粒度为所述用户数量与所述选取名额的比值;

所述视野列表生成模块则是从所述随机选取的用户开始,按照所述选取粒度从距离队列中顺序选取对应的所述选取名额的用户加入视野列表中。

3.根据权利要求2所述的地图服务器,其特征在于,所述选取名额分配模块还用于如果所述距离队列中的用户数量少于对应的选取名额时,获取所述距离队列中的未分配名额,将所述未分配名额加入到其他距离队列对应的选取名额中。

4.根据权利要求1所述的地图服务器,其特征在于,所述视野列表生成模块还用于从所有距离队列中选取完预设数量的用户加入视野列表中后,若所述视野列表中的用户数量少于预设的视野上限,则获取剩余名额,所述剩余名额为预设的视野上限与所述视野列表中的用户数量之差;并根据所述剩余名额从距离队列中选取未被选取到的用户加入视野列表,直至所述剩余名额为零。

5.根据权利要求1所述的地图服务器,其特征在于,所述地图服务器还包括:搜索请求生成模块,用于获取当前用户所处地图位置,根据预设的搜索网格和所述当前用户所处地图位置,当所述当前用户跨越搜索网格时生成视野搜索请求;

其中,所述搜索网格的大小小于或等于所述九宫格中的格子大小;

所述用户列表获取模块响应所述视野搜索请求,获取以当前用户为中心的九宫格内的用户列表。

6.根据权利要求5所述的地图服务器,其特征在于,所述地图服务器还包括:标记模块,用于响应所述视野搜索请求,获取所述当前用户对应的已存储的视野列表,并对所述已存储的视野列表中的用户进行标记;

所述视野列表生成模块还用于获取所述用户列表中在含有所述标记的用户,加入到当前用户对应的视野列表中。

7.根据权利要求6所述的地图服务器,其特征在于,所述标记模块还用于在所述视野列表生成模块生成所述视野列表后,清除含有所述标记的用户的标记。

8.根据权利要求1所述的地图服务器,其特征在于,所述距离队列生成模块还用于在与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户内随机选取预设数量的用户加入对应的距离队列中。

9.一种视野的控制系统,其特征在于,包括权利要求1至8任意一项所述的地图服务器和与所述地图服务器进行交互的客户端。

10.一种视野的控制方法,其特征在于,包括以下步骤:

获取以当前用户为中心的九宫格内的用户列表;

获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户;

根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高;

所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤为:在距离队列中随机选取一个用户,从所述随机选取的用户开始,按照预设的选取粒度从距离队列中顺序选取用户加入视野列表中。

11.根据权利要求10所述的视野的控制方法,其特征在于,在所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤之前,还包括:根据所述权重和预设的视野上限分配与所述距离队列对应的选取名额;

根据所述选取名额和所述距离队列中的用户数量生成选取粒度;其中,所述选取粒度为所述用户数量与所述选取名额的比值;

所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤为:从所述随机选取的用户开始,按照所述选取粒度从距离队列中顺序选取对应的所述选取名额的用户加入视野列表中。

12.根据权利要求10所述的视野的控制方法,其特征在于,所述方法还包括:如果所述距离队列中的用户数量少于对应的选取名额时,获取所述距离队列中的未分配名额,将所述未分配名额加入到其他距离队列对应的选取名额中。

13.根据权利要求10所述的视野的控制方法,其特征在于,所述方法还包括:从所有距离队列中选取完预设数量的用户加入视野列表中后,若所述视野列表中的用户数量少于预设的视野上限,则获取剩余名额,所述剩余名额为预设的视野上限与所述视野列表中的用户数量之差;

根据所述剩余名额从距离队列中选取未被选取到的用户加入视野列表,直至所述剩余名额为零。

14.根据权利要求10所述的视野的控制方法,其特征在于,所述方法还包括:获取当前用户所处地图位置,根据预设的搜索网格和所述当前用户所处地图位置,当所述当前用户跨越搜索网格时生成视野搜索请求;

其中,所述搜索网格的大小小于或等于所述九宫格中的格子大小;

所述获取以当前用户为中心的九宫格内的用户列表的步骤是响应所述视野搜索请求而进行。

15.根据权利要求14所述的视野的控制方法,其特征在于,在所述生成视野搜索请求的步骤之后,还包括:响应所述视野搜索请求,获取所述当前用户对应的已存储的视野列表,对所述已存储的视野列表中的用户进行标记;

在所述获取以当前用户为中心的九宫格内的用户列表的步骤之后还包括:获取所述用户列表中包含所述标记的用户,将获取的包含所述标记的用户加入到当前用户对应的视野列表中。

16.根据权利要求15所述的视野的控制方法,其特征在于,在所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤之后,还包括:清除所述视野列表中的用户的标记。

17.根据权利要求10所述的视野的控制方法,其特征在于,所述方法还包括:在与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户内随机选取预设数量的用户加入对应的距离队列中。

18.根据权利要求10所述的视野的控制方法,其特征在于,所述方法还包括:获取当前九宫格相对原九宫格新增的小块;

为当前九宫格内的各个小块分配选取名额,其中,新增的小块的选取名额大于当前用户所在小块之外的其他小块;

所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤为:根据与所述距离队列对应的预设的权重以及所述各个小块的选取名额,从所述距离队列中选取预设数量的用户加入视野列表中。

说明书 :

地图服务器、视野的控制方法和系统

技术领域

[0001] 本发明涉及计算机技术领域,特别是涉及一种地图服务器、视野的控制方法和系统。

背景技术

[0002] 在基于地图的应用程序中,每个用户(通常以对象来实现)所在的客户端所能显示的场景范围称为该用户的视野。对于基于地图的应用程序,在地图服务器通常会维护每个用户对应的视野列表,该视野列表即为该用户所在的客户端应显示的用户列表。例如,对于用户A,其对应的视野列表中包含了其他10个用户,在用户A所在的客户端应显示视野列表中的这10个用户。
[0003] 由于用户在一个地图场景中的位置会经常变化,当用户对应的视野列表中的数据变化时,该用户所在客户端的地图场景中所显示的用户也会变化,也即该用户的视野发生了变化。
[0004] 当某个用户的状态信息变化时,地图服务器会实时获取到该用户的状态变化信息,并将该用户的状态变化信息广播至其对应的视野列表中的其他用户所在的客户端。
[0005] 在一个地图场景中,地图中的每一个用户都需要随时把自己的状态变化信息通知到场景中的其它用户。这种变化信息由服务器进行验证,然后服务器把它广播到场景中其它用户的客户端上。现在的基于地图的应用程序中地图场景通常都非常大,如果用户对应的视野列表中包含了该用户所在地图场景中的所有其他用户,则地图服务器广播用户的状态变化信息时将会十分的耗费资源。
[0006] 服务器总的广播包量与场景中用户的数量之间是n*n的关系,场景中用户的数量越多,广播的包量也越多。以每人每秒产生一个变化信息包、变化信息包大小500字节、场景中用户2000人计算,如果所有人的状态变化都通知到场景中所有用户,将产生500*2000*2000=2GB/秒=16Gbps的流量。这种流量远远超出了千兆网卡的承受能力,同时也会造成服务器的CPU压力超出承受能力。
[0007] 传统解决方法是把地图场景分成很多小格,服务器维护每个小格上有哪些用户。传统的地图服务器维护的用户对应的视野列表中包含的是以用户为中心的九宫格范围内的用户,则地图服务器可将用户的状态变化信息广播给该九宫格范围内的其他用户。
[0008] 然而,由于在一些地图场景中的某些位置,用户会比较集中,传统的这种地图服务器所维护的视野列表在这些地图场景下仍然可能包含大量的用户,因此传统的地图服务器在广播用户的状态变化信息时仍然会十分的耗费资源,服务器的广播压力仍然很大。

发明内容

[0009] 基于此,有必要提供一种能够有效降低服务器的广播压力的地图服务器、视野的控制方法和系统。
[0010] 一种地图服务器,包括:
[0011] 用户列表获取模块,用于获取以当前用户为中心的九宫格内的用户列表;
[0012] 距离队列生成模块,用于获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户;
[0013] 视野列表生成模块,用于根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高。
[0014] 一种视野的控制系统,其包括所述的地图服务器和与所述地图服务器进行交互的客户端。
[0015] 一种视野的控制方法,包括以下步骤:
[0016] 获取以当前用户为中心的九宫格内的用户列表;
[0017] 获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户;
[0018] 根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高。
[0019] 上述地图服务器以及视野的控制系统和方法,通过多个预设的距离范围将九宫格内用户分类到多个距离列队中,根据各个距离列队的不同权重选取部分用户视野列表,从而降低了服务器的压力。此时,当前用户既可以看到附近较多的用户,而且相对较远的地方也有用户存在,在大量用户非常集中的情况下,场景更真实,用户体验度更高附图说明
[0020] 图1为一实施例的地图服务器的功能模块图;
[0021] 图2为另一实施例的地图服务器的功能模块图;
[0022] 图3为一实施例视野的控制方法的步骤流程图;
[0023] 图4为用户跨越小块时九宫格的变化以及名额配置示意图。

具体实施方式

[0024] 一个用户要向周围用户广播自己的状态变化信息,首先需要进行视野搜索,以获取其周围用户的列表。如果在整个地图里搜索所有用户,则效率非常低下。解决方法是把一张地图分成若干大小相等的小块,每个小块管理本小块内的用户列表。当一个用户从一个小块移动到另一个小块时,需要在原小块的用户列表里删除该用户,并把该用户加到新的小块的用户列表中。
[0025] 一个用户能看到的其它用户的集合(即这个用户的视野列表)与这个用户的位置相关性很大,当这个用户移动时,他周围的其它用户的集合会不断变化,这时就应该在适当时机重新搜索视野。为了控制视野搜索的粒度和规定视野搜索的时机,可把一个地图分成许多大小相等的搜索网格,类似地图分块管理,例如把1024米*1024米的地图分成4096个16米*16米的小格,当用户跨越16米*16米的搜索网格时才重新去搜索视野。
[0026] 搜索网格的大小决定了搜索的频率,也相当程度上影响了服务器的CPU性能负载。如果搜索网格过小,用户移动时搜索频率很高,可以提高用户体验,但加重了服务器的计算负载。反之,如果搜索网格过大,用户在移动过程中视野变化很慢,虽然减轻了服务器负载,但影响了用户体验。用户在进行视野搜索时,只搜索了周围九个小块(九宫格),当用户跨越小块时,会有三个小块退出九宫格,同时有三个新的小块进入九宫格,这时应该重新搜索视野。因此搜索网格最大值不应大于小块的大小。本实施例中,搜索网格大小等于小块的大小,这样既降低了服务器负载,又不影响用户体验。
[0027] 九宫格范围内的用户可能仍然很多,如果让一个用户看到九宫格范围内的所有用户,他就需要收到这些用户的所有状态变化信息。视野具有对称性,九宫格范围内的所有用户也能看到这个用户,这个用户的状态变化信息就需要广播给九宫格范围内的所有用户。这种相互通知状态变化的广播消息会引起服务器很大的CPU和流量压力。
[0028] 为了控制服务器的负载,一个用户的视野列表是九宫格范围内的用户列表的子集。这个子集的获取过程就是视野搜索的过程。在用户状态信息变化而引起视野范围内广播时,如果每次都重新去搜索视野再进行广播,会因为频繁的视野搜索导致较大的CPU压力。而且两次视野搜索之间,视野列表的变化通常并不大,这样就造成了计算上的浪费。
[0029] 为了减少视野搜索的次数,每个用户在视野搜索完成时都把搜索结果保存,并各自维护自身保存的视野列表。用户在广播自己的状态变化时,直接使用保存下来的视野列表。如果用户重新移动了一段距离,如跨越了小块,才重新搜索视野,并把搜索结果再次保存,供广播使用。
[0030] 视野具有对称性,当用户A把用户B加入/退出视野时,同时维护用户B的视野列表,增加/删除A。
[0031] 由于九宫格范围内用户可能很多,每个用户只能以一定规则选择部分用户进入自己的视野列表。一种选择视野的方法就是近距离优先原则。但如果对九宫格内所有用户的距离大小进行排序,将耗费较多的CPU时间。下文提出的替代办法是预设若干个距离级别,根据距离大小把所有用户划分到不同级别,对同一级别的用户进行同等对待。这样就避免了九宫格范围内的全局排序,只需要把用户收集到若干个距离队列。有了距离队列,搜索视野时可以根据距离大小按优先级选择用户进入视野。
[0032] 如图1所示,其为一实施例的地图服务器10的功能模块图,包括:用户列表获取模块101、距离队列生成模块102和视野列表生成模块103。
[0033] 用户列表获取模块101用于获取以当前用户为中心的九宫格内的用户列表。
[0034] 所述当前用户是指,在获取某个用户为中心的九宫格内的用户列表,该用户即为当前用户。
[0035] 距离队列生成模块102用于获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户。
[0036] 视野列表生成模块103用于根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高。
[0037] 例如有6个距离队列,距离由近到远/由小到大权重配置为10:9:8:7:6:5,如果视野上限是200人,那么每个距离队列分配的名额大小为:200*10/(10+9+8+7+6+5)=44、200*9/(10+9+8+7+6+5)=40、……、200*5/(10+9+8+7+6+5)=22。由于是向下取整运算,200个视野名额分配后如果有剩余,可把剩余名额加到第一个距离队列中。
[0038] 上述地图服务器10通过多个预设的距离范围将九宫格内用户分类到多个距离列队中,根据各个距离列队的不同权重选取部分用户视野列表,从而降低了服务器的压力。此时,当前用户既可以看到附近较多的用户,而且相对较远的地方也有用户存在,在大量用户非常集中的情况下,场景更真实,用户体验度更高。
[0039] 由于收集距离队列时,只能收集完九宫格中的一个格子再去收集另一个格子,因此距离队列中的用户会按格子位置顺序排列。如果简单地选取距离队列中前面的用户进入视野,选择的用户就集中到前面的格子上。一实施例中,可从各个距离队列中随机选择用户。
[0040] 为了更好的分散用户,以及减服务器计算负担。如图2所示,其为另一实施例的地图服务器20的功能模块图,包括:用户列表获取模块201、距离队列生成模块202、视野列表生成模块203、选取名额分配模块204、选取粒度生成模块205、标记模块106和搜索请求生成模块207。
[0041] 地图服务器20与所述地图服务器10的区别在于:
[0042] 所述视野列表生成模块203还用于在距离队列中随机选取一个用户,从所述随机选取的用户开始,按照预设的选取粒度从距离队列中顺序选取用户加入视野列表中。
[0043] 之所以随机选择一个用户,是因为,若所有九宫格内的用户都从同一个位置开始选取,那么很多用户就选择了同样的用户进入视野,而那些没有被选到的就全都不会被选择。若所有都随机选择,则计算量又太大,为此本实施例采用第一个随机选择,其他以等差数列的形式顺序挑选,既可以保证用户被选择的公平性,又不会带来太大的计算压力。
[0044] 选取名额分配模块204用于根据所述权重和预设的视野上限分配与所述距离队列对应的选取名额。
[0045] 选取粒度生成模块205用于根据所述选取名额和所述距离队列中的用户数量生成选取粒度;其中,所述选取粒度为所述用户数量与所述选取名额的比值。
[0046] 所述视野列表生成模块203则是从所述随机选取的用户开始,按照所述选取粒度从距离队列中顺序选取对应的所述选取名额的用户加入视野列表中。
[0047] 例如第一个距离队列有180人,分配选取名额为44人,则选取粒度为180/44=4,如果随机选取的第一个用户的位置为2,则这个距离队列中被选择的用户的位置序号为2,6,10,14,18……。
[0048] 一实施例中,所述选取名额分配模块204还用于在所述距离队列中的用户数量少于对应的选取名额时,获取所述距离队列中的未分配名额,将所述未分配名额加入到其他距离队列对应的选取名额中。
[0049] 所述视野列表生成模块203还用于从所有距离队列中选取完预设数量的用户加入视野列表中后,若所述视野列表中的用户数量少于预设的视野上限,则获取剩余名额,所述剩余名额为预设的视野上限与所述视野列表中的用户数量之差;并根据所述剩余名额从距离队列中选取未被选取到的用户加入视野列表,直至所述剩余名额为零。
[0050] 所述选取未被选取到的用户加入视野列表可以是顺序选取,也可以是随即选取,还可以是再次使用上述的根据与所述距离队列对应的预设的权重,从所述距离队列中未被选取到的用户内选取用户加入视野列表中。搜索请求生成模块206用于获取当前用户所处地图位置,根据预设的搜索网格和所述当前用户所处地图位置,当所述当前用户跨越搜索网格时生成视野搜索请求。
[0051] 其中,所述搜索网格的大小小于或等于所述九宫格中的格子大小。
[0052] 用户列表获取模块201是响应所述视野搜索请求,获取以当前用户为中心的九宫格内的用户列表。
[0053] 标记模块207用于响应所述视野搜索请求,获取所述当前用户对应的已存储的视野列表,并对所述已存储的视野列表中的用户进行标记。
[0054] 所述视野列表生成模块203还用于获取所述用户列表中在含有所述标记的用户,加入到当前用户对应的视野列表中。
[0055] 对用户进行标记,是因为连续两次视野搜索进入视野的用户列表差异通常会比较大,这样会导致每次视野搜索导致大量用户离开视野和大量用户进入视野,这会造成很大流量压力,视野包内容填充和打包也会给CPU带来很大压力。
[0056] 标记模块207对当前视野列表中的用户进行标记后,下次视野搜索时则优先加入新的视野列表,大大的降低了服务器的计算压力。
[0057] 所述标记模块207还用于在所述视野列表生成模块203生成所述视野列表后,清除含有所述标记的用户的标记。
[0058] 一实施例中,所述距离队列生成模块202还用于在与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户内随机选取预设数量的用户加入对应的距离队列中。
[0059] 这是因为,用户集中度很高时,可能有数以千计的用户集中在九宫格范围内,这种情况下每个用户在进行视野搜索时都收集九宫格内的所有用户,同时把这些用户归入到不同距离队列中,也会造成较大的CPU计算消耗。
[0060] 实际上用户的最大视野上限通常最多200人,过多地收集九宫格用户是计算上的浪费。所以本实施例随机收集九宫格内部分/预设数量用户进入距离队列,如500人,这样可以很大程度的降低服务器的计算量。
[0061] 当前用户跨越一个九宫格中的小块时,其所在的新九宫格中有六个小块是原有的,并增加三个新的小块。在实际情况中,用户更关心前进方向上的三个新的小块上的用户,而较少关心身后的六个原视野小块上的用户。为此,在一个实施例中,所述选取名额分配模块204为新的三个小块上配置的选取名额大于当前用户所在小块以外的其他小块的名额。
[0062] 考虑到用户对身边的近距离用户更关心,要保证近距离队列中有足够的用户选择进入视野。为此,一实施例中,所述选取名额分配模块204为当前用户所在的小块配置的选取名额大于其他小块的选取名额。
[0063] 本发明还提供一种视野的控制系统,其包括所述的地图服务器10/20和与所述地图服务器10/20进行交互的客户端。
[0064] 如图3所示,其为一实施例的视野的控制方法的步骤流程图,包括如下步骤:
[0065] 步骤S301,获取以当前用户为中心的九宫格内的用户列表。
[0066] 所述九宫格是指地图被划分成多个大小相等的小块后,某个小块和其周围的八个小块统称为九宫格。每个小块对应有当前在自己范围内的用户的列表。
[0067] 步骤S302,获取所述用户列表中的用户与所述当前用户之间的距离,根据所述距离生成与预设的距离范围对应的至少二个距离队列,所述距离队列中包含与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户。
[0068] 步骤S303,根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中;其中,所述距离队列对应的距离范围与所述当前用户越近,则所述距离队列对应的权重越高。
[0069] 例如有6个距离队列,距离由近到远/由小到大权重配置为10:9:8:7:6:5,如果视野上限是200人,那么每个距离队列分配的名额大小为:200*10/(10+9+8+7+6+5)=44、200*9/(10+9+8+7+6+5)=40、……、200*5/(10+9+8+7+6+5)=22。由于是向下取整运算,200个视野名额分配后如果有剩余,可把剩余名额加到第一个距离队列中。
[0070] 上述视野的控制方法通过设置多个预设的距离范围将九宫格内用户分类到多个距离列队中,根据各个距离列队的不同权重选取部分用户视野列表,从而降低了服务器的压力。此时,当前用户既可以看到附近较多的用户,而且相对较远的地方也有用户存在,在大量用户非常集中的情况下,场景更真实,用户体验度更高。
[0071] 由于收集距离队列时,只能收集完九宫格中的一个格子再去收集另一个格子,因此距离队列中的用户会按格子位置顺序排列。如果简单地选取距离队列中前面的用户进入视野,选择的用户就集中到前面的格子上。一实施例中,可从各个距离队列中随机选择用户。
[0072] 为了更好的分散用户,以及减服务器计算负担。一实施例中,所述步骤S303为:
[0073] 在距离队列中随机选取一个用户,从所述随机选取的用户开始,按照预设的选取粒度从距离队列中顺序选取用户加入视野列表中。
[0074] 之所以随机选择一个用户,是因为,若所有九宫格内的用户都从同一个位置开始选取,那么很多用户就选择了同样的用户进入视野,而那些没有被选到的就全都不会被选择。若所有都随机选择,则计算量又太大,为此本实施例采用第一个随机选择,其他以等差数列的形式顺序挑选,既可以保证用户被选择的公平性,又不会带来太大的计算压力。
[0075] 一实施例中,在所述步骤S303之前,还包括如下步骤:
[0076] 根据所述权重和预设的视野上限,分配与所述距离队列对应的选取名额。
[0077] 根据所述选取名额和所述距离队列中的用户数量生成选取粒度;其中,所述选取粒度为所述用户数量与所述选取名额的比值。
[0078] 所述根据与所述距离队列对应的预设的权重,从所述距离队列中选取预设数量的用户加入视野列表中的步骤为:
[0079] 从所述随机选取的用户开始,按照所述选取粒度从距离队列中顺序选取对应的所述选取名额的用户加入视野列表中。
[0080] 例如第一个距离队列有180人,分配选取名额为44人,则选取粒度为180/44=4,如果随机选取的第一个用户的位置为2,则这个距离队列中被选择的用户的位置序号为2,6,10,14,18……。
[0081] 一实施例中,所述视野的控制方法还包括如下步骤:
[0082] 如果所述距离队列中的用户数量少于对应的选取名额时,获取所述距离队列中的未分配名额,将所述未分配名额加入到其他距离队列对应的选取名额中。
[0083] 一实施例中,所述视野的控制方法还包括如下步骤:
[0084] 从所有距离队列中选取完预设数量的用户加入视野列表中后,若所述视野列表中的用户数量少于预设的视野上限,则获取剩余名额,所述剩余名额为预设的视野上限与所述视野列表中的用户数量之差。
[0085] 根据所述剩余名额从距离队列中选取未被选取到的用户加入视野列表,直至所述剩余名额为零。
[0086] 所述选取未被选取到的用户加入视野列表可以是顺序选取,也可以是随即选取,还可以是再次使用上述的根据与所述距离队列对应的预设的权重,从所述距离队列中未被选取到的用户内选取用户加入视野列表中。
[0087] 一实施例中,所述视野的控制方法还包括如下步骤:
[0088] 获取当前用户所处地图位置,根据预设的搜索网格和所述当前用户所处地图位置,当所述当前用户跨越搜索网格时生成视野搜索请求。
[0089] 其中,所述搜索网格的大小小于或等于所述九宫格中的格子大小。
[0090] 所述步骤S301是响应所述视野搜索请求而进行。
[0091] 一实施例中,所述视野的控制方法还包括如下步骤:
[0092] 响应所述视野搜索请求,获取所述当前用户对应的已存储的视野列表,对所述已存储的视野列表中的用户进行标记。
[0093] 在所述步骤S301之后还包括:
[0094] 获取所述用户列表中包含所述标记的用户,将获取的包含所述标记的用户加入到当前用户对应的视野列表中。
[0095] 清除所述视野列表中的用户的标记。
[0096] 对用户进行标记,是因为连续两次视野搜索进入视野的用户列表差异通常会比较大,这样会导致每次视野搜索导致大量用户离开视野和大量用户进入视野,这会造成很大流量压力,视野包内容填充和打包也会给CPU带来很大压力。
[0097] 标记模块207对当前视野列表中的用户进行标记后,下次视野搜索时则优先加入新的视野列表,大大的降低了服务器的计算压力。
[0098] 一实施例中,所述视野的控制方法还包括如下步骤:
[0099] 在与所述当前用户之间的距离在对应的距离范围内的所述用户列表中的用户内随机选取预设数量的用户加入对应的距离队列中。
[0100] 这是因为,用户集中度很高时,可能有数以千计的用户集中在九宫格范围内,这种情况下每个用户在进行视野搜索时都收集九宫格内的所有用户,同时把这些用户归入到不同距离队列中,也会造成较大的CPU计算消耗。
[0101] 实际上用户的最大视野上限通常最多200人,过多地收集九宫格用户是计算上的浪费。所以本实施例随机收集九宫格内部分/预设数量用户进入距离队列,如500人,这样可以很大程度的降低服务器的计算量。
[0102] 用户跨越一个小块时,其所在的九宫格中有六个小块是原有的,并增加三个新的小块。在实际情况中,当前用户更关心前进方向上的三个新的小块上的用户,而较少关心身后的六个原小块上的用户。
[0103] 为此,在一个实施例中,在步骤S303之前,包括:
[0104] 获取当前九宫格相对原九宫格新增的小块;
[0105] 为当前九宫格内的各个小块分配选取名额,其中,新增的小块的选取名额大于当前用户所在小块之外的其他小块。
[0106] 所述步骤S303为:根据与所述距离队列对应的预设的权重以及所述各个小块的选取名额,从所述距离队列中选取预设数量的用户加入视野列表中。
[0107] 如图4所示,新增的三个小块每个分配30个名额,即用户前方的三个小块每个分配30个名额,而后方的三个小块每个只分配5个名额。
[0108] 另一方面,考虑到用户对身边的近距离用户更关心,要保证近距离队列中有足够的用户选择进入视野,为此,一实施例中,当前用户所在的小块分配的选取名额大于其他小块的名额。如图4所示,当前用户所在的小块配置40个选取名额,大于周围任一小块的选取名额。
[0109] 上述地图服务器、视野的控制方法和系统可运用于如基于移动终端地图的SNS信息搜索/共享类的应用程序中,也可以运用在网络游戏的地图服务器中。
[0110] 以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。