- 博客(55)
- 收藏
- 关注
原创 游戏中线上已有功能迭代的兼容问题
在游戏开发过程中,难免会有对线上已有功能进行迭代优化的需求。站在后端的角度来看,难点在于,如何在保证不会影响到用户的前提下,顺利进行对功能的升级和优化。关键在于兼容。兼容分为功能配置、代码、用户数据和接口的兼容性。
2024-03-23 18:24:14 539
原创 使用sunshine和moonlight实现远程游戏串流
过年回家想要打游戏,但是苦于家里没有电脑,又没办法把电脑搬回去,于是想到了使用串流的方式。实现串流的软件有多种:1. moonlight。因为仅实现了 NVIDIA 的游戏串流协议,所以只支持 N 卡。2. Steam Link。支持 steam 的游戏。3. Sunshine。支持 AMD, Intel, 和 Nvidia 三家的显卡。而且支持使用 Moonlight 作为客户端。开源。4. Parsec。其实是一个远程桌面的商业解决方案,不仅仅能用来打游戏。需要注册账号且闭源。
2024-02-28 21:10:32 32140 2
原创 游戏中排行榜的后台实现
游戏中经常会有排行榜需求需要实现,例如常见的战力排行榜、积分排行榜等等。排行榜一般会用到 Redis 来实现,原因是:1. Redis 基于内存操作,速度快2. Redis 提供了高效的有序集合 zset
2024-01-28 23:03:39 2288
原创 Integer中bitCount方法的源码解析
Integer 中的 bitCount() 方法用于统计二进制数字中 bit 为 1 的个数,例如 `0b111` 中 bit 为 1 的个数有 3 位。
2023-12-10 21:13:20 251 2
原创 WSL登录时提示nsenter: cannot open /proc/320/ns/time: No such file or directory的解决办法
在登录 WSL 的 Ubuntu 时,不仅要求 root 权限,还登录失败,提示“nsenter: cannot open /proc/320/ns/time: No such file or directory”。解决办法是在 powershell 中执行 “wsl – sudo vi /etc/profile”命令,删除文件内容,保存便可成功登录。
2023-11-23 23:03:27 757
原创 如何下载OpenJDK及其源码
然后在 IDEA 中选择解压后的 JDK 源码,位置在 File->Project Structure->SDKs->Sourcepath,并移除压缩包的路径,便能在 IDEA 中直接编辑 JDK 的源码。下载,这里存放了 JDK 长期支持版本,包括 6,7,8,11,17 和 21,还能下载小版本号的 JDK。最简单的办法就是在 JDK 压缩包内找到名为 src.zip 的压缩包,这个压缩包就是 JDK 的源码。,这里能下载 JDK9 及其以上的版本,还有 JDK 源码所在的 github 地址。
2023-11-23 23:02:46 5652
原创 Instant,LocalDate,LocalTime,LocalDateTime和ZonedDateTime
封装了从 1970-01-01T00:00:00Z 开始的秒数,相当于时间戳。
2023-10-29 20:05:17 241
原创 LocalDateTime与时间戳
因为时间戳指的是自 1970 年 1 月 1 日(00:00:00 UTC/GMT)以来的秒数,所以无论在哪个时区,同一时间获取的都是相同时间戳,可以用于跨时区。但是我们现实生活用到的本地时间是跟时区挂钩的,中国所在的时区是东八区,会比 UTC 时间快 8 个小时。时间戳是从 UTC 时间得来的,所以时间戳与本地时间的相互转换,需要根据时区来转换。
2023-10-15 23:00:13 4588
原创 Netty粘包与拆包问题
粘包指的是多个小的数据包可能被封装成一个大的数据包发送。与之相关的是拆包,拆包指的是一个完整的数据包可能会被 TCP 拆分成多个包进行发送。出现粘包/拆包的原因有三点:1. 应用发送的字节数超过 Socket 发送缓冲区的大小。每个 TCP Socket 连接在内核中都有一个发送缓冲区和接收缓冲区,在接收数据时,会把数据存到接收缓冲区,等待用户读取。2. 对超过 TCP 最大报文段长度(Max Segment Size,MSS)进行 TCP 分段。3. 对以太网帧超过最大传输单元(Maximum T
2023-09-26 23:04:36 297
原创 AQS源码解析
AQS 是 AbstractQueuedSynchronizer 的缩写,中文翻译过来就是抽象队列同步器。`ReentrantLock`、`ReentrantReadWriteLock`、`Semaphore`、`CountDownLatch` 都是基于 AQS。AQS 的核心思想是,当线程请求获取资源时,如果资源空闲,则会将当前线程设置为资源的独占线程,成功获得锁;否则将获取锁失败的线程加入到排队队列中(CLH),并提供线程阻塞和线程唤醒机制。CLH 是一个虚拟的双向队列。
2023-07-30 22:30:04 176
原创 从JVM指令看String对象的比较
如果常量池中不存在 String 常量值 “10”,jvm 会先创建一个 String 对象,再放到常量池中。然后再基于常量池中的 String 常量 “10”,分别创建。在刚学习 java 知识的时候,对于这个结果感到非常意外且不理解,还曾一度尝试去死记硬背。虽然网上的文章也有对此分析居多,但是在接触 JVM 后,发现原因其实非常简单。是基于 String 常量值创建的 String 对象,而。对象,由此可知,上面代码创建了 3 个对象。String 常量池,存储值为 10。
2023-07-22 18:13:22 512
原创 flutter 使用archive压缩与解压文件时出现中文乱码的问题
archive是 flutter 上的一个文件压缩与解压的类库,支持 zip,tar,zlip,gzip,zip2,xz 格式的压缩与解压。
2023-07-16 00:09:54 2825
原创 23种设计模式总结
所以在工作中需要先找到业务中重复的部分,再根据重复的类型,找到对应类型的设计模式,根据每种设计模式的机制确定哪种设计模式适合当前的业务。结构型:将对象或类组合成更大的结构,同时保持对外结构的不变,对内结构的灵活。行为型:处理对象之间的沟通,将对象变化的行为封装起来。设计模式的本质是:“找到变化,封装变化”创建型:负责提供创建对象的机制。
2023-07-08 16:45:08 557
原创 设计模式之代理模式
代理模式的定义是:为其他对象提供一种代理以控制对这个对象的访问。因为代理类与服务类实现同样的接口,所以代理类能代替服务类提供给客户端。当客户端使用代理类时,代理类能对请求进行处理(例如增加访问控制、缓存请求结果、隐藏对服务类的网络请求、日志记录等),并将请求转发给服务类来处理。
2023-06-04 20:58:08 640
原创 设计模式之状态模式
状态模式的定义是:当一个对象内在状态改变时允许其改变行为,这个对象看起来像是改变了自身所属的类。该模式适合于对象具有有限的状态,并且在状态之间相互切换。
2023-05-28 13:01:38 866
原创 设计模式之备忘录模式
备忘录模式的定义是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。该模式允许生成对象状态的快照和将其还原,主要用于撤销与重做功能的实现。
2023-05-28 00:37:11 809
原创 设计模式之中介者模式
中介者模式的定义是:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式适合于组件之间过于耦合而不方便修改的情况。因为中介者模式强制组件之间只通过中介者交互,而不是组件之间直接交互,避免组件之间相互依赖紧密耦合,方便于修改。类所拥有的依赖关系越少, 就越易于修改、 扩展或复用。
2023-05-21 14:59:34 380
原创 设计模式之责任链模式
责任链模式的定义是:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任链模式适合于请求需要经过多个处理器,并被其中一个或多个处理器执行。
2023-05-21 14:24:48 319
原创 给Hugo添加Mermaid支持
Hugo是一款搭建个人博客的框架,支持使用 Markdown 格式的文件生成 HTML 文件。hugo-theme-even 则是 Hugo 的一个主题。Mermaid 则是一个支持在 Markdown 下生成图表的工具。因为 Hugo 并不原生支持 Mermaid ,所以本文的目的是,基于 hugo-theme-
2023-05-15 21:34:29 342
原创 设计模式之访问者模式
访问者模式的定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。简单来说就是,就是将算法与其所作用的对象隔离开来,在不对原有类做出太多改动的情况下将新的行为封装到访问者中。在此模式中,不变的是原有类的结构,变的是功能。
2023-05-13 12:46:34 65
原创 设计模式之模板方法模式
模板方法的定义是:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。简单来说,就是定义好一个算法的骨架,算法的具体实现由子类去实现。在这个算法中,不变的是算法的结构,变化的是算法的具体实现。
2023-05-13 10:28:20 68
原创 设计模式之策略模式
策略模式的定义是:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式通过将不同的实现算法抽取到不同的策略类中,并定义一个通用的策略接口。在上下文类中会通过全局变量存储每个策略的引用,当客户端调用上下文方法时,上下文会将工作委派给实际上的策略去执行。
2023-05-07 11:18:23 61
原创 设计模式之外观模式
定义:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供了一个高层次的接口,使得子系统更易于使用。简单来说就是外观模式能为程序库、 框架或其他复杂类提供一个简单的接口,客户端仅通过这个接口与子系统进行交互。
2023-04-29 10:17:19 60
原创 设计模式之组合模式
定义:将对象组合成树形结构以表示“部分 - 整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。组合模式适合于树形数据结构,使用时可以应用多态或者递归处理树形数据结构。
2023-04-22 12:15:53 67
原创 设计模式之装饰器模式
定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。本质上来说,是通过组合或聚合,将对象包含于装饰类里,从而增添新的行为。装饰类实现了与对象相同的接口。
2023-04-22 11:16:11 71
原创 设计模式之桥接模式
定义:将抽象和实现解耦,使得两者可以独立地变化。桥接模式可以将一系列密切关联的类拆分成抽象与实现两个独立的层次,以实现抽象与实现的解耦,抽象和实现可以独立变化,而不会相互影响。抽象与实现一般通过组合实现。
2023-04-16 17:50:33 53
原创 设计模式之适配器模式
定义:将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式能使得接口互不兼容的对象能相互合作。适合于希望使用某个类, 但是其接口与已有的代码不兼容的情况。
2023-04-16 14:25:20 58
原创 设计模式之观察者模式
定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。观察者模式允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。
2023-04-16 12:03:53 56
原创 设计模式之命令模式
定义:将请求转换为一个包含与请求相关的所有信息的独立对象。该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中。
2023-04-16 11:04:33 80
原创 设计模式之原型模式
原型模式将克隆过程委派给被克隆的实际对象。该模式为所有支持克隆的对象声明了一个通用接口, 该接口让你能够克隆对象, 同时又无需将代码和对象所属类耦合。
2023-04-16 10:25:25 58
原创 InputStream的了解与使用
InputStream 是一个字节输入流的抽象类,常用到的实现类有:1. BufferedInputStream2. ByteArrayInputStream 字节数组输入流3. DataInputStream4. FilterInputStream5. PushbackInputStream6. FileInputStream 文件输入流
2023-03-19 21:37:37 1221
原创 使用idea撤销git中间的提交
如果我们想要撤销第二次提交,保留第一次和第二次提交,选定第二次提交的文件,如果有多个文件的话,可以多选,右键选择 Revert Selected Chages,在平时的开发中,经常会碰到提交的代码需要撤销,但是又有别人提交了代码,这种时候我们需要只撤销中间的提交,不影响前后提交的代码,可以用命令。如果产生冲突,需要手动解决冲突,一般来说会自动完成操作。最后重新提交撤销后的代码,撤销的那次提交记录依旧会保留。撤销,也可以使用 idea 可视化撤销,这里介绍使用 idea 操作。例子是三次提交的内容。
2023-02-19 00:39:42 2562
原创 Arthas执行在线代码
arthas 是阿里巴巴开源的一款监控诊断的神器,能实时监测应用内存、gc、线程的状态信息,并查看方法调用的出入参、异常,监测方法执行耗时等信息。这篇文章中我们将借助 arthas 提供的 ognl 命令来执行在线代码。
2022-12-10 11:38:59 2603
原创 CLion 使用 WSL
CLion 在安装时会自带 MinGW,MinGW 是 gcc 在 Window 上的版本,支持 C 语言在 Window 平台的编译。但由于跟 posix 标准不完全一致,如果所运行的 C 语言程序中包含了 socket.h 等库,MinGW 则没办法编译。所以我们可以改为通过使用 WSL 来进行编译。
2022-09-25 22:02:15 2350
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人