阿荣社区采集员1 发表于 2025-9-7 12:15:08

【代码】研究一下关于DNF引擎对Squirrel (.nut)脚本的调用机制

说起来,这个Squirrel(松鼠)语言写的文件拓展名是.nut(坚果),坚果是松鼠最爱吃的食物,这个小设计倒是挺有趣的。
好的言归正传,还是先事先声明一下,本人并非真正意义上的程序员,只能算大学是计算机专业(学过C++、Java、Python)的半吊子选手,最近想魔改技能,所以从头研究DNF引擎对脚本文件的调用原理,很多地方可能在座大佬们都已经知道了,我只是借用发帖的机会,正好整理一下我自己的理解,同时如有错误,请大佬不吝赐教。

阿荣社区采集员1 发表于 2025-9-7 12:16:05

首先,最开始读其他大佬写的代码的时候我就一直有个疑问,这些函数究竟是在什么状态下被调用。
计算机不是人,并不知道什么时候该做什么事情, 一定是你要他做A他才去做A,否则它并不会懂。
所以我一直试图在sqr路径下寻找一个真正意义上的主调函数,或者说,一个总接口吧,但是没找到,这就让我有些疑惑。
难不成真的会自动调用?
嘿,您还别说,DNF引擎还真的一定意义上做到了“智能化”。
大家都会在sqr的根目录下找到一个文件loadstate.nut (sqr/loadstate.nut)
里面的代码大体是两句:
sq_RunScript()
以及
dofile()

阿荣社区采集员1 发表于 2025-9-7 12:17:05

这里解释几个问题。
1.loadstate.nut是干什么的,为什么要有这个文件
2.sq_RunScript()和dofile()又是干什么的,为什么要这么写

Dveridow 发表于 2025-9-7 12:18:01

感谢分享

阿荣社区机器人 发表于 2025-9-7 12:18:31

火钳刘明

阿荣社区采集员1 发表于 2025-9-7 12:19:25

1.loadstate.nut
学过C语言或者类似语言的同学应该能猜出来,loadstate.nut类似于头文件、或者引用的包。
这个文件会在引擎启动游戏的时候预加载,从而加载里面的文件、代码
2.sq_RunScript()和dofile()
这两个都是运行文件,只不过区别在于,前者倾向于运行封包内部文件,而后者则支持封包外文件外部调用,至于优劣对比的话,两折各有优劣。
对于sq_RunScript来说:
用途:加载游戏封包内的脚本文件(.nut)
路径:基于游戏资源目录的相对路径
速度:直接从内存封包读取,速度快
修改后生效时间:需重打包PVF
dofile()
用途:加载文件系统中的脚本文件
路径:绝对路径或相对项目目录路径
速度:磁盘I/O较慢
部署环境:仅在开发/测试使用
修改后生效时间:实时生效
所以,开发测试的时候大家可以使用dofile,但是最后的成品,最好都改成sq_RunScript,毕竟一个两个文件看不出差距,当文件多了之后,读取速度就出现差别了

阿荣社区采集员1 发表于 2025-9-7 12:19:45

然后,我们在loadstate中,随便点击一个代码去瞧瞧。


这里以Character/gunner_load_state.nut为例
进来之后发现大体有两类函数。
pushScriptFiles和pushState

阿苏 发表于 2025-9-7 12:20:36

前排

阿荣社区采集员3 发表于 2025-9-7 12:20:58

收藏了

阿荣社区采集员1 发表于 2025-9-7 12:21:37

这两个是什么呢?
先说结论,我的理解下,区别主要有两方面。
1.加载策略上。
pushScriptFiles是预加载,类似于一种全局加载、全局变量一样,好处就是理论上讲方便开发、逻辑通用,但成也萧何败也萧何,预加载或者全局加载的缺点也很明显,始终占用内存、开销稍微大一些。
IRDSQRCharacter.pushState则不一样,满足状态时动态加载,内存占用低,性能开销低,效率高。
2.触发方式上
pushState是检测到指定状态立刻调用指定脚本,而pushState则是在全局调用的状态下,需要开发者手动检测状态ID(所以响应速度上会有区别,不过追求单机的同学们,这两个倒是都可以用)

阿荣社区采集员1 发表于 2025-9-7 12:22:18

强,无敌

阿荣社区采集员1 发表于 2025-9-7 12:22:55

阿荣社区采集员3 发表于 2025-9-7 12:23:23

牛逼

阿荣社区采集员3 发表于 2025-9-7 12:23:49

xiaomi 发表于 2025-9-7 12:24:03

要是我初学能看到这样的帖子就好了


页: [1]
查看完整版本: 【代码】研究一下关于DNF引擎对Squirrel (.nut)脚本的调用机制