关于场景服务的一些想法

adinosaur adinosaur     2022-10-02     481

关键词:

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

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

先简单说说背景:地图场景是按格子划分的,每个格子有若干属性(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 级别的场景服务

缓存关于缓存的一些使用场景及建议

缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库压力,提升系统整体性能,缩短访问时间。有架构师说“缓存是万金油,哪里有问题,加个缓存,就能优化”,缓存的滥用,可能会导致一些错误用法。... 查看详情

关于秒杀系统的一些想法

关于秒杀系统      在学习过程中,经常遇到关于秒杀系统的文章,但查阅各种资料,总觉得没一篇文章能完整的讲解秒杀系统是如何实现的。      秒杀功能常见,但完整的秒杀系统却... 查看详情

关于新光源束测工作的一些想法

...仅仅自己一枝独秀,不管有意还是无意,更是大忌。在“关于新光源建设的一些想法”中,我粗略的把束测系统需掌握的技能分了下类:加速器束测理论及公式推导探测器结构设计和理论分析电磁场计算光路设计和计算嵌入式系... 查看详情

关于机器学习场景中用户分类的建议

】关于机器学习场景中用户分类的建议【英文标题】:Adviceonclassifyingusersinmachinelearningscenario【发布时间】:2017-04-2619:47:00【问题描述】:我正在寻找一些关于根据注册过程的答案将用户分为不同组的问题的建议。想法是这些分... 查看详情

01_关于car_hmi2的一些想法

...帮助,如果觉得不错,请点赞搜藏哈。文章目录关于CAR_HMI2的一些想法1历史版本2新版构想3写在最后的话关于CAR_HMI2的一些想法哈哈这篇文章将是我《CAR_HMI2》的第一篇文章。将简单和大家交代一下关于这个新坑的一下想... 查看详情

关于整屏滚动的一些想法

一,其中元素的尺寸大小    html结构:        <html>            <body>                <ul>                    <li></li>      ... 查看详情

建议我一些关于使用反应点符号的文本输入的想法

】建议我一些关于使用反应点符号的文本输入的想法【英文标题】:SuggestmesomeideasonTextinputusingreactdotnotation【发布时间】:2021-05-2523:53:10【问题描述】:如何使用reactdotnotation编写文本输入组件?例如。我想在功能组件中这样访问... 查看详情

我需要一些关于 SRT 字幕文本处理的想法

】我需要一些关于SRT字幕文本处理的想法【英文标题】:IneedsomeideaontextprocessingforSRTsubtitles【发布时间】:2020-01-1308:58:26【问题描述】:标题说明了我真正需要的ATM。基本上我已经创建了一个基于Tesseract和ImageMagick的OCR工具链。... 查看详情

关于敏捷开发的一些想法

  一、积极。不用等待别人分配任务,在划分任务卡后,按个人实际能力及想法来领取任务,把个人主观能动性发挥至最强。虽然不可避免某些人偷奸耍滑,打鱼晒网,但至少最大程度上的避免了任务超出能力范畴而导致项目... 查看详情

关于软件开发的一些想法

一、自己的想法1.软件开发是在创造新的事物,目标是使生活更美好,时刻抱有敬畏之心,从设计、编码、测试、上线和后期维护整个过程要十二分谨慎,保证做的东西符合设计预期,没有bug,安全可控。 2.软件开发前期的... 查看详情

关于设计的一些想法

 关于设计我记不清从什么时候听过一个说法,是这么说的,设计是产品制造者同用户的一个交流。比如一个杯子,我们拿在手里就知道如何用这边杯子喝水,当这个杯子有把时,设计者就传达给我们当倒上热水时,杯身会很... 查看详情

关于缺氧(oxygennotincluded)的一些零碎想法

1、背景。介绍过于简单,仅仅说“不知道为什么出现在星球地底”十分缺少游戏代入感。个人想法:地球资源匮乏,人类无法继续生存,此时研究出了“随机星球跳跃”的科技,遂从全地球随机抽取人口样本数据,生成复制人... 查看详情

关于代码控制管理的一些想法

最近工作中遇到一个开发团队,对代码的版本控制管理居然没有要求,导致了种种问题。1.由于分支没有规范,最后一个小版本上线合代码居然化了几个小时,最后开发人员自己都不知道合到哪个分支。2.一些人把所有的代码都... 查看详情

关于新光源建设的一些想法

一些建议:对大批量使用的设备、模块、器件、材料以及基础软件架构等不要对进口产生依赖,尽可能选用国产,助力产业,方案公开评价提意见,要让我们做的每个系统拿出去都可以当个标杆推广才好,依赖进口的部分是硬伤... 查看详情

关于一些代码过程的想法

程序编写最重要的的部分应该是要学会分析问题了,要会把一段要求才分开来用流程图或者简洁明了的文字来表达出来。就像最简单的“Hello,World”,拿到这个问题你的脑袋里面想的应该直接写一个:Console.Write("Hello.World");但是如... 查看详情

关于监控系统的一些想法心得

我这篇文章[http://blog.csdn.net/u014654002/article/details/54345381]里写过的kairosdb,那是我开始接触监控系统的第一步,它帮助我了解了时序数据库在监控端的优秀表现。kairosdb算是相当优秀的监控系统存储后端,并且支持使用grafana(一款... 查看详情

关于自制的思维导图的一些想法

先看图再啰嗦:花了不少时间去弄。     很久以来就想弄一个能够快速实现自己想法的逻辑分析系统结构软件。相信很多人都在不得已的情况下,采用什么Excel、Word,或者其他类型的思维导图之类的玩意。其实... 查看详情

一些关于slg手游的想法

目前,市面上RPG手游产品已处于成熟的阶段,不管是游戏中的战斗模块还是其他玩法,在RPG手游中变化不大,因而同质化现象比较严重。相比之下,SLG手游还处于成长阶段,各个方面都还有很大的提升空间,比如战报式的战斗系... 查看详情