- 博客(118)
- 资源 (5)
- 收藏
- 关注
转载 Lua 的代码加载和热更新方式
本文介绍了Lua在游戏服务器热更新中的代码加载方式及实现方法。主要内容包括:1) 三种模块加载方式(dofile、loadfile、require)的特点及局限性;2) 热更新时对不同类型变量的处理策略,重点分析了局部变量(upvalue)的保留方法;3) 使用debug库API实现upvalue收集和更新的具体方案;4) 面向对象场景下的热更新处理方式。文章通过多个代码示例详细说明了如何通过编写热更新脚本来实现变量保留、函数替换等关键操作,为Lua热更新提供了实用解决方案。
2025-12-20 02:42:26
14
转载 skynet.start 的作用详细解析
服务初始化:注册消息分发函数(如),定义服务的主逻辑。启动事件循环:使服务能够接收和处理来自其他服务的消息。生命周期管理:标记服务进入运行状态,触发后续消息处理。核心作用是 Skynet 服务的入口点,负责初始化消息处理器并启动事件循环。必要性:所有独立运行的 Skynet 服务必须调用此函数(除非使用替代机制如最佳实践:在服务初始化阶段完成消息分发注册、资源加载等操作,确保服务正常响应消息。-- 完整示例:一个简单的计算服务endendend)end)
2025-11-20 01:33:01
14
转载 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
22
原创 Rust println!宏(Rust打印方法、println!()、Rust格式化输出、Rust格式化字符)(对齐标记<^>、宽度、正负号、井号#进制前缀、精度、数据打印类型、千位分隔符)格式化参数
在 Rust 中,宏(macros)提供了一种方式来写可扩展的代码,在编译时进行代码的扩展。println!是一个宏而不是函数,这意味着在编译时,println!宏的代码会被展开,插入到调用它的地方。自定义类型可以实现或fmt::Debug// 测试代码x: i32,y: i32,write!println!
2025-01-11 14:55:22
1083
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
649
原创 findmnt、lsblk、mount 命令查看磁盘、目录挂载、挂载点以及文件系统格式等情况
findmnt 展示出了目标挂载点( TARGET )、源设备( SOURCE )、文件系统类型( FSTYPE )以及相关的挂载选项( OPTIONS ),当然我们知道linux 一切都是以 / 为基础进行相关的挂载操作,其他设备或者文件系统都挂载在根下面的不同目录下。df 命令被用来报告文件系统的磁盘空间使用情况。这里也通过df -i 命令 一可以查看inode使用情况,二可以查看挂载点和磁盘关系。根( / )文件系统的类型是 xfs。运行下面的命令来找出某个特定分区的文件系统类型。
2024-08-26 09:48:22
1996
原创 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
820
转载 Lua 堆栈的工作原理和使用方式
通过避免频繁的对象创建和销毁、减少不必要的对象拷贝、合理设置垃圾回收参数、使用适当的数据结构等方法,可以提高堆的性能和内存利用效率。需要注意的是,Lua的堆中存储的是对象本身的数据,而不是对象的引用或指针。需要注意的是,栈上的数据是临时存储的,并不持久保存。总之,Lua的堆是一个用于存储动态分配的数据的区域,通过内置的垃圾回收机制进行管理。在使用Lua堆时,应注意适当地创建和销毁对象,管理引用计数,避免不必要的对象创建,以及高效使用内存,以确保程序的性能和内存管理的有效性。栈中存储的是各种Lua值的副本。
2023-11-12 03:31:05
232
转载 Lua 堆栈的工作原理和使用方式
通过避免频繁的对象创建和销毁、减少不必要的对象拷贝、合理设置垃圾回收参数、使用适当的数据结构等方法,可以提高堆的性能和内存利用效率。需要注意的是,Lua的堆中存储的是对象本身的数据,而不是对象的引用或指针。需要注意的是,栈上的数据是临时存储的,并不持久保存。总之,Lua的堆是一个用于存储动态分配的数据的区域,通过内置的垃圾回收机制进行管理。在使用Lua堆时,应注意适当地创建和销毁对象,管理引用计数,避免不必要的对象创建,以及高效使用内存,以确保程序的性能和内存管理的有效性。栈中存储的是各种Lua值的副本。
2023-11-12 03:28:32
735
转载 常用设计模式
总之,模板方法模式是一种常用的设计模式,它通过定义算法的骨架和抽象方法,将算法的具体实现延迟到子类中。模板方法模式通过在抽象类中定义算法的框架,将具体实现延迟到子类中,从而使得子类可以根据需要重新实现特定的步骤,同时保持算法的结构不变。工厂模式将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来获取所需的对象,而不需要直接使用new关键字实例化对象。建造者模式的主要目的是通过一个独立的建造者类来封装对象的构建过程,客户端只需指定具体的建造者,而无需知道具体的构建细节。
2023-11-12 02:17:54
158
转载 C++ 指针
总之,指针是一个强大而灵活的工具,但同时也需要谨慎使用。合理管理指针的生命周期、避免野指针和悬空指针,以及正确释放动态分配的内存,都是确保指针使用正确和安全的关键。理解并遵循指针的最佳实践,可以避免这些问题,并提高代码的正确性和安全性。C++ 中的指针是一个重要的概念,它允许我们直接访问和操作内存地址。解决方法是在使用指针之前,确保它被初始化或赋值为有效的内存地址。解决方法是确保指针在合法范围内进行访问,避免越界访问。解决方法是在解引用之前,确保指针指向有效的内存地址。,或者避免在释放内存后继续使用指针。
2023-11-12 02:14:30
129
原创 lua socket客户端 lua string.pack字符串打包
lua socket客户端 lua string.pack字符串打包_gdut17的博客-CSDN博客
2023-04-20 15:00:23
373
转载 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
350
转载 pthread_cond_wait学习笔记
pthread_cond_t表示多线程的条件变量,用于控制线程等待和就绪的条件。一:条件变量的初始化:条件变量和互斥锁一样,都有静态动态两种创建方式,静态方式使用PTHREAD_COND_INITIALIZER常量初始化。pthread_cond_t cond = PTHREAD_COND_INITIALIZER;动态方式初始化:1 首先要new或者malloc一个pthread_cond_t类型变量,用完后记得delete或者free掉。2 动态方式调用pthread_cond
2022-01-26 15:15:57
453
转载 函数pthread_cond_init()的使用方法
条件变量的结构为pthread_cond_t,函数pthread_cond_init()被用来初始化一个条件变量。它的原型为: extern int pthread_cond_init __P ((pthread_cond_t *__cond,__const pthread_condattr_t *__cond_attr)); 其中cond是一个指向结构pthread_cond_t的指针,cond_attr是一个指向结构pthread_condattr_t的指 针。结构 pthread_cond
2022-01-26 14:52:46
4127
2
原创 SKYNET CONFIG
include "config.path"-- preload = "./examples/preload.lua" -- run preload.lua before every lua service runskynetdir = "/home/arch/git/skynet/"thread = 8logger = nillogpath = "."harbor = 1address = "127.0.0.1:2526"master = "127.0.0.1:2013"star...
2022-01-02 17:51:59
3468
转载 Skynet服务器框架——C源码剖析启动流程
在Linux下配置安装 skynet 的环境这里略过,为了从底层更好地理解整个框架的实现过程,我们有必要剖析一下源码,由于底层的源码都是用C语言写的,lua脚本基本是用来进行业务层开发,所以我们从C源码开始解读框架。打开下载包的 skynet-src 目录,这里是skynet框架的核心C源码,接下来我们就要来解读 skynet_main.c 和 skynet_start.c 这两个与skynet启动相关的C源码。1.入口函数和初始化:我们启动 skynet 使用的指令 ./skynet exampl
2021-06-08 09:29:02
575
原创 加载动态链接库——dlopen dlsym dlclose
加载动态链接库——dlopen dlsym dlclosehttps://www.cnblogs.com/ZhaoxiCheung/p/9424930.html
2021-06-07 17:35:55
136
原创 Linux 信号
linux中sigaction函数详解https://blog.csdn.net/weibo1230123/article/details/81411827
2021-06-07 15:19:06
118
原创 jemalloc内存占用问题
https://www.cnblogs.com/Lifehacker/p/jemalloc_settings.html
2021-06-05 11:49:40
669
转载 使用 jemalloc profile memory
对于长时间运行的服务端程序,内存的使用一直是一个非常重要的监控指标,当内存的使用量一直在上升的时候,我们就需要警觉起来,因为很有可能整个系统出现了内存泄露。那么剩下的问题就比较简单了,如何动态的获知哪里有内存泄露呢?对 Go 的程序来说,我们可以使用语言内置的 pprof 工具非常方便的对内存进行 profile,我们只需要在程序里面 import _ "net/http/pprof",这样启动的 HTTP server 服务器就能够被直接 profile 了。但对 Rust,情况就没那么简单了。因
2021-06-05 11:26:12
3052
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅