- 博客(129)
- 资源 (5)
- 收藏
- 关注
转载 最快速的寻路算法 Jump Point Search
本文系统研究了跳点搜索算法(JPS)及其优化方法,针对传统A算法在网格地图寻路的效率瓶颈问题,提出了四种JPS优化策略:位运算优化(JPS-Bit)、剪枝优化(JPS-BitPrune)、预处理优化(JPS-BitPre)和综合优化(JPS-BitPrunePre)。实验数据表明,优化后的JPS算法在200格路径搜索中速度达到A的15-273倍,其中JPS-BitPrunePre版本仅需0.095毫秒。研究还解决了JPS算法存在的"穿越阻挡"缺陷,并实现了动态阻挡支持。通过GPPC竞赛数
2026-06-18 14:11:16
149
原创 后端学习链接
本文档集合了多种编程语言的参考手册和学习资源,包括Lua5.3/5.4中文手册、Rust参考手册、Boost C++库文档、C++标准库参考(cppreference.cn)以及Go语言中文学习指南。这些资源覆盖了脚本语言(Lua)、系统编程语言(Rust/C++)和现代后端语言(Go),为开发者提供了从入门到参考的完整文档支持,适合不同层次的编程学习者查阅使用。
2026-06-15 20:06:16
97
原创 Linux I/O
文章摘要: 直接I/O(Direct I/O)是一种绕过文件页缓存的磁盘访问方式,通过O_DIRECT标志启用,适用于数据库等高一致性场景。其优势包括减少内存占用、降低数据拷贝和落盘延迟,但需满足内存地址、文件偏移和读写长度的三重对齐要求,且小文件性能较差。内核通过检查IOCB_DIRECT标志区分直接I/O与缓存I/O,直接I/O通过DMA直达磁盘,而缓存I/O需经页缓存。测试代码演示了直接I/O的读写操作,强调对齐和手动调用fsync()的必要性。直接I/O虽提升效率,但需谨慎处理对齐和元数据同步问题。
2026-05-28 11:49:55
188
原创 epoll 内核实现机制
摘要:epoll是Linux内核高效I/O复用机制,采用红黑树管理监听fd(O(logN))和就绪链表缓存事件(O(1))。通过epoll_create创建事件容器,epoll_ctl注册回调函数,epoll_wait仅处理就绪事件。核心优势在于回调驱动机制:当fd状态变化时触发ep_poll_callback,将事件加入就绪链表并唤醒等待线程。相比select/poll的全量扫描(O(N)),epoll实现O(1)~O(k)的事件检测,支持LT(水平触发)和ET(边缘触发)模式,显著提升高并发场景性能。
2026-05-28 10:24:47
170
原创 C++里 const int* 与 int const*
C++中const int和int const完全等价,但const修饰规则需要明确:const修饰左边类型,若无则修饰右边。关键区别在于指针声明中const的位置:在左边修饰指向的数据(low-level const),在右边修饰指针本身(top-level const)。现代C++编程应优先使用constexpr/consteval进行编译期计算,避免const_cast等危险操作,同时在成员变量和函数参数中合理使用const来保证不变性。理解const修饰规则对模板推导、auto推导和函数重载至关重要
2026-05-25 11:51:46
377
原创 skynet网络机制
## 前言 我在前几年,写了一篇《skynet源码赏析》,阐述了skynet的整体设计,和核心运作机制流程,该文针对的是skynet-1.0版本,如今skynet已经升级到1.3版本,总的来说,skynet整体架构并没有特别大的改动,不过从1.2版本开始,skynet增强了网络并发处理的能力。1.3改进了cluster机制,修复了一些大量并发可能导致的bug。尽管《skynet源码赏析》这篇,已经详细地阐述了skynet内部实现机制,不过对于网络部分,这篇只是阐述了大致的运作机理,并未深入源码层进行非
2026-05-18 17:36:15
440
原创 C语言如何实现C++的类
本文揭示了C++类的底层实现原理,指出其完全基于C语言特性构建。通过结构体和函数指针可模拟类的封装特性,手动传递this指针替代隐式传递;利用结构体嵌套实现继承的内存布局;头文件隔离实现私有成员访问控制。文章展示了如何用纯C语言复现面向对象的封装、继承和多态三大特性,证明C++类只是语法糖,其本质仍是基于C语言的底层机制。核心要点包括:成员函数即函数指针+显式this、子类结构体首部嵌套父类实现继承、头文件隔离实现访问控制等。
2026-05-11 15:44:39
420
原创 git使用教程
git 这东西,单独看每个命令都不难,难的是组合起来、在真实场景下不犯晕。我学git的过程就是不断踩坑——覆盖过同事代码,亲手删过自己代码,还曾经因为分支切错把一个半成品合到了生产环境。但现在我养成了几个习惯:git pullgit push开新功能必切分支reset 之前先想三秒钟如果你记不住命令,VSCode 的图形界面真的够用。从clone到push到merge,你都可以用鼠标完成。等你熟了再去敲命令也不迟。最后送你一张我自己整理的常用场景速查(不用背,用到的时候来看就行):我想做啥。
2026-04-29 20:48:31
510
原创 深入理解ELF
这篇文章深入解析了Linux下ELF可执行文件的格式与运行机制。从预处理、编译、链接到加载运行的完整流程出发,详细剖析了ELF文件内部结构(Section视图和Segment视图),重点讲解了.text、.data、.bss等关键段的作用。文章还揭示了程序从_start到main()的执行路径,动态链接的PLT/GOT机制,以及静态链接与动态链接的优劣对比。通过readelf、objdump等工具的实际演示,配合内存映射、惰性绑定等核心概念,完整呈现了"一行代码如何变成运行中程序"的全过
2026-04-28 14:06:34
408
原创 skynet 库链接
本文整理了云风开发的多个Lua相关开源项目链接,涵盖序列化、调试、文件系统等工具库。包括lua-snapshot、pbc协议库、lua-cjson等数据处理工具,datatree数据结构,以及luadebug、lua-trace等调试工具。这些项目为Lua开发者提供了丰富的功能扩展,适用于游戏开发、服务器编程等场景。所有项目均在GitHub开源,由资深开发者云风维护。
2026-04-09 20:19:47
109
转载 Lua 的代码加载和热更新方式
本文介绍了Lua在游戏服务器热更新中的代码加载方式及实现方法。主要内容包括:1) 三种模块加载方式(dofile、loadfile、require)的特点及局限性;2) 热更新时对不同类型变量的处理策略,重点分析了局部变量(upvalue)的保留方法;3) 使用debug库API实现upvalue收集和更新的具体方案;4) 面向对象场景下的热更新处理方式。文章通过多个代码示例详细说明了如何通过编写热更新脚本来实现变量保留、函数替换等关键操作,为Lua热更新提供了实用解决方案。
2025-12-20 02:42:26
152
转载 skynet.start 的作用详细解析
服务初始化:注册消息分发函数(如),定义服务的主逻辑。启动事件循环:使服务能够接收和处理来自其他服务的消息。生命周期管理:标记服务进入运行状态,触发后续消息处理。核心作用是 Skynet 服务的入口点,负责初始化消息处理器并启动事件循环。必要性:所有独立运行的 Skynet 服务必须调用此函数(除非使用替代机制如最佳实践:在服务初始化阶段完成消息分发注册、资源加载等操作,确保服务正常响应消息。-- 完整示例:一个简单的计算服务endendend)end)
2025-11-20 01:33:01
43
转载 skyntet如何启动一个lua服务
初始化lua_State,先是将skynet_context保存起来,以方便lua层调用c的时候使用,然后就是一些配置设置,如设置一些lua服务脚本的存放路径,c服务so库的存放路劲(加载和调用的时候,回到这些路劲里寻找),然后该lua_State会加载一个用于执行指定脚本的loader.lua脚本,并将参数传递给这个脚本(参数就是snlua服务绑定的lua脚本名称和传给这个脚本拼起来的字符串,比如要启动一个名位scene的服务,那么对应的脚本名称就是scene.lua)
2025-11-20 01:31:42
71
原创 Rust println!宏(Rust打印方法、println!()、Rust格式化输出、Rust格式化字符)(对齐标记<^>、宽度、正负号、井号#进制前缀、精度、数据打印类型、千位分隔符)格式化参数
在 Rust 中,宏(macros)提供了一种方式来写可扩展的代码,在编译时进行代码的扩展。println!是一个宏而不是函数,这意味着在编译时,println!宏的代码会被展开,插入到调用它的地方。自定义类型可以实现或fmt::Debug// 测试代码x: i32,y: i32,write!println!
2025-01-11 14:55:22
1186
2
原创 float和double取值范围
float的指数范围为-2^7~2^7-1(即-128~127),而double的指数范围为-2^10~2^10-1(即-1024~1023),并且指数位是补码的形式来划分的。float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。所以byte取值范围是:-2^7~2^7-1,即:-128~127(因为0也包括在内,所以在正数范围是2^7-1)
2024-12-18 20:50:59
723
原创 findmnt、lsblk、mount 命令查看磁盘、目录挂载、挂载点以及文件系统格式等情况
findmnt 展示出了目标挂载点( TARGET )、源设备( SOURCE )、文件系统类型( FSTYPE )以及相关的挂载选项( OPTIONS ),当然我们知道linux 一切都是以 / 为基础进行相关的挂载操作,其他设备或者文件系统都挂载在根下面的不同目录下。df 命令被用来报告文件系统的磁盘空间使用情况。这里也通过df -i 命令 一可以查看inode使用情况,二可以查看挂载点和磁盘关系。根( / )文件系统的类型是 xfs。运行下面的命令来找出某个特定分区的文件系统类型。
2024-08-26 09:48:22
2119
原创 skynet源码阅读<7>--死循环检测
除了for循环之外的其它循环,比如while或repeat,在LUA中都是通过条件判断结合JMP跳转来实现的,因此也是可以被检查报错的。至此,如何打断死循环并报错跳出的处理我们已经清楚了,可是新的问题又来了,skynet中是如何检测到死循环发生的呢?这样,当线程X处理消息陷入长久的阻滞时,monitor线程便会检测到X正在处理消息(skynet_monitor->destination不为空)并且version未改变,给出警告。可以看到,signal为0时,将skynet_sig_L置空。
2024-07-28 16:47:35
872
转载 Lua 堆栈的工作原理和使用方式
通过避免频繁的对象创建和销毁、减少不必要的对象拷贝、合理设置垃圾回收参数、使用适当的数据结构等方法,可以提高堆的性能和内存利用效率。需要注意的是,Lua的堆中存储的是对象本身的数据,而不是对象的引用或指针。需要注意的是,栈上的数据是临时存储的,并不持久保存。总之,Lua的堆是一个用于存储动态分配的数据的区域,通过内置的垃圾回收机制进行管理。在使用Lua堆时,应注意适当地创建和销毁对象,管理引用计数,避免不必要的对象创建,以及高效使用内存,以确保程序的性能和内存管理的有效性。栈中存储的是各种Lua值的副本。
2023-11-12 03:31:05
259
转载 Lua 堆栈的工作原理和使用方式
通过避免频繁的对象创建和销毁、减少不必要的对象拷贝、合理设置垃圾回收参数、使用适当的数据结构等方法,可以提高堆的性能和内存利用效率。需要注意的是,Lua的堆中存储的是对象本身的数据,而不是对象的引用或指针。需要注意的是,栈上的数据是临时存储的,并不持久保存。总之,Lua的堆是一个用于存储动态分配的数据的区域,通过内置的垃圾回收机制进行管理。在使用Lua堆时,应注意适当地创建和销毁对象,管理引用计数,避免不必要的对象创建,以及高效使用内存,以确保程序的性能和内存管理的有效性。栈中存储的是各种Lua值的副本。
2023-11-12 03:28:32
788
转载 常用设计模式
总之,模板方法模式是一种常用的设计模式,它通过定义算法的骨架和抽象方法,将算法的具体实现延迟到子类中。模板方法模式通过在抽象类中定义算法的框架,将具体实现延迟到子类中,从而使得子类可以根据需要重新实现特定的步骤,同时保持算法的结构不变。工厂模式将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来获取所需的对象,而不需要直接使用new关键字实例化对象。建造者模式的主要目的是通过一个独立的建造者类来封装对象的构建过程,客户端只需指定具体的建造者,而无需知道具体的构建细节。
2023-11-12 02:17:54
176
转载 C++ 指针
总之,指针是一个强大而灵活的工具,但同时也需要谨慎使用。合理管理指针的生命周期、避免野指针和悬空指针,以及正确释放动态分配的内存,都是确保指针使用正确和安全的关键。理解并遵循指针的最佳实践,可以避免这些问题,并提高代码的正确性和安全性。C++ 中的指针是一个重要的概念,它允许我们直接访问和操作内存地址。解决方法是在使用指针之前,确保它被初始化或赋值为有效的内存地址。解决方法是确保指针在合法范围内进行访问,避免越界访问。解决方法是在解引用之前,确保指针指向有效的内存地址。,或者避免在释放内存后继续使用指针。
2023-11-12 02:14:30
143
原创 lua socket客户端 lua string.pack字符串打包
lua socket客户端 lua string.pack字符串打包_gdut17的博客-CSDN博客
2023-04-20 15:00:23
396
转载 CMake学习
可以用来指定工程的名字和支持的语言,默认支持所有语言PROJECT (HELLO) 指定了工程的名字,并且支持所有语言—建议PROJECT (HELLO CXX) 指定了工程的名字,并且支持语言是C++PROJECT (HELLO C CXX) 指定了工程的名字,并且支持语言是C和C++该指定隐式定义了两个CMAKE的变量_BINARY_DIR,本例中是 HELLO_BINARY_DIR_SOURCE_DIR,本例中是 HELLO_SOURCE_DIR。
2023-03-24 22:44:24
365
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅