游戏服务器开发指南
文章平均质量分 78
为开发稳定、高效的游戏服务器提供有建设性的经验法则,来自十几年老服务器于生产一线的经验积淀
长三月
长期分享游戏服务器/游戏开发/Java干货文章;
长期造各种轮子,分享造轮子心得;
十年以上游戏服务端主程经验,曾担任月流水过亿项目技术负责人
展开
-
游戏服务器开发指南(八):合理应对异常
JDK中也有对fail-fast思想的运用,例如ArrayList是一个非线程安全的容器,如果在使用for-each遍历元素的同时又修改了它的结构,那么会第一时间抛出ConcurrentModificationException,快速而干净地失败,而不是冒着在未来不确定的时间出现不确定行为的风险。所以,对于这种影响全局的严重问题,不如在停服重启的时候就彻底解决好,解决了再对玩家开放服务器。合理地处理异常,能够将故障对玩家的影响降到最低水平,快速从错误中恢复,并提供充足的信息,避免以后再出现类似的问题。原创 2023-06-10 11:32:44 · 797 阅读 · 0 评论 -
游戏服务器开发指南(七):资源流通保证先减后增的顺序
更重要的是,数据在事后是可恢复的,只需要检查报错日志和接口日志,就能计算出玩家错误扣除的金币数额,再给玩家补上,而不像刷资源那样只能使用回档的方式来暴力解决。如果刷资源的人数众多,而且刷到的资源又被转换成了其他资源不好追溯,那么不得已只能使用最后的保留手段——回档。解决办法是调整逻辑顺序,改为先减后增的顺序,即先行扣除要捐的钱,再向公会agent请求捐款,如果捐款失败,那么再把钱返还给玩家。以上代码是按照先增后减的顺序,即先向公会agent请求,让公会得到这笔钱,然后如果捐款成功,那么再扣除自己的钱。原创 2023-05-27 18:25:20 · 265 阅读 · 0 评论 -
游戏服务器开发指南(六):条件判断永远放在状态变更前
试想,如果把对商品剩余数量的判断移到consumeMoney之后,那么可能会发生消耗了金币商品却没有到账的情况,这肯定是无法接受的。而游戏服务器的业务又与互联网或者其他领域不同,有着自己的特点。这条原则意思是为接口编写处理逻辑时,先罗列所有的条件判断,如果所有的判断通过,那么才进行状态变更(如更新DB或者修改内存状态),否则返回接口失败的信息给前端。建议的改进写法是修改原有的drawLottery方法,将其改造成抽1次和抽10次都可以调用的通用方法,这样不仅保证了代码的复用性,还不会带来原写法的上述缺点。原创 2023-05-14 19:36:48 · 466 阅读 · 0 评论 -
游戏服务器开发指南(五):避免死锁
定时锁可以设置一个超时时间,当超过这个时间还未获得锁时不会继续阻塞等待,而是返回失败状态,程序员可以根据返回状态的不同,决定是继续执行同步块内部的代码,还是回滚当前操作。一种特殊的情况是是不带超时时间的定时锁,在这种情况下,尝试获得锁会立即返回成功或失败,失败后可以间隔一小段时间重试获取锁,直至超时操作失败,这种情况下的锁称为轮询锁。形成死锁后,不仅线程无法再被使用,而且线程持有的资源(锁)也无法再被其他线程获取,这会导致程序的全部或部分功能无法正常运行,对于游戏服务器来说需要重启才能恢复。原创 2023-04-30 22:54:21 · 164 阅读 · 0 评论 -
游戏服务器开发指南(四):降低同步的开销
为了保证房间状态的正确性,我们需要保证进入房间和退出房间的操作为原子操作,例如进入房间至少应包括:判断是否能进入,将玩家id加入到房间中的玩家集合,当玩家人数满5人时自动开启战斗等,这一系列操作应该组合为一个原子操作不可分割。游戏模式是开房间战斗,玩家可以自由进入或退出战斗房间,当房间人数满5人时自动开启战斗,当房间人数为0时房间自动解散,玩家进入或退出房间都会向房间中的其他人推送进入或退出的消息,玩家有每日可战斗次数,进入房间时消耗1次次数,退出房间时增加1次次数,该次数会计入DB。原创 2023-04-19 23:16:51 · 438 阅读 · 0 评论 -
游戏服务器开发指南(三):设计高效的线程模型
这样设计的问题是,由于战斗计算是CPU密集型的计算任务,当房间数量增多到一定程度时会达到单核性能瓶颈,无法在原定的一帧时间内执行完所有的房间计算,导致掉帧的情况出现。同样典型的场景还有MMO中的大地图,由于整个地图运算量巨大,通常会考虑使用多线程分担计算量,拆分角度通常是按地图区域,每个区域分配一个线程,或者是按业务类型,每种独立的业务逻辑分配一个线程。例如,恰好玩家分配到线程1上的数量较多,而且来自这部分玩家的请求数也较多,就会造成线程1繁忙,而其他线程空闲的情况。一周一次的系列分享又与大家见面了。原创 2023-04-09 23:36:45 · 865 阅读 · 2 评论 -
游戏服务器开发指南(二):优化包体传输
大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。这个系列本来计划每周更新一篇。本周因工作事情比较多,拖到周日才更新,让大家久等了。这次的主题是优化包体传输,是网络通信类别下的第二篇。在游戏服务器的部署环境中,机房的网络带宽都是有限制的。如果通信传输的数据总量太大,会挤占带宽甚至达到带宽上限,影响正常消息发送。另外,如果包体太大,在弱网环境下的通信质量会变差,更容易发生丢包重传和延迟,而且大包对于截包和查找问题也不方便。原创 2023-04-02 23:32:13 · 357 阅读 · 0 评论 -
游戏服务器开发指南(一):设置合适的Socket选项
上周写完系列序言,得到不少读者朋友的关注,这也给了我额外的动力。写东西就是这样,都希望获得更多的关注,如果写出来没什么人看,那就无异于闭门造车、自娱自乐。欢迎朋友们在文后留言,我也会根据大家的反馈适时调整写作的内容和方式。我在这里整理了一个系列目录,用于分门别类存放文章的链接地址,方便读者快速索引。目录按不同的主题组织,如网络通信、数据存储等,每个主题会包含若干篇文章。个人计划是平均每周写一篇,写作基于平时工作中产生的灵感,因此不一定会按照主题的排列顺序来。原创 2023-03-23 09:41:53 · 612 阅读 · 1 评论 -
游戏服务器开发指南(序)
一方面,作为一个十多年经验的游戏开发者,很希望把自己掌握的知识和经验系统化;在当前浮躁的社会背景下,技术大概率是无法做一辈子的,但是深耕一个领域,尽可能延长自己的职业生涯,增强不可替代性,无疑是有益的。系列标题是《游戏服务器开发指南》,它也揭示了本系列的写作主题:汇集游戏服务器开发领域一些有价值的经验法则,这些经验法则来自与业务实际紧密相关的细分话题,结合本人多年经验和实践,确保分析深入浅出。在我多年的游戏服务器开发生涯中,学习过大量网络编程和数据存储方面的知识,也看过不少游戏服务器相关的书籍。原创 2023-03-14 09:52:50 · 419 阅读 · 0 评论 -
游戏服务器开发指南(目录)
本目录用于游戏服务器开发指南系列,分门别类存放文章的链接地址,方便读者快速索引。目录按不同的主题组织,如网络通信、数据存储等,每个主题会包含若干篇文章。个人计划是平均每周写一篇,写作基于平时工作中产生的灵感,因此不一定会按照主题的排列顺序来。原创 2023-03-23 09:46:06 · 229 阅读 · 0 评论