加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 guoxiaomi 于 2019-4-6 01:15 编辑
RPG Maker XP/VX/VA 可以使用 win32api 增强功能,但是更好的方法应该是创建一个独立的子进程,把复杂、费时的操作交给子进程来完成,游戏通过 pipeline 与子进程进行通讯。
当然我是不会了,于是找了大神帮忙写API的调用,封装和通讯协议由我完成。
在考虑到管道阻塞的情况下,使用了以下特殊的通讯协议:
1. 每次先向管道发送 4 个字节,表示接下来要发送的内容长度,接下来再发送实际的内容
2. 如果上一步的长度是 0,表示心跳帧(ping-pong)
3. 主进程在读取 pipe 中内容的之前,需要发送 ping 帧
4. 子进程接受到 ping 帧后必须立刻发送 pong 帧
5. 子进程在长时间未接受到 ping 帧的情况下自动结束
范例:
20190405-pipeline-reverse.zip
(6.08 MB, 下载次数: 107)
范例里调用了 Scripts 文件夹下的 test.exe,这个 exe 实际上是使用 auto_python_to_exe 打包了同一目录下 test.py 生成的 exe 文件。
在 test.py 里写好了子进程的通讯协议和超时退出等行为。
注:
1. 由于RM中的Thread不是非常的稳定,所以这里不采用多线程的写法,需要定期调用 update 方法
2. 可以创建任意多个子进程,也可以主动结束子进程
3. 缓冲区的长度是 10kB,脚本里搜索 10240 即可找到
使用方法:
创建一个子进程对象,传入的参数是执行的命令行程序,代码块里是收到子程序发送的信息后回调的内容。
此处,如果安装了python,可以传入 "python Scripts/test.py"
$pipeline = Pipeline.new("Scripts/test") { |msg| p "recv msg: #{msg}" }
$pipeline = Pipeline.new("Scripts/test") { |msg|
p "recv msg: #{msg}"
}
每帧更新,当收到信息后会执行上面的回调:
向子进程发送消息,在范例里子进程接收到消息后会立刻返回消息.reverse:
$pipeline.write("hello, world")
$pipeline.write("hello, world")
立即结束子进程:
最主要的用途就是无限制的给RM提供功能,并且由于是独立进程不拖累RM自身的运行(甚至可以吃满CPU)
推荐使用Python+auto_python_to_exe,以及RubyMarshal库创建ruby的序列化对象。
当然你喜欢的话用Ruby、C、Lua、Javascript也都是可以的……
最后感谢 SixRC 写的后台运行脚本~
如果只是想后台跑一个程序,而不使用管道通讯,直接调用 CreateProcess 即可。
参见 create 方法内部,注意原先传入的参数 in_r, out_w 直接改成 0. |