自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(134)
  • 资源 (1)
  • 收藏
  • 关注

原创 谈谈分布式游戏服务器

分布式的意义游戏服务器为什么要设计成分布式?很简单的原因,为了支持服务器有更多的玩家同时在线。这里的同时在线,是要求玩家能一起交互,而不是简单的在平行世界独立you x

2021-06-14 13:41:12 2728 1

原创 游戏服务器之使用starter自动配置数据仓库组件

本文介绍如何使用springbootstarter打造优雅的配置数据一站式服务。/** * 配置读取仓库(只读) */public interface DataRepository { /** * 根据主键读取指定文件的配置数据 * @param clazz * @param id * @param

2021-05-04 12:57:16 513 1

原创 游戏服务端框架之csv配置格式

游戏策划大佬一般采用excel工具来管理游戏里的数值配置。对于服务器来说,Excel不是唯一的格式。典型的说,服务端很少直接将Excel文件作为数据源,服务器设计更喜欢选择将Excel导入数据库,或者将Excel文件转为CSV格式。CSV格式相对于Excel格式来说,属于纯文本格式,体积小,更方便程序解析。本文介绍如何使用csv库进行二次封装。

2021-04-17 12:57:57 660 1

原创 游戏服务端框架之本服实时排行榜

常规的排行榜设计,为了减少计算的工作量,一般采取定时刷新。这种设计从游戏策划的角度来说,也是允许的,只需要在排行榜UI上说明下刷新频率即可。本文主要介绍如何实现一个本服的实时刷新排行榜。

2021-02-27 13:27:38 1167

原创 游戏服务端框架之自定义orm持久化工具(二)

游戏服务端框架之自定义orm持久化工具这篇文章,实现了一个简易的ORM框架,可以满足日常的开发需求。但仍然有优化的空间,以便更适应游戏服务器的应用场合。本文继续对orm工具做进一步的优化改善。

2021-02-11 23:55:07 436

原创 游戏服务器框架之分布式id生成器

在游戏世界里,我们用id来唯一索引某个对象。小到一个道具,大到一个玩家,都是需要唯一ID。为了保证游戏服务器进行合服后,数据依然有效不重复,我们需要产生全局唯一性的id。本文探讨分布式id生成器的两种算法。

2021-01-31 23:28:25 498 2

原创 游戏服务器框架之跨服(三)

回调设计是跨服基础的一个设计难点。类似于JavaScript的Ajax请求,我们希望在向跨服发送请求,拿到服务器的返回结果后能够执行一些回调动作。本文介绍下回调设计原理。

2021-01-10 22:58:30 1075 11

原创 Java实现数据劫持——监听属性变更

目录背景JS数据劫持Java数据挟持使用jdk的PropertyChangeSupport实现属性监听使用Cglib实现属性监听背景java在使用JavaBean的时候,有时我们需要监听属性的变更。例如在访问bean的getter方法,或者调用bean的setter方法时,进行拦截。在不对现有的所有代码进行入侵修改的前提下,有什么方法优雅解决这个问题呢?JS数据劫持JS的“数据劫持”提供了一种机制,允许程序对对象数据的访问与修改之前进行拦截。Vue能够在修改模型...

2021-01-09 12:58:29 3232 1

原创 游戏服务器框架之跨服(二)

rpc框架的优势直接使用rpc框架来搭建跨服,我们就无需考虑跨服链路的建立,通信数据编解码,方法回调等底层问题。手写跨服通信rpc的本质其实就是跨服通信,底层是使用socket来进行数据传输的。所以我们也可以使用socket来手写一个跨服通信。服务器与服务器之间点对点的通信,其实类似于游戏客户端与游戏服务器通信。不同的是,游戏客户端与服务器属于外部网络通信,需要走公共ip,是不安全的链接;而服务器与服务器的通信,属于内部通信,可以直接用内网ip进行通信。实现跨服通信,我们需要解决以下问题:注册

2020-12-19 22:08:47 1237 1

原创 介绍Go的三种基本高阶函数

Go的高阶函数高阶函数定义map()函数filter()函数reduce()函数高阶函数定义函数式编程语言将函数作为第一等公民,也就是说,函数可以作为参数,也可以作为返回值。将函数作为参数,或者返回值的特殊函数,就叫做高阶函数。下面介绍三个最基本的高阶函数。分别是map,filter,reduce。由于Golang不支持范型,使用interface{}+反射又显得复杂,下面的例子只使用int类型进行演示。map()函数由于map是Go内置的关键字,所以将map改为mapper函数。func

2020-12-19 16:29:13 1363 1

原创 游戏服务器框架之跨服(一)

如今的游戏开发,不搞个跨服玩法都不好意思说在做游戏了(当然,也跟游戏类型有关,一些轻度休闲游戏可以排除在外)。跨服玩法的设计,可以进一步激发玩家追求高战力的虚荣心,也可以汇聚玩家数量,避免单服日活跃低呈现死服现象。几种常见的跨服玩法拓扑结构一,不同游戏服的玩家进入中立服务器进行战斗,例如跨服天梯类玩法。游戏服有很多个节点,中心服务器也有很多节点。只要保证对战的双方同时进入同一个中心服游戏进程即可。二,若干个游戏服组成一个社区,全部服务器包含多个社区,例如世界服玩法。三,游戏服A玩

2020-12-12 21:20:29 4581 2

原创 理解Go面向对象的三大特征

面向对象三大特征:封装,继承,多态。Go不是一门纯面向对象编程语言,它没有class(类)的概念,也就没有继承的说法。但Go也可以模拟面向对象的编程方式。

2020-11-29 17:12:29 502

原创 游戏服务端框架之代码热部署(二)

上一篇手游服务端框架之代码热部署介绍了如何利用JDK的Instrument工具来对java代码进行热更新。这种热更方式有一个限制,就是不能修改类的结构,也就是说,我们只能进行方法级别的代码修复。本文将介绍另外一种热更新机制。那就是基于类实例替换。

2020-11-21 21:19:41 420 2

原创 手游服务端框架之合区工程

如今的游戏服务器运营策略一般为“滚服模式”。简单来说,就是运营商不停的开新区,不活跃的旧区就进行合区。这样一来,运营商既可以降低服务器硬件配置,缓解大服人数压力,也可以利用新区拉活跃猛赚一笔。本文天我们就来介绍下游戏服务器的合区工程。

2020-11-15 22:14:56 795 7

原创 java游戏服务器之使用Javascript脚本

JavaScript,一开始定位为浏览器表单验证的“玩具语言”,发展到如今,却能胜任各种舞台。nodejs,es6等等,奠定了其作为后端语言的地位。在JVM里,我们也可以直接使用javascript代码,因为jdk已默认绑定其实现。由于拥有动态语言灵活的特点,我们可以用来作很多有趣的事情。在游戏服务端开发,我们越来越多可以看到它的身影。下面我们就来看下javascript在游戏服务器里的应用。

2018-05-18 23:05:04 1112 3

原创 游戏服务端框架之跨服匹配服

如今的手游世界,如果没搞个跨服赛事,都不好意思说它是一个手游了。说到跨服,就不得不说下匹配服了。比如一个跨服天梯赛事,需要满足不同服的玩家能够同屏PK。为了能够把实力接近的玩家作为对手,我们需要一个独立的匹配服来收集数据,然后进行房间分配。匹配服,也是跨服赛设计的基础。典型的匹配服通信层我们可以采用http,也可以采用socket。本文将采用http作为游戏服与匹配服的通信层。

2018-03-10 18:53:18 5061 4

原创 游戏服务器之AI设计——有限状态机

游戏世界里有各种各样的AI行为,例如怪物砍人,玩家自动挂机等等。一个游戏好不好玩,很重要一点就是游戏的A质量,毕竟PVE占玩家游戏时间很大比重。当然,游戏AI设计难度非常大。本文介绍如何使用有限状态机实现简单的游戏AI逻辑。

2018-01-06 21:42:35 4233

原创 Netty网络聊天室之优雅的JavaFX界面开发

Java在服务端领域能够独占鳌头,然而,在客户端领域一直不温不火。Java的客户端技术,从AWT,SWING,SWT,一直到JAVAFX,即使每一代都有非常大的改善,但仍改变不了它尴尬的地位。不管怎样,javafx的设计理念还是非常优秀的。它借鉴了html开发的特点,将代码,界面,样式三者分离。使用java代码来控制逻辑,使用xml来设计界面,使用css来控制样式。本文将从不同的方面介绍javafx的编码方式。

2017-11-26 21:04:02 8133 5

原创 游戏服务端框架之使用Redis实现跨服排行榜

实现跨服排行榜的常规方法游戏里为了刺激玩家的攀比心理,经常有各种各样的排行榜。排行榜又可以分为本服排行榜以及跨服排行榜。简单说来,本服排行榜上的记录来自本服的玩家,而跨服排行榜上的记录是来自所有服务器前N名玩家。通常,跨服排行榜含金量更大,奖励也更为丰富。从技术上而言,实现起来也更为麻烦。典型地,实现跨服排行榜有一下几种思路。取其中某个服务器作为中心服,用来收集各服排行榜数据并进行广播;使用独立进...

2017-10-06 22:14:07 3378 3

原创 java游戏服务器业务之每日重置逻辑

大部分游戏都有每日重置的逻辑。关于每日重置,我们需要考虑两个问题。一个是如何区别在线玩家和离线玩家,一个是保证业务的线程安全的。本文提供一种方式,比较简单地实现了重置业务。

2017-09-17 19:38:46 2664 5

原创 游戏服务端框架之客户端协议组合下发

很多时候,客户端一个请求过来,服务端可能需要发多个响应消息。典型地,当客户端请求加载登录加载资源完成,服务端需要推送非常多的消息。功能模块越多,消息也越多。这个时候,可能就需要对下发的客户端协议进行优化。个人理解,针对这种情况,比较好的优化方式是整合多个小消息一起下发。也就是说,对于多个消息,我们不直接一个一个下发,而是把多个消息看作一个特殊的消息组合下发。多包组合下发至少有以下几个好处:1. 省...

2017-09-08 12:20:41 2722 5

原创 手游服务端框架之后台管理工具

后台管理工具在游戏运营中的作用手游功能的更新迭代是非常频繁的,有些项目甚至每个星期都会进行停服更新。也就是说,对于生产环境的游戏进程,我们必须有工具能够对游戏服务进行维护,例如更新维护,或者对游戏内部各种资源进行管理。本文主要介绍管理后台的实现方案。

2017-09-03 22:45:01 8890

原创 游戏服务端框架之使用事件驱动解决业务高耦合

游戏里经常有这样的业务,当玩家触发某个动作时,有若干与之关联的业务也要一起执行。诸如这样场景,我们选择引入事件驱动模型来帮助我们解决业务代码耦合的问题。本文实现一个工具库,来解决监听器与事件多对多的关联问题。

2017-08-14 22:11:10 2357 1

原创 Netty网络聊天室之使用spring管理各种组件

spring是web开发的宠儿,不管mvc框架选择structs还是SpringMVC,IOC容器都是选择Spring。Spring有两个主要的作用,一个是IOC(依赖反转),另一个是AOP(面向切面编程)。在我们的聊天室,我们也将使用Spring容器来管理各种组件。

2017-08-10 21:04:16 1815 1

原创 Netty网络聊天室之会话管理

浏览器第一次与服务器建立连接的时候,服务器就会自动为之分配一个Session。在我们的聊天室,也可以使用Session来判断用户是否经过登录验证,保存用户的各种信息,向客户端发送消息。这极大方便了程序对客户端的管理。

2017-08-05 16:36:08 12539 11

原创 java游戏服务器框架之GM金手指的设计

游戏开发需要一些命令,能够像金山游侠这种软件一样,修改游戏里的玩家或公共服务的数据。在游戏项目里,这些命令统称为GM命令。本文将介绍实现gm系统的一种方式。

2017-07-30 16:01:47 4931 1

原创 游戏服务器框架之使用Guava构建缓存系统

缓存,在项目中的应用非常之广泛。诸如这样的场景,某些对象计算或者获取的代码比较昂贵,并且在程序里你不止一次要用到这些对象,那么,你就应该使用缓存。缓存,在项目中的应用非常之广泛。诸如这样的场景,某些对象计算或者获取的代码比较昂贵,并且在程序里你不止一次要用到这些对象,那么,你就应该使用缓存。

2017-07-23 15:03:00 1863 1

原创 游戏服务端框架之配置与玩家数据库设计

一款网络游戏的设计,至少需要策划数据库和用户数据库两种数据库。本文主要介绍这两种数据库的设计及使用,同时,介绍如何通过ORM框架来完成玩家数据的持久化。

2017-07-16 20:56:19 7813 19

原创 游戏服务端框架之业务线程模型

玩家的消息请求如果放在mina的io线程池进行处理,当业务处理非常耗时,会严重影响io的吞吐量。所以,我们应该另起用于处理业务逻辑的线程池,采用生产者消费者模型,异步处理玩家请求。

2017-07-12 23:17:48 4359 6

原创 java游戏服务端框架之模仿SpringMvc实现消息路由

经典web开发项目通常采用三层架构来组织代码。典型的,第一层为表现层,通常使用MVC模式;第二层为业务逻辑层,该层主要是各种service业务操作类;第三层则为数据访问层。类似的,我们的游戏项目也可以采用上面的三层架构,使用@MessageRoute注解对应MVC模式的控制器,使用@RequestHandler注解对应的消息处理。

2017-07-02 14:53:56 3399 2

原创 java游戏服务端框架之网关

网关介绍游戏服务器的网关,主要是用于手机客户端与游戏业务服务端通信的中转器,负责接收来自手机客户端的请求协议,以及推送服务端的响应包。在单一进程服务端架构里,网关跟游戏业务处理是在同一个进程里。为了提高通信吞吐量,一些服务端架构将网关作为一个独立进程。这种模式下,客户端请求全部由网关接收,再通过网关转发给服务端;另一方面,服务端下发的消息,也只能通过网关推送到客户端。由于只有客户端跟网关是一对一的

2017-06-24 14:17:39 7433 4

原创 游戏服务器之防御式开发

游戏服务端承担着游戏复杂业务逻辑实现,玩家数据持久化等重要作用。作为一个合格的服务端开发人员,我们有必要遵守一些好的防御手段,让自己的代码少踩些坑,或者当出现了bug,能够在第一时间进行抢救。本文是我在开发过程中的经验总结。

2017-05-29 21:04:42 1931 1

原创 理解Go的Goroutine和channel

go的goroutine和channel组合为解决并发场景提供了新的实现手段。本文主要是帮助读者更好地理解goroutine和channel两个概念。

2017-04-21 14:30:39 4290 1

原创 手游服务端框架之自定义orm持久化工具(一)

使用持久化框架诸如Hibernate过于重量级,使用原生jdbc又显得非常啰嗦。本文通过几百行代码,演示一个轻量级的持久化框架。可以用于游戏服务端的数据持久化方案。

2017-03-18 15:34:50 6379 15

原创 游戏服务端之使用JMX监控游戏进程

游戏服务器运行过程中,我们希望能够对游戏里各种资源进行监控。比如,查看在线玩家总人数,查看内存使用情况,统计请求消息数量等等。这种问题归结起来就是,我们希望查看游戏进程的内存数据。本文将介绍一种黑科技(JMX),让监控游戏服务器更加方便快捷。

2017-02-26 13:32:08 1617

原创 细数jdk库的四宗罪

众所周知,jdk库非常庞大,有非常多精心设计的工具可以拿来用;而且,jdk版本的向下兼容性也做得非常好,升级版本对旧项目来说没多大困难。由于这两点原因,jdk不可避免地存在一些设计上的缺陷。为了保障旧项目开发的利益,这些设计缺陷只能随着众多版本被继承下来。个人总结了一下JDK设计里出现的“四宗罪”,算是一种反面教材,在平时自己的开发设计上应该避免。

2017-01-18 11:55:57 1199

原创 游戏服务器框架之关于玩家数据的解决方案

玩家数据是游戏系统的血液,必须保证有高效正确的处理方案。本文将从持久层框架的选择、数据表结构设计以及数据入库模型三个方面,讨论玩家数据的相关解决方案。

2016-11-04 23:06:32 10328 5

原创 手游实时对战初步解决方案

对于一款战斗手游来说,如果没有实时对战,那么它就是不合格的产品,也不能够在玩家里产生江湖的战场。实时战斗的设计开发是一项重大工程,保证玩家双方表现尽可能一致以及数据的完整性和可靠性,是我们设计的重点。本文介绍了自己项目在实现pvp的设计理念,希望其他有经验的同行好友,能够一起交流,互为补充。

2016-09-24 17:48:01 4082 1

原创 hashmap死循环示例及检测方法

hashmap属于线程不安全容器,在并发环境有可能发生死循环。本文将模拟死循环出现的场景,再结合jstack说明如何一步步定位出现死循环的代码。

2016-08-13 16:39:27 6838

原创 游戏服务端之查看生产环境的内存数据

维护生产环境项目的时候,在排查问题的过程中,有时强烈希望查看内存中的一些数据,却苦于没有办法将这些值输入到终端或日志中。本文将使用动态执行脚本和使用自定义类加载器执行临时代码两种方式查看远程内存数据。

2016-08-02 17:54:47 5678 2

Java哲学家就餐GUI演示

java就哲学家就餐问题进行GUI演示,包含代码+资源,可直接运行

2024-02-27

并发题库 (含参考答案).md

52道java常用的并发面试题目,包含答案。

2021-02-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除