关于场景服务的一些想法

最近由于遇到一些问题,老大们决定把场景显示相关的代码拆分出来用一个独立的线程去做(大概是实现一个独立的场景服务吧),感觉这样挺好的,毕竟这部分功能本来就较为独立。

我对这部分内容还挺感兴趣的,思考了一下,心里有一个感觉是比较好的解决方法,遂提笔记录下来:)

先简单说说背景:地图场景是按格子划分的,每个格子有若干属性(key-value对),这些属性随着场景事件的触发而改变。由于相同的格子在不同的玩家看到可能会有不同的显示,因此需要为每个玩家独立计算,并不能简单的把格子数据直接同步给client。值得一提的是,上一个版本就是这么做的,结果遇到了几个问题:

(1)有些时候client计算不太方便。比如这个计算依赖其它一些数据就不得不把这部分数据也同步过去,因此白白浪费了带宽。

(2)客户端在移动镜头的时候又要做复杂的逻辑计算会导致画面卡顿,感受不好。

因此决定了在server就把显示数据计算好再同步给client。

那么,这个场景服务如何实现呢?

首先看看它需要哪些功能呢?我觉得最基本的,它只需要做到以下两点:

(1)更新地图上每个格子的属性数据。

(2)提供一个类似 get_grid_show_data(role_id, grid_id) 的接口计算出玩家对某个格子的显示数据。

我的设想是这样的:逻辑线程将会导致地图上格子属性数据发生变化的事件,以消息的形式传递给场景线程,场景线程以此为驱动来更新格子的属性数据。而对于同步玩家格子的显示数据,以request-response模式工作,client定期(可以是1秒)请求server格子的显示数据。

为什么是request-response模式呢?

首先,这个模式server不用维护client的状态,因此可以实现的十分简单。

其次是,这种方式可以让client更灵活的选择更新格子显示的策略:

(1)比如说,当我打开了一个全屏的ui面板,这个时候其实就可以不需要关心格子的变化了因此可以简单的停止请求更新。

(2)又或者当client的网络不是很好,而这个时候server一股脑的将更新数据同步给client并无益处,更好的做法是client再上一次请求返回之后才允许发起下一次更新请求。

(3)再比如,当几个玩家正在某个格子正在进行一场激烈的战斗(或是其它行为),这个时候我们更应该优先关注这个格子的变化、而其他的一些格子倒是可以缓慢一些。此时client可以对这个关注的格子采用更为积极的更新策略(得到返回马上发起下一次查询),而其它不怎么关心的格子可以相对保守一点,如2秒3秒请求更新一次。

(4)最后还有一点,当玩家调整镜头远近导致可见格子数量变化后,client可以灵活的做出相应的调整,只请求更新当前可见的格子。

当然了,这种方式也是有缺点的。最为明显的就是,比订阅-发布这中模式浪费了更多带宽。这是因为发布订阅几乎就是做到了状态的精准同步,server只在数据发生改变的时候同步客户端,当然也就可以只同步最少的数据!

不过好在,这个缺点是可以在一定程度上规避的!

为了不同步重复的冗余数据,可以在格子上记录一个最近更新的时间戳。client请求格子显示数据时带上这个时间戳,如果这个时间戳大于格子上的说明client的已经是最新的了,无需再做同步。否则,server就根据格子数据计算显示数据并同步client,注意这个时候应当将时间戳也一并同步。client将收到的时间戳保存起来,下一次查询会再用到。

其实还可以再进一步优化。一般都是玩家镜头有一若干个格子,正常情况下我需要定时请求所有这些玩家可见的格子的数据。倘若一般手机屏幕能显示玩家周围4*4这么多格子,client以一秒为周期定时发起请求,那么每秒最少就需要发16条消息。这样显然是不科学的!

一个解决方法是,引入一个块(block)的概念。一个块就是一个格子集合,一般是一个固定大小的矩形。玩家周围的格子就可以看作是一个块。服务器除了在格子上记录更新时间戳之外,也在这个块上记录一个时间戳。块的时间戳等于其中包含的格子时间戳的最大值。也就是说,每当更新块中的格子时,都要更新块的时间戳。平时client在查询的时候时候可以一次查询整个块,参数就带上上一次服务器同步过来的块的时间戳。倘若这个时间戳没有变化,说明这段时间里这个块都没有数据变化,不做同步。若这个时间戳有变化了,则遍历块中的所有格子,查看其时间戳,如果比客户端传过来的时间戳大的,说明是最近更新的,计算其显示数据并同步。最后再把整个块的时间戳也同步给client。

参考:如何只基于请求回应模式实现 MMO 级别的场景服务

时间: 2024-10-09 07:36:55

关于场景服务的一些想法的相关文章

引领手机流量营销 容联云通讯嘿嘿流量打造多场景专业服务

随着4G网络和智能设备的快速普及,手机流量作为移动互联网时代的用户刚需,已经被越来越多的企业采购作为宣传推广产品的敲门砖.手机流量营销,其实是一种全新的激励营销方式,电商.APP.游戏等产品在做营销推广时,以手机流量包作为激励品,刺激用户参与活动和互动,以达到营销推广的目的. 当然,这些流量活动都离不开第三方手机流量分发平台,一个连接着运营商和互联网厂商的关键点.今日,我们就拿嘿嘿流量为例,简单分析下第三方手机流量分发平台的使用场景. 嘿嘿流量:多场景手机流量营销方案 嘿嘿流量为企业提供灵活.便

什么是微服务架构?

微服务(Microservices Architecture)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下,每个任务代表着一个小的业务能力. 单体架构(Monolithic Architecture ) 企业级的应用一般都会面临各种各样的业务需求,而常见的方式是把大量功能堆积到同一个单体架构中去.比如:常见的ERP.CRM等系统都以单体架构的方式运行,同时由于提

微服务是什么?

解析微服务架构系列文章将分几篇描述微服务的定义.特点.应用场景.企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型. 为什么需要微服务架构 "微服务"架构是近期软件应用领域非常热门的概念.让我们先来看看传统IT架构面临的一些问题: 使用传统的整体式架构(Monolithic Architecture)应用开发系统,如CRM.ERP等大型应用,随着新需求的不断增加,企业更新和修复大型整体式应用变得越来越困难: 随着移动互联网的发展,企业

关于微服务整理

微服务架构的优点: 每个服务都比较简单,只关注于一个业务功能. 微服务架构方式是松耦合的,可以提供更高的灵活性. 微服务可通过最佳及最合适的不同的编程语言与工具进行开发,能够做到有的放矢地解决针对性问题. 每个微服务可由不同团队独立开发,互不影响,加快推出市场的速度. 微服务架构是持续交付(CD)的巨大推动力,允许在频繁发布不同服务的同时保持系统其他部分的可用性和稳定性. 微服务架构的缺点: 微服务的一些想法在实践上是好的,但当整体实现时也会呈现出其复杂性. 运维开销及成本增加:整体应用可能只需

微服务架构(一):什么是微服务

解析微服务架构系列文章将分几篇描述微服务的定义.特点.应用场景.企业集成架构的演进以及微服务转型思路和技术决策考虑等内容,并以IBM技术为例介绍如何实现微服务架构转型. 为什么需要微服务架构 "微服务"架构是近期软件应用领域非常热门的概念.让我们先来看看传统IT架构面临的一些问题: 使用传统的整体式架构(Monolithic Architecture)应用开发系统,如CRM.ERP等大型应用,随着新需求的不断增加,企业更新和修复大型整体式应用变得越来越困难: 随着移动互联网的发展,企业

单体式应用微服务改造经验谈【上】

昨日好评博文:<如何设计出优美的Web API?> 截止目前阅读量近 2000,获得好评无数,小伙伴们不要错过哦! 微服务是当下最流行的应用架构技术了,它跟容器服务.DevOps合称云时代的三剑客,可以帮我们化解业务发展过快导致的产品迭代压力,让我们可以自由选择最适合团队的技术栈,让系统能够承载互联网海量用户的访问,让我们可以更加轻松地运维大型的互联网系统.近些年在厂商.社区和用户等各方努力推动下,微服务相关的理论和产品都日趋成熟,不同语言的微服务开发及治理套件(例如:Spring Cloud

某页游erlang服务端广播算法效率好差,应该算是一个bug了吧

偶然得到一份erlang网页服务端的代码 不得不说写的非常优雅,文档也非常不错,但我看到他的场景管理中的广播算法,不得不说写的很漂亮,但效率非常低. 每次都全局遍历全部在线玩家在某个场景的玩具ID,这样的算法,我不知道一个服能撑起多少人,优化一下,场景服务管理在他服务中的玩家,NPC,MON,效率会提升好几倍,只是代码会稍微复杂一点,没他写的优雅了!! %% 获取要广播的范围用户ID get_broadcast_id(Q, X0, Y0) -> AllUser = ets:match(?ETS_

gis 服务分析总结

服务过程:设计,制作,发布,使用 地图服务: KML服务:地图服务和影像服务也可以通过 Keyhole 标记语言 (KML) 网络链接的形式提供,google earth可访问 制图:图层及其基本属性 可用未用服务: 获取要素: 移动数据访问: 网络分析:交通网分析问题,路径分析:先创建网络分析图层,然后发布 (Schematics 服务)逻辑示意图:服务允许 Web 应用程序通过 Web 服务访问逻辑示意图,查看,生成,更新,编辑逻辑示意图 OGC:客户可通过使用开放并经认可的标准使用服务功能

致创业者:APP已死 服务永生

前几日,有位创业者和我讲他在带领团队做一个将爱踢球的人集中在一起的App,我告诉他你的创业方向错了.原因在于你的目的是要为爱踢球的人提供服务,而你现在却在竭尽全力的做App,你应该做的是设计你为爱踢球者提供哪些服务,App只是你提供服务中的一个不是全部. 2012年12月我曾写过一篇文章<2013手机App发展趋势预测:遇冷和洗牌>,文章有两个观点,第一个是App已经到了发展瓶颈期:第二个观点是手机App未来与生活服务结合是最大前景. 现在两个观点都得到了印证,不论是App Store还是各大