自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

focus-unchanged-thing

专注于纷繁快速变化中那些不变的东西

  • 博客(635)
  • 资源 (12)
  • 收藏
  • 关注

原创 lombok报错找不到set和get方法

【代码】lombok报错找不到set和get方法。

2023-01-12 17:28:45 527 1

原创 【查看内存使用情况】free -h

【代码】【查看内存使用情况】free -h。

2023-01-10 14:56:28 386

原创 npe定位技巧 1.为了性能,idea并不会打印出来哪个是空指针 2.加了断点,idea会提示出来哪个是空指针

背景:在跑工程时,发现有空指针,也看到日志了,排查时,却不知道哪个变量引起的,当时想着:不会打印出哪个变量是空指针嘛?通过log,是无法判断出谁是空指针。

2023-01-10 10:46:44 183

原创 【装饰模式】在游戏中的使用例子

例子1:将Redisson包装为自己的GameRedis组件 // 提供一致的接口。例子2:将网络封装为自己的NetWork模块。例子3:将策划的技能配置包装为自己需要的接口。

2023-01-08 14:45:38 98

原创 【拦截器的使用】 1.HandlerInterceptorAdapter(拦截逻辑) 1.WebMvcConfigurer(配置哪些拦截器生效和拦截的路由)

2.LoginInterceptor.java // 拦截到后的逻辑(不包含拦截的路由)@RestController+@GetMapping实现路由。配置使用哪些拦截器(可配置多个) 和 拦截的路由。

2023-01-07 21:24:14 359

原创 枚举实战 1.好处:使用model避免方法参数过长,及其参数顺序换位导致的不正确 2.用途:商店、任务、活动...任何有多个分类的功能

【代码】枚举实战 1.好处:使用model避免方法参数过长,及其参数顺序换位导致的不正确 2.用途:商店、任务、活动...任何有多个分类的功能。

2023-01-06 10:18:07 108

原创 游戏web gateway何时需要分库分表

目前我们270W注册用户,没有分库分表。

2023-01-04 16:02:27 110

原创 vuex学习笔记

context.commit('add') // context相当于new出来的store。11)异步的操作数据: Action // action里面去调用 mutation。是响应式的,依赖于这个数据的组件将会自动同步,页面直接刷新。私有的数据存自身的data中就行,共享的数据,存vuex。2)vuex的共享 // 适合大范围的组件之间的数据共享。不同组件之间的共享 // EventBus。缺点:需要不想干的组件之间的传递,是非常麻烦的。13)Getter // 负责数据的包装。

2023-01-03 23:24:06 306

原创 (重点)【mybatis generator实战】 1.crud 2.计数 3.自定义复杂mapper代码组织 4.分页插件 5.重复生成xml报错问题 6.跳过指定单元测试

1.计数。

2022-12-31 23:51:50 676

原创 BufferedReader进行文件一次读取一行字符串

【代码】BufferedReader进行文件一次读取一行字符串。

2022-12-31 11:48:44 674

原创 【Thread.sleep(xxx)方法(让出cpu执行)妙用的2个案例】 1.MapThread管理 2.RobotThread管理

线程池中只有5个线程,但是,RobotThread确有10个,而且都没有停止,一直在while循环体中不退出,那么岂不是只有5个RobotThread能够被调度,其它线程抢不到了?优化策略:我们可以在每个RobotThread的一次while循环执行结束后,根据帧率,然后sleep(x)一下,这样子让出cpu,让其它的线程得到执行。我们可以一下子取出这个阻塞队列中的所有任务,执行完毕,然后sleep(5),这样子让所有的线程都能够得到执行。2.Robot压测机器人工程中。

2022-12-30 15:57:06 514

原创 IDEA常见问题(1.安装了插件无法重启 2.pb文件过大不识别)

同时编译还会发现需要的堆内存更多,直接启动,发现默认的700M堆内存,idea直接提示编译堆溢出,了解一点编译原理的知识,就会知道:其实这是因为在语法解析时,会需要很多的堆内存,毕竟解释器也是程序,运行起来自然需要内存。解决办法当然直接就是:加堆内存就行。如果编码采用protobuf的话,经常发现: 根据proto生成的java代码长度已经超过了5M,这时IDEA就识别不了这个java代码了。3.点击右上角的X关闭idea(也就是必须是关闭idea然后重启),而不是。这时你就发现,变为C了,而不是J。

2022-12-30 12:05:52 2190

原创 【jprofiler使用】1.部署在linux上的应用,其实也可以通过jvm参数+jprofile远程连接即可分析

JProfiler使用(Java分析工具)_BUG指挥官的博客-CSDN博客_jprofiler使用

2022-12-30 11:15:28 481

原创 1.异步http的实现: CloseableHttpAsyncClient(比如:GameServer需要请求Gateway时) 2.OKHttp3

jdk11之后,apache就提供的有 CloseableHttpAsyncClient 之类的接口,里面封装了java NIO,从而实现异步的请求。但是有一丁点网络知识的人肯定知道,带网络的这种必然要用NIO之类的去优化啊,肯定是事件的形式,不让CPU阻塞于io之上。在jdk1.7时我之前使用的都是阻塞类型的接口,有的封装的话,最多也是加上线程池之类的。

2022-12-29 17:39:26 344

原创 下载带有git://的不成功,改为url.“https://“.insteadOf 下载(vue-element-admin为例子)

可以看出来,相比vue-admin-template来说,这个作为脚手架是略微复杂的。但是作为star最高的项目,还是要看一下。

2022-12-28 15:11:22 560

原创 通过源码,引入工程(比如:调试netty、zfoo、zookeeper源码很好用)

点击+--》然后把想要引入的工程的pom.xml文件加入进来,就可以运行了。

2022-12-28 11:07:33 157

原创 【(windows版)nginx反向代理+负载均衡案例+静态文件服务器】 1.含启动重启和关闭3个脚本 2.vue案例必须修改vue.config.js

4)修改vue.config.js // 不修改会报错。注意:点击X并关不掉nginx进程,需要到管理器啥死。1)去官网下载windows版本nginx。

2022-12-27 18:57:21 7779 6

原创 思考上线后游戏数据库字段的管理

比如:拿csdn来说,在发表文章时,csdn增加了个必选的选项 "内容等级",在发表文章时,是必须勾选一个,这个属于最近新增加的功能。但是我之前发表出去的文章怎么办?但是:如果我把文章的内容:content,修改为了 data,那一下子就完蛋了,所有的文章全都不见了,引起灾难性的结果。游戏或者应用服务器在上线后,遵循的是:只增加不减少的原则。这个原则其实是很好理解的。当然了,很容易得出结论,之前已经发表过的文章,也没影响。

2022-12-27 14:55:38 92

原创 【使用WebAsnycTask完成异步任务处理】 1.支持超时回调 2.支持错误回调

其实这种就是高并发下有些统一的设计规范,跟Netty服务器其实是差不多的,就是:一些线程仅仅用于接任务,处理不处理的过来先不说,先把任务接过来再说。其中指定的异步线程池定义为:// ThreadPoolTaskExecutor 为SpringBoot中的类。然后处理的线程是独立的异步线程池,这样子:把接任务和处理任务区分开。思考:为啥使用独立的线程池处理业务?

2022-12-27 14:47:23 297 1

原创 GM架构设计 1.web管理后台调用httpserver使用http 2.游戏客户端则是直接发送协议

好在是:netty直接支持http服务,那我们可以在游戏服启动时,顺手启动一个http服务即可,为了不阻塞游戏服,需要单独开一个线程启动,当然了,这个并发很低是内部用的,因此boss和worker线程数设置为1即可。web服的话,其实就是发送http请求,GameServer下的HttpServer就可以接到请求,进行相应的处理即可。1.是客户端输入gm,其实就是发送请求,我们直接处理。GM的本质:gm说白了就是能调用到我们在游戏服写好的GM接口。那这就涉及到了进程间的通信,毕竟gm后台是web服务。

2022-12-27 11:40:11 1421

原创 【vue-admin-template快速开发游戏后台管理系统】

之所以研究这个项目,就是因为我们游戏后台就是基于这个模板开发的,是非常稳定的。这样子,有了这个模板,就可以无需再去创建项目之类的工作了,直接进入开发阶段。

2022-12-27 10:40:12 727

原创 【jprofiler应用之-若依后台管理系统性能分析】

可以看出过滤器中有些比较耗时的方法,方法名字都是很清晰的,需要进一步看下实现。对象增长较为稳定,不断地GC,增加和减少呈现波浪形,无一直增长不回收的对象。可以看出,程序中http线程数量是最多的,是一些执行业务方法的线程。这些scheduler线程都是出于waiting状态。内存比较正常,呈现波浪形,不断地分配和GC回收。1.内存、GC、CPU负载总览。3.哪些方法是性能热点。2.哪些对象占用的多。4.系统中的线程信息。

2022-12-26 23:06:51 465

原创 【jprofiler应用-oom原因定位】

5.通过jprofiler启动游戏服务器 // 可以看到在指定入口函数后,idea中jpofiler按钮是亮着的。File-->Setting-->Plugins 搜索jprofiler插件然后安装。2.使用KeyGen.exe生成注册码然后输入。3.idea中安装jprofiler插件。4.以一个内存溢出的程序为例子进行分析。1.安装jprofiler。

2022-12-26 15:34:54 972

原创 java进程的2种启动方式: 1.java -cp(其实就是classpath) 启动类 2.java 启动参数 -jar xx.jar

我们的Gateway这个web服务由于是个SpringBoot工程,启动方式是这样子的。这种方式很普遍,几乎我们线上GameServer都是这种方式启动的。1.java -cp(其实就是classpath) 启动类。2.java 启动参数 -jar xx.jar。

2022-12-22 11:48:32 1048

原创 【策划Excel配置导出java实体json数据】

1.生成代码必然用FreeMarker模板引擎,首先肯定是读取excel文件,根据sn等内容,先填充好模板数据,从而生成对应的java entity文件。2.其次是导出数据为json,写文件为json,等游戏服务器启动的时候,就把json文件加载到java Entity中,从而实现内存数据的加载。那使用fastjson 的JSON.toJSONString即可实现把excel的内容序列化为json文件,然后写入。

2022-12-21 16:35:43 519

原创 请使用xlsx格式的excel配置文件

右键--》新建,打开这2个按钮时,却有xlsx与xls 这2个格式,这2个有啥区别呢?可以看出来,xlsx是xml结构的,较新,且具有兼容性的文件格式,所以以后我们写工具读取excel,也一定要采用这个格式。是xml类型的结构,采用基于xml的压缩格式,占用空间更小;xls不兼容xlsx格式,有时造成文本打不开的情况;是excel 2007及其以后版本生成的文件格式;是旧的excel 2003及其以前的文件格式;xlsx是想下兼容的,可以兼容xls格式;是特有的二进制格式;

2022-12-21 10:52:07 244

原创 奇怪的文件路径问题(\ \\ / //等) getAbsolutePath与getCanonicalPath

不断地修改SERVER_PATH 和 PROTO_PATH,发现构造出来的路径千奇百怪,但是最终构造出来的File,发现都是存在的。其实,File内部有一定的纠错能力,如果不是标准的路径,会进行一定的处理。// 这种是报错的,\是特殊符号,因此需要写成 "\\"转义下才行。

2022-12-20 15:38:39 254

原创 Runtime 执行命令与StringTokenizer的知识

总结:StringTokenizer构造方法默认传入要处理的字符串,分隔符的话,默认使用 \t \n 空格等,这样子就可以解析出来了。在Runtime run = Runtime.getRuntime();进入exec内部,就可以看到对于命令会先进行分割。

2022-12-20 15:31:22 65

原创 [游戏服务器线上部署方式]assembly方式打包

这样子,配置、lib包、脚本 等都分开放到指定的目录,然后通过bin下的脚本去管理和停止服务器。

2022-12-19 16:13:50 263

原创 bat中调用jar包

2.指定入口的java文件。1.指定依赖的jar包。

2022-12-15 11:36:43 161

原创 【jar包关联到源码】1.xdb源码的阅读

最近在阅读xdb的源码,但是:由于项目中提供的是jar,其实jar里的源码已经被反编译过的,和真正的源码略微不太一样,开始自己在项目中直接跳转总是跳转到jar中的代码,很是恶心。后来,突然想起来可以关联源码,就立马:choose source code--》关联好tools下的源码,就可以直接跳转到真正的源码中了。

2022-12-05 10:11:37 135

原创 【vue+webpack开发游戏】 1.$emit和$on实现组件间通信 2.通过css实现UI显示隐藏

1)安装node.js2)安装vue cli npm install -g @vue/cli npm i -g @vue/cli-init // 必做3)新建:项目 vue init webpack cardBattle 然后各种y 4)运行:创建的脚手架项目 cd cardBattle npm run dev 5)发布: npm run build // 此时就会生成dist目录6)vue的一些生命周期函数:

2022-12-05 01:27:30 352

原创 【ReentrantLock源码分析】1.xdb中的使用 2.获取和阻塞(阻塞前的一些死心不改)的源码

1.xdb中的使用例子在xdb中,我们大概执行业务时的流程简化如下:思考:为啥我们用ReentrankLock而不是synchronized呢?因为:我们需要提供可重入的特性,而且释放是要控制在:事务完成后(不管是回滚了还是提交成功了)才释放锁,因此要使用这种显示锁。2.源码分析step1实现如下:可以看出来,默认情况下,是非公平锁,想想目前我还没有遇到要用公平锁的情况。step2接下来是上锁:进入到acquire里面:这里走非公平下的获取:再次进入:既然没有

2022-12-03 11:54:00 181

原创 【jvm如何在设计层面实现线程实现停顿时间控制的思考】

Region: 其实就是将要垃圾回收的区域以“块”的方式进行管理,这样子就可以非常精确的实现到底一次扫描多少,一次回收多少这种较为精确的控制。因此,jvm调优本来就是为了实现:停顿时间 和 gc频率的控制,后续的垃圾回收算法如:zgc,都是以:块为单位,来做优化。不然,你想想,各种cms之类的垃圾回收器,压根没办法控制到底怎样回收,扫到多少,咋回收,其实不好控制。

2022-12-02 15:49:23 128

原创 【游戏服使用之jdk动态代理】1.实现类要实现InvocationHandler接口并传入Object

用途:动态代理,必然是为了不入侵之前代码的基础上动态增强功能,比如:一个方法要统计耗时,那么就可以使用。

2022-11-30 15:36:01 391

原创 【java黑科技之-字节码的2种应用】1.javassist 2.agent(监控与调试)

毫无疑问,java最实用的一个就是“热更新”机制了,go语言再好,这点很难实现,java这一点就是非常牛逼的,不管你性能再高,热更新实现不了,在游戏服务器这里,绝对是硬伤。我觉得这就是java最牛逼的地方了,有了字节码这个中间层,我们能做的东西实在太多太多了,像go这种,我认为就只能适合写中间件了,做游戏这块,抽象能力差,热更新机制很难实现,那就不太适合了。比如:统计方法耗时,或者做任何你想到的增强功能,都是可以。自己手写的话,可以用于实现动态代理,动态增强类的功能。

2022-11-25 23:46:21 634

原创 【synchronized是可以保证变量的可见性的】

3.其实,synchronized在修改了本地内存的变量后,解锁前会把本地内存修改的内容刷新到主内存中,确保了共享变量的值是最新的,也就保证了可见性。1.我们都知道,jmm的存在导致java的线程其实读取的都是本地的副本(为何出现jmm,其实是为了实现平台一致性),因此会出现可见性问题。2.猜想:那么加了synchronized后,如果还不能保证可见性,那就没有办法保证可见性了呀!select:其实也是上锁,因此必定能读到最新的数据。get: 修改时加锁,这样子也保证能取到最新的数据。

2022-11-24 13:23:56 743

原创 【jmm】1.解决平台一致性的问题 2.又引起可见性的问题 3.volatile

出现原因:因为不同平台,硬件层面,对内存可见性有可能不一致,因此jmm的出现就是在不同平台抽象出一致的行为。允许直接操作共享内存,因此无可见性的问题,但是:有可能一个线程修改完后,并不会立即修改写回主内存。缺点:只允许操作本地方法栈,不允许直接操作共享内存。

2022-11-22 22:37:53 71

原创 【happen before】

jvm在设计的时候,将提前可知的先后逻辑关系的程序,内置jvm中。jvm内置的,保证先后逻辑关系的保障。

2022-11-21 15:57:22 64

原创 【屏障的2种实现】1.lock 与 fcene(mfcene、lfcene、sfcene) 2.volatile和synchronized其实都是屏障的实现,会保证从主内存读从而保证可见性

mfcene:类似于在硬件层面搞了一个队列,这样子cpu之间本身就竞争,效率相对更低。lock:是一个cpu在写的时候,另外一个cpu要阻塞着。

2022-11-21 15:54:13 85

Unity 3D网络游戏实战(全)

Unity 3D网络游戏实战(全) Unity 3D网络游戏实战(全) Unity 3D网络游戏实战(全)

2018-08-10

JavaScript设计模式与开发实践-源代码

JavaScript设计模式与开发实践-源代码 JavaScript设计模式与开发实践-源代码

2018-06-03

JavaScript函数式编程

JavaScript函数式编程_PDF电子书下载 高清 带索引书签目录_(美)佛格斯著_北京:人民邮电出版社_P204_2015.08

2018-06-01

编写可维护的JavaScript

编写可维护的javascript 编写可维护的javascript 编写可维护的javascript

2018-05-28

JavaScript应用开发实践指南.pdf

JavaScript应用开发实践指南 JavaScript应用开发实践指南

2018-05-17

markdown写的简历模板

作为程序员,当然应该不用什么word之类的来写简历,我们应该使用简洁美观的markdown编辑器来完成

2018-04-25

MASM汇编语言新手入门

MASM汇编语言新手入门

2012-03-30

C++编写的图书馆管理系统

C++编写的图书馆管理系统

2012-03-30

C++ 0-1背包问题源代码

C++ 0-1背包问题源代码

2012-01-03

航海乘务管理系统C++源代码

航海乘务管理系统C++源代码.

2012-01-02

图书馆管理系统C++源代码

C++开发的图书馆管理程序源代码

2012-01-02

空空如也

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

TA关注的人

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