- 博客(168)
- 收藏
- 关注
原创 帧同步与状态同步
现代大型游戏往往采用混合架构来兼顾优势。例如,《王者荣耀》整体是状态同步管理账号、匹配,但5v5对战房间内采用帧同步来保证竞技公平;而《绝地求生》的大世界是状态同步,但子弹命中判定可能采用客户端预测+服务器回滚校验的混合模式。游戏是否包含重要的经济系统、大量动态实体或复杂的非对称交互?(如:魔兽世界、原神、捕鱼)游戏是否介于两者之间,或是大世界中的小范围对战?(如:吃鸡、开放世界游戏中的副本)游戏核心是否是需要分毫不差的物理模拟或1v1竞技?(如:台球、拳皇、星际争霸)
2026-01-16 10:41:34
42
原创 kcp学习-通用的kcp lua绑定
无外部依赖:纯 C + Lua,易于集成到任何项目设计简洁:回调机制灵活,适应各种网络后端内存高效:共享接收缓冲区,减少内存分配线程安全可选:默认单线程模式,性能更好完整的垃圾回收:避免内存泄漏需要手动处理网络 I/O:回调函数中需要自行实现发送逻辑地址管理需要外部处理:不像 lkcpsn.c 那样内置地址管理。
2026-01-15 19:46:42
730
原创 kcp源码学习
ikcp.c数据结构与基础1. 核心结构体IKCPCB (KCP 控制块)IKCPSEG (数据段)核心接口详解1. 生命周期管理ikcp_create - 创建 KCP 实例功能:创建并初始化一个 KCP 控制块参数:conv:会话 ID,通信双方必须一致(类似 TCP 的端口)user:用户数据指针,会传递给回调函数返回值:成功返回 KCP 指针,失败返回 NULL内部流程:分配内存并初始化所有字段为默认值初始化发送/接收队列和缓冲区分配内部缓冲区(3倍 M
2026-01-13 16:08:39
268
原创 rust学习-探讨为什么需要标注生命周期
/ 没有生命周期标注的bug版本(假设Rust允许)excerpt: &str, // 缺少生命周期标注!} else {content// 使用这个结构体会出问题:let article = String::from("这是一篇很长的文章...");summary = NewsSummary::new("标题".to_string(), &article);} // article 被丢弃// 但 summary.excerpt 还指向 article 的内存!
2026-01-07 19:36:58
983
原创 rust学习-生命周期
生命周期是引用有效的作用域,它描述了引用在多长时间内是有效的。在 Rust 中,每个引用都有一个生命周期,但大多数情况下编译器可以自动推断。let x = 5;let r = &x;// | |// -+ |'static 生命周期表示整个程序的持续时间。所有字符串字面量都有 'static 生命周期。// 字符串字面量是 'staticlet s: &'static str = "我是静态字符串";// 也可以用在函数签名中"返回静态字符串"println!
2026-01-07 15:55:07
962
原创 rust学习-Option与Result
Option 是一个枚举,表示一个值可能存在 (Some) 或不存在 (None)。Some(T), // 包含一个值 TNone, // 不包含任何值Result<T, E> 是一个枚举,表示操作可能成功 (Ok) 或失败 (Err)。Ok(T), // 包含成功值 TErr(E), // 包含错误值 E// 定义自己的错误类型Overflow,(f, "除数不能为零"),(f, "不能对负数开平方根"),(f, "计算溢出"),} else {Ok(a / b)
2026-01-07 12:03:16
740
原创 rust学习-循环
Rust 可为循环添加标签,以便在嵌套循环中精确控制 break 和 continue。loop 是 Rust 中最简单的循环,它会无限循环直到显式中断。while 循环在条件为真时重复执行代码块。for 循环主要用于遍历集合或范围。
2026-01-06 19:34:12
297
原创 python中字符串,列表,元组,集合,字典常见的遍历方式整理
需要索引时用 enumerate:比 range(len()) 更优雅。复杂遍历用 itertools:Python标准库,功能强大。优先使用 for-in 直接遍历:最简洁,性能好。字典遍历用 items():同时获取键值,效率高。元组遍历与列表几乎相同(元组是不可变的列表)大数据用生成器:节省内存,适合大数据处理。
2025-12-31 09:06:22
1220
原创 skynet源码学习-clusterproxy.lua
1.创建远程服务的本地代理2.透明转发所有消息到远程节点3.支持同步调用和异步推送4.无需修改调用代码即可访问远程服务核心思想创建一个本地的"占位符"服务,所有发送到这个服务的消息都会被自动转发到远程节点的实际服务,调用者无需知道服务在远程节点。服务启动参数node: 目标节点名称(字符串)address: 目标服务地址或名称(数字或字符串)
2025-12-30 18:30:10
1050
原创 skynet源码学习-clusteragent.lua
处理来自其他节点的连接请求解析集群协议并转发给本地服务管理服务名称查询和缓存处理大消息分片和重组支持跟踪(trace)功能传递核心角色服务器端处理器:与 clustersender(客户端)对应协议解码器:解析集群协议格式本地服务路由器:将请求路由到正确的本地服务名称服务缓存:缓存远程节点查询的名称服务启动参数clusterd: 集群核心服务地址gate: 网关服务地址(接收网络连接)fd: 连接文件描述符(网络套接字)
2025-12-30 10:06:50
1065
原创 skynet源码学习-clustersender.lua
clustersender.lua 是 Skynet 集群模块中的出站连接管理器1.与指定的远程节点建立并维护 TCP 连接2.发送请求到远程节点并接收响应3.处理网络连接的重连和变更4.支持请求的打包和分片(大消息处理)5.集成跟踪(trace)功能服务启动参数目标节点名称(字符串)本地节点名称(字符串)目标节点主机地址(字符串)目标节点端口(数字或字符串)这些参数由clusterd在创建服务时传递。1.单一职责原则只负责与一个远程节点的通信不处理业务逻辑,只负责消息传输2.可靠性设计。
2025-12-29 19:33:09
1097
原创 skynet源码学习-clusterd.lua
1.管理所有节点的连接状态2.处理服务名称的注册和查询3.创建和管理代理服务4.处理来自其他节点的连接请求5.动态更新集群配置-- 创建发送器if node_sender[key] then -- 再次检查elseendend-- 创建代理服务if proxy[fullname] then -- 再次检查elseendend。
2025-12-29 15:37:16
760
原创 skynet源码学习-cluster.lua
cluster.lua 是 Skynet 集群模块的主要客户端接口文件,它为应用程序提供了跨节点通信的 API。这个文件不直接处理网络通信,而是作为一个封装层,将复杂的集群通信抽象为简单的函数调用。
2025-12-26 19:57:01
872
原创 docker常用指令整理
Dockerfile:用于构建自定义镜像,主要是自己的应用。对于 Redis、Nginx 等成熟中间件,几乎不需要自己写 Dockerfile,直接使用官方镜像。:用于编排多个容器,定义它们之间的关系(网络、依赖、数据卷)。这才是实现“一键启动项目”的真正工具。:通常不需要手动执行,因为 docker compose up 或 docker run 会自动拉取本地缺失的镜像。数据持久化:通过 volumes 将数据库等产生的数据存储在宿主机,这样容器销毁后数据不丢失。网络。
2025-12-23 19:36:48
1039
原创 Elasticsearch Query DSL 指令整理
Query DSL(Domain Specific Language)是 Elasticsearch 的核心查询语言,基于 JSON 结构,用于定义复杂的查询逻辑。场景推荐查询类型全文搜索精确匹配短语搜索模糊搜索复杂逻辑bool(结合 must/should/filter/must_not)评分控制相似推荐地理位置嵌套对象nested。
2025-12-11 18:14:16
1070
原创 Elasticsearch专用的ES|QL语法指令整理
ES|QL(Elasticsearch Query Language)是一种专为 Elasticsearch设计的、管道式的数据查询语言。它于2023年正式推出,Elasticsearch 8.11+ 引入的一种新的查询语言,类似于传统的 SQL但更专注于流式数据处理,旨在提供比传统 Query DSL 更直观、更强大且更易于学习的数据探索和转换能力。核心设计哲学1. 管道式处理:数据像在流水线上一样,依次通过一系列命令(称为“操作符”)进行处理,每个操作符接收上一个操作符的输出作为输入。2. 声明式。
2025-12-11 09:57:01
1591
原创 kibana介绍与部署(Windows详细版)
A:需要重置 Elasticsearch 的密码,这通常在 Elasticsearch 服务器上操作。A:因为密码必须存储在 Elasticsearch 中,Kibana 只是读取这个密码来连接。如果Kibana被攻击,攻击者只能获得有限的权限,而不是超级管理员权限。:kibana_system 只有Kibana需要的权限。A:elastic 是内置的超级管理员,拥有所有权限。结果:在漂亮的界面上查看错误日志、用户行为等。结果:分析用户行为、销售趋势、热门商品。结果:实时看到所有服务器的健康状况。
2025-12-09 17:45:06
1419
原创 mysql中一些常见名词解析整理
窗口函数在不减少行数的情况下,对数据集的"窗口"进行计算。视图是虚拟表,基于SQL查询的结果集,不实际存储数据。:SQL查询的"虚拟表",简化复杂操作。:数据库的"原子操作",保证数据一致。:数据库的"自动程序",响应数据变化。:高级的"数据分析",保持原始行结构。:数据库的"集群方案",确保高可用性。:数据库的"监控系统",记录所有操作。:数据的"统计摘要",生成汇总信息。:大表的"分块存储",提高管理效率。:数据库的"目录",加快查找速度。:表之间的"桥梁",关联相关数据。
2025-12-09 11:02:51
1007
原创 mysql的引擎对比整理
存储引擎是 MySQL 中用于管理数据存储和检索的底层软件组件。它定义了数据如何存储、如何建立索引、如何更新和查询数据。
2025-12-09 10:47:52
571
原创 MongoDB 与 Elasticsearch 数据同步方案整理
MongoDB Connector for Elasticsearch 是官方提供的实时同步工具,通过读取 MongoDB 的 oplog 实现数据同步。# 安装依赖 sudo pip3 install pymongo elasticsearchimport sys# 连接 MongoDB# 连接 Elasticsearch# 批量处理配置# 索引映射配置},"""创建 Elasticsearch 索引"""
2025-12-08 12:08:41
804
原创 Elasticsearch 分词器
分词器(Analyzer) 是 Elasticsearch 中用于处理文本数据的核心组件,负责将文本转换成适合搜索的格式。它就像是一个"文本处理器",将原始文本拆分成一个个有意义的词条(Terms),同时进行标准化处理。想象一下你要在图书馆找一本书原始书籍 = 原始文本图书管理员(分词器) = 将书籍内容拆分成关键词、索引标签图书索引卡 = 分词后的词条读者 = 搜索请求。
2025-12-08 11:40:16
756
原创 mongodb的复制集整理
数据冗余:防止数据丢失高可用性:自动故障转移读扩展:支持从节点读取1. 使用副本集:请务必使用副本集(Replica Set)而非过时的 Master-Slave 架构2. 规划节点数:确保副本集中拥有投票权的成员(包括仲裁节点)总数为奇数3. 生产环境配置:对于重要的生产环境,更推荐的稳健配置是1个主节点 + 2个从节点,这样可以同时提供数据冗余和读扩展能力。
2025-10-31 10:36:45
714
原创 redis-哨兵模式配置整理
Redis 哨兵(Sentinel)是 Redis 官方提供的高可用性解决方案,用于管理 Redis主从架构,实现自动故障检测和故障转移。
2025-10-27 18:25:18
775
原创 redis-RDB/AOF-主从复制整理
RDB(Redis Database)是 Redis 的快照式持久化方式,通过在指定时间间隔内将内存中的数据生成二进制快照文件(dump.rdb)保存到磁盘AOF(Append Only File)通过记录所有写操作命令来持久化数据,以文本格式记录操作日志Redis 主从复制允许将一台 Redis 服务器的数据复制到多台从服务器,实现数据冗余和读写分离。
2025-10-24 14:48:56
1053
原创 游戏登录方案中常见的设计模式整理
模式类型适用场景优点缺点账号密码传统MMO、端游用户习惯成熟、控制力强密码管理负担、安全性依赖用户Token认证现代手游、Web游戏无状态、扩展性好Token管理复杂、过期处理OAuth2.0社交游戏、快速登录用户体验好、免注册依赖第三方、数据获取受限设备登录休闲手游极简体验、自动注册设备丢失问题、多设备冲突混合模式大型商业游戏覆盖广泛、灵活切换系统复杂度高、维护成本大。
2025-10-20 10:52:55
703
原创 skynet.newservice接口分析
执行流程:在 launcher.lua 中:这是一个空的启动函数,即launcher 服务启动后立即进入消息循环状态,等待处理命令NORET 是一个特殊标记,表示这个命令不会立即返回结果skynet.launch 的底层实现skynet.launch 是 C 函数,在 skynet_server.c 中实现:它调用底层的 skynet_command 函数,命令为 “LAUNCH”关键点: 服务启动是异步的!时序图:服务初始化完成的通知当新服务初始化完成后,会通过文本协议通知 launch
2025-10-11 15:37:39
446
原创 基于skynet框架业务中的gateway实现分析
这是最底层的网关服务器实现,封装了Skynet的socket操作,提供TCP连接管理的基础框架,其内部注册了"socket"类型的协议,通过gate将gate中的"socket"类型调用到gateserver中的对于指令。业务级别网关服务实例,增加了业务逻辑,如用户认证、超时检查等,启动网关服务时每个节点只需要启动一个就行,因为网络线程只有一个,启动后可以调用"lua"类型消息open,开启网关服务。主要分2类,一类是处理socket类型消息,一类是lua类型消息。
2025-09-30 09:34:26
1012
原创 skynet.dispatch与skynet.register_protocol
register_protocol 关心的是“消息是什么”——如何编码、解码,这是全局的、通用的定义dispatch 关心的是“收到消息后怎么办”——业务逻辑,这是每个服务私有的、特定的行为这种设计极大地提高了灵活性,可以定义一种通用的序列化格式(如 Protobuf),然后不同的服务可以根据自己的需求用不同的方式处理同一种格式的消息消息的格式和处理逻辑被完全分开了,网络层或消息队列只负责传递二进制数据。
2025-09-19 12:51:09
948
原创 基于skynet的配置加载-共享-热更分析
1. 启动配置管理服务 (constloader) 首先启动它立即调用 initial(),将所有配置文件通过 sharetable.loadfile 加载到共享内存服务完成初始化,等待接收消息2. 订阅其他需要关注配置变化的服务(如游戏逻辑服务)启动后,会调用 constloader 的 watch 方法进行订阅,constloader 将这些服务的地址记录下来3. 热更新。
2025-09-16 10:47:58
969
原创 基于跳跃表的zset实现解析(lua版)
zset是指有序集合,这是redis中的一种数据结构,可以存储成员和对应的分数,并且按照分数排序,原理是基于跳跃表实现。
2025-09-12 11:16:14
1288
原创 Skynet火焰图swt搭建
SWT 是一个用于 Skynet 的火焰图和调试工具,可以在运行时随时启停性能分析器,方便调试线上问题最近尝试接入swt,用于监控skynet节点服务状态以及debug,以下是接入时的一些心得,特此记录,仅供参考。
2025-09-11 14:49:02
656
原创 CentOS7下的ElasticSearch部署
选择 Java 11 对应的编号(通常为 /usr/lib/jvm/java-11-openjdk-*/bin/java)修改后需重启服务:sudo systemctl restart elasticsearch。应返回包含用户信息的 JSON 响应。按提示交互式设置新密码。
2025-07-18 19:29:59
887
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅