<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[长三月的游戏开发]]></title><description><![CDATA[资深游戏开发者，专注于Java游戏服务端技术]]></description><link>https://blog.csdn.net/needmorecode</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; needmorecode]]></copyright><item><title><![CDATA[近年GDC服务器分享合集（四）： 《火箭联盟》：为免费游玩而进行的扩展]]></title><link>https://blog.csdn.net/needmorecode/article/details/131906205</link><guid>https://blog.csdn.net/needmorecode/article/details/131906205</guid><author>needmorecode</author><pubDate>Sun, 03 Sep 2023 13:22:33 +0800</pubDate><description><![CDATA[上线之后的巅峰在线人数多于改版前的5倍，但是少于压力测试的最高值，因此还在允许的承载范围内，原先的5倍预估还算比较准确。在线人数稳定后也仍然维持在3倍的高位，更多的在线对服务器带来了更大的承载压力，因此后续版本迭代也在进行持续的压力测试。早早开始规划。不要羞于寻求外界帮助，但也不要过度规划。要做好压力测试很难，但是非常重要。有序安排好重要的特性开发，依据中间的时间节点按时完成。像流量限制一样实现多种功能的控制。]]></description><category></category></item><item><title><![CDATA[一文弄懂游戏服务器的云原生化]]></title><link>https://blog.csdn.net/needmorecode/article/details/131345401</link><guid>https://blog.csdn.net/needmorecode/article/details/131345401</guid><author>needmorecode</author><pubDate>Tue, 11 Jul 2023 22:12:21 +0800</pubDate><description><![CDATA[如今，云原生技术在游戏行业的应用越来越广泛。笔者对此有浓厚兴趣，特地集中学习了一段时间。这篇文章既是记录学习过程的个人笔记，也是游戏服务器云原生的入门引导文章。读完这篇文章，可以对云原生在游戏行业的应用现状、游戏服云原生化的重难点及主流解决方案有初步了解。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（八）：合理应对异常]]></title><link>https://blog.csdn.net/needmorecode/article/details/131038712</link><guid>https://blog.csdn.net/needmorecode/article/details/131038712</guid><author>needmorecode</author><pubDate>Sat, 10 Jun 2023 11:32:44 +0800</pubDate><description><![CDATA[JDK中也有对fail-fast思想的运用，例如ArrayList是一个非线程安全的容器，如果在使用for-each遍历元素的同时又修改了它的结构，那么会第一时间抛出ConcurrentModificationException，快速而干净地失败，而不是冒着在未来不确定的时间出现不确定行为的风险。所以，对于这种影响全局的严重问题，不如在停服重启的时候就彻底解决好，解决了再对玩家开放服务器。合理地处理异常，能够将故障对玩家的影响降到最低水平，快速从错误中恢复，并提供充足的信息，避免以后再出现类似的问题。]]></description><category></category></item><item><title><![CDATA[近年GDC服务器分享合集（三）： 《Sky光·遇》实现百万在线：一种云原生的扩容方法]]></title><link>https://blog.csdn.net/needmorecode/article/details/131016249</link><guid>https://blog.csdn.net/needmorecode/article/details/131016249</guid><author>needmorecode</author><pubDate>Sun, 04 Jun 2023 15:08:25 +0800</pubDate><description><![CDATA[分享者推荐的实现是使用Saga，它具有稍弱的一致性，但是非阻塞而且执行速度快，能保证最终的数据一致性。Saga是一种补偿事务，它的运行逻辑是：将分布式事务看作一组事务组成的事务链，链中的每一个正向事务操作，都对应一个可逆的事务操作。：十二要素应用，又名12-Factor，它定义了一个优雅的、适应云环境的互联网应用在设计过程中，需要遵循的一些基本原则。最终，《Sky光·遇》团队实现了支撑100万在线的目标。：简称Postgres，一种常见的关系型数据库，具有丰富的数据类型和强大的索引，在国外应用比国内更多。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（七）：资源流通保证先减后增的顺序]]></title><link>https://blog.csdn.net/needmorecode/article/details/130879565</link><guid>https://blog.csdn.net/needmorecode/article/details/130879565</guid><author>needmorecode</author><pubDate>Sat, 27 May 2023 18:25:20 +0800</pubDate><description><![CDATA[更重要的是，数据在事后是可恢复的，只需要检查报错日志和接口日志，就能计算出玩家错误扣除的金币数额，再给玩家补上，而不像刷资源那样只能使用回档的方式来暴力解决。如果刷资源的人数众多，而且刷到的资源又被转换成了其他资源不好追溯，那么不得已只能使用最后的保留手段——回档。解决办法是调整逻辑顺序，改为先减后增的顺序，即先行扣除要捐的钱，再向公会agent请求捐款，如果捐款失败，那么再把钱返还给玩家。以上代码是按照先增后减的顺序，即先向公会agent请求，让公会得到这笔钱，然后如果捐款成功，那么再扣除自己的钱。]]></description><category></category></item><item><title><![CDATA[近年GDC服务器分享合集（二）： 《太空工程师》中基于预测物理的多人游戏]]></title><link>https://blog.csdn.net/needmorecode/article/details/130739530</link><guid>https://blog.csdn.net/needmorecode/article/details/130739530</guid><author>needmorecode</author><pubDate>Thu, 25 May 2023 09:53:59 +0800</pubDate><description><![CDATA[另一类是服务端有一个完整的物理世界，运动状态以服务端每帧的计算结果为准，客户端只发送玩家操作给服务端，然后使用服务端的推送结果来修正当前的运动状态。将宇航员和飞船绑定后，宇航员的运动状态更新改为相对飞船的相对运动。（Relative Position Updates），具体来说是先定义物体之间的层次关系，再对子级物体做相对于它的父级物体的运动插值，即本地空间中的运动插值。这样造成的结果是：客户端上宇航员成功进入船舱，而服务端会碰壁，稍后服务端把碰壁消息推送给客户端，客户端据此修正，又将宇航员移出船舱。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（六）：条件判断永远放在状态变更前]]></title><link>https://blog.csdn.net/needmorecode/article/details/130635848</link><guid>https://blog.csdn.net/needmorecode/article/details/130635848</guid><author>needmorecode</author><pubDate>Sun, 14 May 2023 19:36:48 +0800</pubDate><description><![CDATA[试想，如果把对商品剩余数量的判断移到consumeMoney之后，那么可能会发生消耗了金币商品却没有到账的情况，这肯定是无法接受的。而游戏服务器的业务又与互联网或者其他领域不同，有着自己的特点。这条原则意思是为接口编写处理逻辑时，先罗列所有的条件判断，如果所有的判断通过，那么才进行状态变更（如更新DB或者修改内存状态），否则返回接口失败的信息给前端。建议的改进写法是修改原有的drawLottery方法，将其改造成抽1次和抽10次都可以调用的通用方法，这样不仅保证了代码的复用性，还不会带来原写法的上述缺点。]]></description><category></category></item><item><title><![CDATA[近年GDC服务器分享合集（一）：在《黑道圣徒》的boss工厂中创建可扩展和吸引人的UGC]]></title><link>https://blog.csdn.net/needmorecode/article/details/130536907</link><guid>https://blog.csdn.net/needmorecode/article/details/130536907</guid><author>needmorecode</author><pubDate>Mon, 08 May 2023 22:14:39 +0800</pubDate><description><![CDATA[黑道圣徒》是一个经典的犯罪题材RPG游戏IP，玩家可以扮演黑道与其他人进行畅快淋漓的枪战。这次演讲的内容来自最新发售的《黑道圣徒》重启版。在这个版本中，新增了Boss Factory的功能，玩家可以自定义角色的容貌和道具，并允许在线上与他人分享。演讲人是一位印度哥们，印度口音不重，发音清晰标准。他自述从产品经理转到开发，拥有10多年的跨行业服务器经验，以及4年多的游戏服务器经验。]]></description><category></category></item><item><title><![CDATA[用Java实现Actor模型（模仿Skynet）]]></title><link>https://blog.csdn.net/needmorecode/article/details/130457322</link><guid>https://blog.csdn.net/needmorecode/article/details/130457322</guid><author>needmorecode</author><pubDate>Wed, 03 May 2023 13:53:53 +0800</pubDate><description><![CDATA[Actor模型是一种常见的并发模型，与最常见的并发模型——共享内存（同步锁）不同，它将程序分为许多独立的计算单元——Actor，每个Actor独立管理自己的资源，不同Actor之间通过消息传递来交互。它的好处是全异步执行，不会造成线程阻塞，从而提升CPU使用率，另外由于线程之间是异步交互，所以也不用考虑加锁和线程同步的问题。Actor模型在业界有许多应用，例如游戏服务器框架Skynet、编程语言Erlang。因为历史原因，Java下的Actor模型应用较少，知名的只有基于Scala的Akka。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（五）：避免死锁]]></title><link>https://blog.csdn.net/needmorecode/article/details/130415992</link><guid>https://blog.csdn.net/needmorecode/article/details/130415992</guid><author>needmorecode</author><pubDate>Sun, 30 Apr 2023 22:54:21 +0800</pubDate><description><![CDATA[定时锁可以设置一个超时时间，当超过这个时间还未获得锁时不会继续阻塞等待，而是返回失败状态，程序员可以根据返回状态的不同，决定是继续执行同步块内部的代码，还是回滚当前操作。一种特殊的情况是是不带超时时间的定时锁，在这种情况下，尝试获得锁会立即返回成功或失败，失败后可以间隔一小段时间重试获取锁，直至超时操作失败，这种情况下的锁称为轮询锁。形成死锁后，不仅线程无法再被使用，而且线程持有的资源（锁）也无法再被其他线程获取，这会导致程序的全部或部分功能无法正常运行，对于游戏服务器来说需要重启才能恢复。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（四）：降低同步的开销]]></title><link>https://blog.csdn.net/needmorecode/article/details/130145294</link><guid>https://blog.csdn.net/needmorecode/article/details/130145294</guid><author>needmorecode</author><pubDate>Wed, 19 Apr 2023 23:16:51 +0800</pubDate><description><![CDATA[为了保证房间状态的正确性，我们需要保证进入房间和退出房间的操作为原子操作，例如进入房间至少应包括：判断是否能进入，将玩家id加入到房间中的玩家集合，当玩家人数满5人时自动开启战斗等，这一系列操作应该组合为一个原子操作不可分割。游戏模式是开房间战斗，玩家可以自由进入或退出战斗房间，当房间人数满5人时自动开启战斗，当房间人数为0时房间自动解散，玩家进入或退出房间都会向房间中的其他人推送进入或退出的消息，玩家有每日可战斗次数，进入房间时消耗1次次数，退出房间时增加1次次数，该次数会计入DB。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（三）：设计高效的线程模型]]></title><link>https://blog.csdn.net/needmorecode/article/details/129764622</link><guid>https://blog.csdn.net/needmorecode/article/details/129764622</guid><author>needmorecode</author><pubDate>Sun, 09 Apr 2023 23:36:45 +0800</pubDate><description><![CDATA[这样设计的问题是，由于战斗计算是CPU密集型的计算任务，当房间数量增多到一定程度时会达到单核性能瓶颈，无法在原定的一帧时间内执行完所有的房间计算，导致掉帧的情况出现。同样典型的场景还有MMO中的大地图，由于整个地图运算量巨大，通常会考虑使用多线程分担计算量，拆分角度通常是按地图区域，每个区域分配一个线程，或者是按业务类型，每种独立的业务逻辑分配一个线程。例如，恰好玩家分配到线程1上的数量较多，而且来自这部分玩家的请求数也较多，就会造成线程1繁忙，而其他线程空闲的情况。一周一次的系列分享又与大家见面了。]]></description><category></category></item><item><title><![CDATA[5天带你读完《Effective Java》（五）]]></title><link>https://blog.csdn.net/needmorecode/article/details/129740252</link><guid>https://blog.csdn.net/needmorecode/article/details/129740252</guid><author>needmorecode</author><pubDate>Fri, 07 Apr 2023 23:30:01 +0800</pubDate><description><![CDATA[在没有考虑默认序列化形式是否合适之前，不要接受它。如果对象的物理表示与其逻辑内容相同，则默认的序列化形式可能是合适的。/*** @serial/*** @serial/*** @serial即使你认为默认的序列化形式是合适的，你通常也必须提供readObject方法来确保不变性和安全性。Entry next;将导出的 API 永久地绑定到当前的内部实现。占用过多的空间。消耗过多的时间。可能导致堆栈溢出。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（二）：优化包体传输]]></title><link>https://blog.csdn.net/needmorecode/article/details/129912017</link><guid>https://blog.csdn.net/needmorecode/article/details/129912017</guid><author>needmorecode</author><pubDate>Sun, 02 Apr 2023 23:32:13 +0800</pubDate><description><![CDATA[大家好！我是长三月，一位在游戏行业工作多年的老程序员，专注于分享服务器开发相关的文章。这个系列本来计划每周更新一篇。本周因工作事情比较多，拖到周日才更新，让大家久等了。这次的主题是优化包体传输，是网络通信类别下的第二篇。在游戏服务器的部署环境中，机房的网络带宽都是有限制的。如果通信传输的数据总量太大，会挤占带宽甚至达到带宽上限，影响正常消息发送。另外，如果包体太大，在弱网环境下的通信质量会变差，更容易发生丢包重传和延迟，而且大包对于截包和查找问题也不方便。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（目录）]]></title><link>https://blog.csdn.net/needmorecode/article/details/129544872</link><guid>https://blog.csdn.net/needmorecode/article/details/129544872</guid><author>needmorecode</author><pubDate>Thu, 23 Mar 2023 09:46:06 +0800</pubDate><description><![CDATA[本目录用于游戏服务器开发指南系列，分门别类存放文章的链接地址，方便读者快速索引。目录按不同的主题组织，如网络通信、数据存储等，每个主题会包含若干篇文章。个人计划是平均每周写一篇，写作基于平时工作中产生的灵感，因此不一定会按照主题的排列顺序来。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（一）：设置合适的Socket选项]]></title><link>https://blog.csdn.net/needmorecode/article/details/129658134</link><guid>https://blog.csdn.net/needmorecode/article/details/129658134</guid><author>needmorecode</author><pubDate>Thu, 23 Mar 2023 09:41:53 +0800</pubDate><description><![CDATA[上周写完系列序言，得到不少读者朋友的关注，这也给了我额外的动力。写东西就是这样，都希望获得更多的关注，如果写出来没什么人看，那就无异于闭门造车、自娱自乐。欢迎朋友们在文后留言，我也会根据大家的反馈适时调整写作的内容和方式。我在这里整理了一个系列目录，用于分门别类存放文章的链接地址，方便读者快速索引。目录按不同的主题组织，如网络通信、数据存储等，每个主题会包含若干篇文章。个人计划是平均每周写一篇，写作基于平时工作中产生的灵感，因此不一定会按照主题的排列顺序来。]]></description><category></category></item><item><title><![CDATA[游戏服务器开发指南（序）]]></title><link>https://blog.csdn.net/needmorecode/article/details/129480216</link><guid>https://blog.csdn.net/needmorecode/article/details/129480216</guid><author>needmorecode</author><pubDate>Tue, 14 Mar 2023 09:52:50 +0800</pubDate><description><![CDATA[一方面，作为一个十多年经验的游戏开发者，很希望把自己掌握的知识和经验系统化；在当前浮躁的社会背景下，技术大概率是无法做一辈子的，但是深耕一个领域，尽可能延长自己的职业生涯，增强不可替代性，无疑是有益的。系列标题是《游戏服务器开发指南》，它也揭示了本系列的写作主题：汇集游戏服务器开发领域一些有价值的经验法则，这些经验法则来自与业务实际紧密相关的细分话题，结合本人多年经验和实践，确保分析深入浅出。在我多年的游戏服务器开发生涯中，学习过大量网络编程和数据存储方面的知识，也看过不少游戏服务器相关的书籍。]]></description><category></category></item><item><title><![CDATA[手把手教你写一个极简版Jedis]]></title><link>https://blog.csdn.net/needmorecode/article/details/129392099</link><guid>https://blog.csdn.net/needmorecode/article/details/129392099</guid><author>needmorecode</author><pubDate>Fri, 10 Mar 2023 23:44:56 +0800</pubDate><description><![CDATA[Jedis是Redis官方推荐的Jedis客户端，在业界使用非常广泛。通过阅读Jedis源码，可以掌握如何设计和实现一个轻量级、带连接池的Redis客户端。我常常说，学习源码最好的方法就是以自己的思考重新写一遍，这样有助于把学到的知识固化成实际经验。本文会带着你从零开始设计一个极简版的Jedis，从支持最简单的GET/SET命令出发，逐步添加缓冲区、多种命令、断线重连、连接池等多种功能。本文的源代码放在Github上（mini-jedis），感兴趣的读者可以自行取阅。]]></description><category></category></item><item><title><![CDATA[5天带你读完《Effective Java》（四）]]></title><link>https://blog.csdn.net/needmorecode/article/details/129221519</link><guid>https://blog.csdn.net/needmorecode/article/details/129221519</guid><author>needmorecode</author><pubDate>Sat, 04 Mar 2023 22:31:19 +0800</pubDate><description><![CDATA[Effective Java》是Java开发领域无可争议的经典之作，连Java之父James Gosling都说： “如果说我需要一本Java编程的书，那就是它了”。它为Java程序员提供了90个富有价值的编程准则，适合对Java开发有一定经验想要继续深入的程序员。本系列文章便是这本著作的精华浓缩，通过阅读，读者可以在5天时间内快速掌握书中要点。为了方便读者理解，笔者用通俗易懂的语言对全书做了重新阐述，避免了如翻译版本中生硬难懂的直译，同时对原作讲得不够详细的地方做了进一步解释和引证。]]></description><category></category></item><item><title><![CDATA[5天带你读完《Effective Java》（三）]]></title><link>https://blog.csdn.net/needmorecode/article/details/128354325</link><guid>https://blog.csdn.net/needmorecode/article/details/128354325</guid><author>needmorecode</author><pubDate>Sat, 25 Feb 2023 18:55:24 +0800</pubDate><description><![CDATA[标记接口是一种不包含任何方法声明的接口，它只是标记它的实现类具有某种特性。如Serializable 接口，实现此接口的类可以写入ObjectOutputStream（被序列化）。如果要定义类型，那么使用标记接口优于使用标记注解。标记接口定义的类型由标记类的实例实现；标记注解不会。前者在编译时捕获错误，后者在运行时才能捕捉错误。可以更精确地定位。标记注解可以应用于任何类或接口，而标记接口限定于它的实现类。标记注解的优点是：它们可以是其他注解功能的一部分。]]></description><category></category></item></channel></rss>