- 博客(64)
- 收藏
- 关注
原创 AOI算法学习
Area of Interest,感兴趣区域,决定"服务器不把所有消息广播给所有人,而是按 AOI 算出"视野关系",只把相关实体的状态同步给相关玩家。
2026-06-27 16:06:03
168
原创 总算搞清skynet常见的数据流
socket 线程 epoll_wait收到数据→ socket_server_poll()(skynet_socket.c)→ 识别是 DATA / ACCEPT / CLOSE…打包成 skynet_socket_message,通过 forward_message()发回 Lua 世界→ 调 skynet_context_push(),塞进"这个 fd 绑定的那个 Lua 服务"的私有队列worker 线程从全局队列捞到这个服务的队列。
2026-06-24 23:16:32
205
原创 skynet源码学习
面试回答:关键代码全局队列:只存"非空且有待处理消息的私有队列"的引用私有队列:环形数组 + spinlock入队时"顺带把自己推进全局队列"的逻辑(核心中的核心)
2026-06-23 14:13:00
179
原创 工作中如何使用claude code帮助自己精准开发(进阶)
虽然他们有多个层级,但是和skill不一样,优先级高的层级里定义的 hook 不会被低层级的覆盖掉,而是各层的同名事件 hooks 数组合并,然后整体按来源优先级+定义顺序排列执行。实际使用中,如果你同时打开太多 MCP,主对话的可用上下文会被明显挤占,表现为更容易“健忘/跑偏”。所以只要我们自己手动配置好mcp的json配置,就不要敲指令一个个注册。,我的理解就是执行的脚本是确定的,比如我写好了一个shell脚本,它不会推断我发送的语义是否和这个shell有关,只要matcher匹配,就执行脚本。
2026-06-21 17:17:57
265
原创 工作中如何使用claude code帮助自己精准开发(入门)
由于国内很难使用到国外的ai agent,所以日常工作中都是用trae开发,虽然他生成的代码可以运行,我也会审核,没问题就放上线上运行。不过由于现在离职后,发现求职过程中,大部分岗位都是要会用claude code,我不得不学习如何使用。而使用各种ai协助开发也经常遇到一个问题,就是经常改代码会改把原有的代码改坏或ai新增的代码频繁改坏。这个导致我工作效率下降。所以通过学习claude code 官方文档补充claude code的使用技巧。
2026-06-16 00:30:00
270
原创 skynet——服务发现学习
这里service表维护了名字到句柄的映射。当服务启动时,它会被注册到这个表中,后续其他服务可以通过名字查询到对应的句柄。
2026-05-25 16:17:05
146
原创 面试题——全局邮件的设计
普通邮件(读扩散 / Fan-in)逻辑:邮件存储在发送者的发件箱中。收件人需要查看邮件时,系统去所有发件人的发件箱里“拉取”属于自己的邮件。类比:像去邮局取信。信都堆在邮局(发送方),你需要自己去查有没有你的信。面试关键词:收件人主动拉取、按需聚合、读时计算。全局邮件(写扩散 / Fan-out)逻辑:发送邮件时,立即将邮件复制到每个收件人的收件箱中。收件人查看时,直接读取自己的收件箱即可。类比:像快递送货上门。快递员(系统)在发货时直接把信送到你家门口(收件人收件箱)。
2026-05-24 16:22:11
45
原创 skynet_fly开源框架学习
当手动触发热更新的时候,会调用到load_modules,此时就会他会退出旧服务,那么热更之后,其他服务要访问热更的服务时,就找不到最新的地址。所以服务创建之后,container_mgr会通过g_watch_map获取更新模块监听的名单,然后回复这些。所以对于已经被函数引用的变量,是不会有影响,对于模块级的会有影响。load_mods,配置各个服务的启动的配置,例如第几个开启、启动的实例数量。容器根据load_mods配置,分成立即启动和延迟启动的服务列表。在服务创建的时候,就会监听每一个服务。
2026-05-17 18:11:18
329
原创 MMO游戏中的“跨服团队副本”匹配与状态同步系统
在一个大型多人在线(MMO)游戏中,策划希望推出一个高难度的“世界级团队副本”。该副本需要20名玩家共同挑战。由于单服玩家数量有限,系统需要支持跨服匹配。副本内有复杂的机制,如多个阶段BOSS、团队资源(如团队怒气值)、可被玩家交互的环境物件。玩家共同挑战后,根据各自的贡献给予奖励。
2026-05-11 17:39:24
469
原创 Top K 问题终极指南:从游戏排行榜到算法面试
"""游戏排行榜简化实现"""self.k = k # 榜单长度self.heap = [] # 最小堆维护TOP Kself.player_data = {} # 玩家ID -> 分数"""更新玩家分数,并维护榜单"""# 简单的实现:每次更新都重新计算(实际会用更优方法)# 这里演示核心逻辑"""获取当前榜单"""temp = list(self.heap) # 复制一份return result[::-1] # 从高到低# 使用示例。
2026-05-08 17:25:20
308
原创 lua——哈希表详细学习
由上面的逻辑,我们可以看出其是通过获取上一次查询的键,提高遍历的效率,不需要每次都从头查找某个只在哪。其中最重要的接口就是find_next_hash_entry。其中find_next_key是其关键,本质就是next完成寻找下一个key的工作,接下来就详细讲解下next的工作机制。遍历字典通常是使用pairs,用一段伪代码讲述一下其运行的大概逻辑。返回桶0的第一个节点:x=1。结果:y=2 被完全跳过了!找到第一个非空桶:桶0。遍历器记住:当前是x。输出变成了:x, z。
2026-05-07 10:07:01
261
原创 通用后端面试题收集(持续中)
B+树索引就是mysql结合B树和索引顺序升级开发的一种平衡搜索树。实际底层实现跟B树没有关系。特点是非叶子节点只存储索引,而叶子结点存储实际的数据。所有叶子结点都是由一个双向链表管理和连接的,数据都是排好序的。因为这些特点,索引B+树适合进行范围查询。答:回表就是使用非聚簇索引搜索时,索引字段不包含搜索所需的字段,那么就要通过主键去查找完整数据的过程。往往会带来随机I/O操作,使得查询慢。
2026-05-01 22:09:10
384
原创 自己实现自定义协议的思考
对于聊天消息(假设Command ID=0x0001,私聊),其结构就是我们需要设计的“聊天消息体”。您需要将{sender_uid, content, timestamp}这三个字段(以及可能的其他字段,如target_uid)序列化成二进制。根据包头的 Command ID,知道这是一个聊天消息,调用对应的Protobuf解析函数,将包体数据反序列化成 ChatMessage对象。包头 (Header):用于描述包本身,与具体业务(聊天)无关。包体 (Body):承载具体的业务数据(如聊天消息)。
2026-05-01 21:52:44
253
原创 彻底理解HTTP、WebSocket与TCP的“爱恨情仇”
TCP 是地基:负责最底层的“把数据准确无误地送到”,不关心送的是什么内容。HTTP 是标准服务:建立在 TCP 之上,负责网页浏览、API 调用。( )WebSocket 是升级服务:也建立在 TCP 之上,但借用了 HTTP 的“入场券”(握手),然后升级为更高效的协议。
2026-05-01 19:39:54
227
原创 广播风暴架构优化方案思考
现在,假设“国战军情”需要向全服数千玩家广播时触发的场景。而当前的架构是“一对一”推送模型,其在广播场景下存在设计瓶颈。如果是你,你会怎么优化这个架构。
2026-04-27 16:12:43
191
原创 面试必问:Redis 数据结构实战选型指南
在游戏里设计排行榜,首先要明确几个核心需求:一是需要按分数实时排序;二是要能快速查询单个玩家的排名和分数;三是通常要能查询Top N的玩家列表。基于这三点,我会优先选择 Redis 的 Sorted Set(有序集合)。因为它底层是跳表实现,插入、删除、按分数范围查询的复杂度都是 O(log N),非常适合实时排序场景。它能直接满足我们‘按分数排序’和‘查询Top N’的核心需求。
2026-04-26 00:25:08
226
原创 Mysql——MVCC学习
MVCC,即多版本并发控制,是InnoDB实现高并发事务的核心机制。它的核心思想是:不通过加锁阻塞读写,而是为每一行数据维护多个历史版本,让读写事务可以无冲突地并发进行。这是InnoDB在“可重复读”和“读已提交”隔离级别下实现的关键。
2026-04-24 11:58:40
409
原创 lua面试题收集
回答重点 :覆盖所有基本类型,突出 table 的特殊性,说明 number 的统一表示。回答范文 :Lua 共有 8 种基本数据类型:nil、boolean、number、string、function、userdata、thread、table。其中最核心的是 table,它是 Lua 唯一的复合数据结构,既是数组又是哈希表,底层通过哈希表和数组结合实现,整数键存储在数组部分,其他类型键存储在哈希部分。number 类型统一使用双精度浮点数表示,无需区分整数和小数,简化了类型系统。
2026-03-05 12:10:52
616
原创 聊天系统构思
真正的状态(频道消息、在线列表)需要下沉到共享存储(如Redis集群)或通过一致性哈希在节点间分布。WebSocket(全双工,实时)是首选,gRPC(基于HTTP/2,高效)也是好选择。需定义一套自己的消息信封(Envelope)协议,包含消息类型、发送者、目标频道、序列号、消息体等。需设计一个过滤器链,例如:先“强过滤”(替换为***),再“全词匹配”(记录日志),不同频道可以应用不同链。这里涉及系统消息的类型设计。安全:防止刷屏(频率限制)、防止超大消息、消息内容加密(TLS必须)、防重放攻击。
2026-02-10 22:32:42
629
原创 mongo权威指南(第三版)学习笔记
等值字段优先:尽快缩小扫描范围,提升索引选择性。例如,city等值过滤直接定位城市子集。排序字段次之:利用索引有序性避免内存排序。例如,username在索引中维护顺序。范围字段最后:防止范围查询中断索引连续性。例如,age范围过滤在匹配子集内进行。通用性:该原则适用于大多数多条件查询,尤其是结合过滤和排序的场景。实践过程中,建议使用explain验证查询语句执行情况。
2026-01-02 13:48:31
991
原创 GIt使用记录
git clone:克隆远程仓库git pull:拉取分支最新代码,等同于git fetch+git fetch:git add:提交本地修改文件到暂存区,该区域暂未提交到远程仓库,可回撤修改git commit:将暂存区文件提交到本地仓库git push:将本地仓库修改的代码推送到远程仓库git branch:查看当前所在分支或者查看仓库内所有分支git checkout:创建或切换分支git status:查看当前分支和远程分支的差异git reset:回退到指令版本。
2025-07-28 15:49:43
923
原创 lua学习(三)
确保某些数据是符合预期的,避免影响最终结果。:assert(条件语句,报错信息)当条件语句为true时,assert语句不会有任何行为,但是当为false时,assert会将报错信息弹出,并中断程序的执行。:由于断言只在调试模式下有效,因此在生产环境中通常会被禁用,以避免影响程序性能。
2025-03-15 16:30:36
942
原创 Skynet入门(一)
skynet 是一个为网络游戏服务器设计的轻量框架。但它本身并没有任何为网络游戏业务而特别设计的部分,所以尽可以把它用于其它领域。
2025-03-01 15:37:12
1858
原创 lua学习(二)
该参数是可选的指定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字。指定函数名称。函数参数,多个参数以逗号隔开,函数也可以不带参数。函数体,函数中需要执行的代码语句块。函数返回值,Lua语言函数可以返回多个值,每个值以逗号隔开。
2025-03-01 10:05:04
665
原创 go--并发学习
指当一个goroutine尝试获取一个已经被其他goroutine持有的锁时,它会进入一种持续检查锁状态的状态,而不是立即进入阻塞状态。这种机制被称为自旋锁(Spinlock)工作原理当一个goroutine请求自旋锁时,如果锁已被其他goroutine占用,那么当前goroutine会不断检查锁的状态,直到锁被释放,而非立即休眠。优点自旋线程数量上限为GOMAXPROCS(P的数量),避免CPU空转浪费。自旋锁避免了阻塞和上下文切换,从而减少了系统开销。
2025-02-04 17:29:16
957
1
原创 go——panic学习
panic一般跟recover、defer结合使用。当panic触发异常,当前函数会停止执行,然后执行当前函数中所有的defer。如果没有捕获panic的报错,程序会崩溃并输出堆栈信息。
2025-02-02 09:52:13
595
原创 JMeter学习记录
从使用上,该控制器其实就是自动帮你拼接引用字段,例如数据库输出变量是mobilephone,然后ForEach中填写的开始字段startidx代表从startidx+1开始拼接,获得mobilephone_1,mobilephone_2…如何获取返回的token,并在后续请求中使用,在获取token的http请求后面添加一个后置处理器——正则表达式提取器。匹配数字:代表获取返回数组中第几个数据,-1代表全部,0代表随机,1代表第一个。模板:$$对应提取器类型,-1代表全部,0代表随机,1代表第一个。
2025-01-21 10:49:57
1122
原创 python并发编程学习——asyncio
Python在处理I/O密集型任务时遇到的问题。传统的多线程编程模型在处理大量I/O操作时,由于线程创建和管理的开销,效率较低。为了解决这个问题,Python从3.4版本开始引入了asyncio库,它能够在单个线程内实现并发,避免了多线程带来的开销,从而提升了性能并降低了复杂度。
2025-01-15 20:08:44
785
原创 python——元类学习
super(Mymeta, self).__init__(class_name, class_bases, class_dic) # 重用父类的功能raise TypeError('类名%s请修改为首字母大写' %class_name)raise TypeError('类中必须有文档注释,并且文档注释不能为空')pass。
2025-01-11 18:12:30
337
空空如也
给普通码农的技能建议
2026-06-25
非专业游戏产品开发讨论
2026-06-16
游戏后端的学习资源推荐
2025-10-25
skynet和lua的游戏开发疑惑
2025-07-13
求好的python web开源项目
2023-06-22
工作一年的游戏后端程序的当前职业发展的一些困境
2023-05-29
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅