找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 122|回复: 14

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

[复制链接]

3955

主题

3万

回帖

11万

积分

出神入化

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

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

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

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

积分
118276
 楼主| 发表于 昨天 12:17 | 显示全部楼层
这里解释几个问题。
1.loadstate.nut是干什么的,为什么要有这个文件
2.sq_RunScript()和dofile()又是干什么的,为什么要这么写
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3271

主题

3万

回帖

10万

积分

出神入化

积分
105874
发表于 昨天 12:18 | 显示全部楼层
感谢分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

发表于 昨天 12:18 | 显示全部楼层
火钳刘明
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

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

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

积分
118276
 楼主| 发表于 昨天 12:19 | 显示全部楼层
然后,我们在loadstate中,随便点击一个代码去瞧瞧。


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3814

主题

3万

回帖

11万

积分

出神入化

积分
116761
发表于 昨天 12:20 | 显示全部楼层
前排
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3857

主题

3万

回帖

11万

积分

出神入化

积分
117815
发表于 昨天 12:20 | 显示全部楼层
收藏了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

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

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

积分
118276
 楼主| 发表于 昨天 12:22 | 显示全部楼层
强,无敌
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3955

主题

3万

回帖

11万

积分

出神入化

积分
118276
 楼主| 发表于 昨天 12:22 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3857

主题

3万

回帖

11万

积分

出神入化

积分
117815
发表于 昨天 12:23 | 显示全部楼层
牛逼
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3857

主题

3万

回帖

11万

积分

出神入化

积分
117815
发表于 昨天 12:23 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

3281

主题

3万

回帖

10万

积分

出神入化

积分
105869
发表于 昨天 12:24 | 显示全部楼层
要是我初学能看到这样的帖子就好了


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
阿荣社区欢迎你(bbs.vul7.com)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表