设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 229|回复: 12

[原创发布] 子进程与pipeline

[复制链接]

Lv4.逐梦者 (版主)

梦石
0
星屑
13307
在线时间
1502 小时
注册时间
2011-7-8
帖子
2357

开拓者

发表于 2019-4-5 19:54:01 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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, 下载次数: 30)

评分

参与人数 4+4 收起 理由
kirh_036 + 1 精品文章
RMVXA + 1 精品文章
正太君 + 1 给大佬倒茶┑( ̄Д  ̄)┍
SixRC + 1 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *

Lv4.逐梦者

梦石
0
星屑
5962
在线时间
1718 小时
注册时间
2014-10-4
帖子
518
发表于 2019-4-5 21:11:59 | 显示全部楼层
本帖最后由 SixRC 于 2019-4-5 22:01 编辑

截图未命名.png
别打坛游了
快去修bug!
(不是很熟python(几乎不写) 整个逻辑稍微稍微懂)
(所以为什么要加一句buf[::-1])
(这样不是输出反了吗..?????)
删掉就正常了

点评

突然思考是不是我开始看漏了 哎不管怎么说是我刚开始没理解反转的意图..果然不是没有理由的  发表于 2019-4-6 01:28
改成reverse啦  发表于 2019-4-6 01:08
好像很有道理的样子 (可是文件名明明是release)  发表于 2019-4-5 23:04
这就是命名为test.py而不是echo.py的原因~  发表于 2019-4-5 22:57
K
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

聪仔

梦石
0
星屑
4412
在线时间
2920 小时
注册时间
2013-12-26
帖子
3107
发表于 2019-4-6 23:31:59 | 显示全部楼层
自从得知RM的进程是假的之后就对这个问题死心了...直到这篇文章出现,死去的心又重新跳动起来...

点评

没啥没啥,千万别对某聪有所期待蛤...  发表于 2019-4-8 20:05
所以准备干点啥……  发表于 2019-4-8 18:53
聪聪全国第三帅...
聪聪的RM能力雷达图
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1508
在线时间
126 小时
注册时间
2013-10-6
帖子
188
发表于 2019-4-15 15:03:28 | 显示全部楼层
说起来我最近写了一个开源的RPC模块…
两边还可以在不同的电脑上

点评

RPC是一种概念,是对本地函数调用概念的扩展,有很多种实现。管道的话只是从流里读数据,相关考虑少了很多。  发表于 2019-4-15 17:49
原来这个叫RPC……  发表于 2019-4-15 16:38
←你看到一只经常潜水的萌新。
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
13307
在线时间
1502 小时
注册时间
2011-7-8
帖子
2357

开拓者

 楼主| 发表于 2019-4-24 11:14:46 | 显示全部楼层
本帖最后由 guoxiaomi 于 2019-4-24 11:27 编辑

关于打包exe的问题,最近尝试使用auto_py_to_exe打包一个简单的websocket客户端程序,打包完毕有230M,看上去把Anaconda的半壁江山都打进去了,遂放弃。

最终选定的方案是 ruby + ocra + boxedapppacker,操作流程如下:

1. 安装ruby、ocra和boxedapppacker
首先我电脑上的ruby是32位的2.6.3:rubyinstaller-devkit-2.6.3-1-x86,安装后继续运行更新devkits,依次选1,2,3
  1. ridk install
复制代码

然后安装ocra-1.3.10:
  1. gem install ocra
复制代码

最后安装boxedapppacker:https://www.downloadfullsoft.com/fa/post/30628/

2. ocra打包程序
写好你的ruby代码,比如是 main.rb,直接用 ocra 打包:
  1. ocra main.rb --debug-extract
复制代码
注意 ocra 会试图运行一遍你的程序,你的程序一定要有退出的机制,否则后续的打包步骤不会执行。比如在加载库完毕后直接检测 ARGV,没有参数就立刻退出。
直接执行生成的 main.exe,由于打包时携带了参数--debug-extract,会在本地看到一个文件夹 ocraXXX.tmp,里面就是被 ocra 检测到的文件。
ocra会把文件解压到临时文件夹再执行,使用boxedapp打包会将文件夹解压到内存里,并且可以访问exe同级目录下的内容。

3. boxedapp打包
运行boxedapp:
1. 选择Files,用import directory载入ocra生成的bin,lib,src文件夹。你的main.rb应该在src内。当然你也可以添加更多的文件。
2. 选择 Registry,取消 enable
3. 选择options,勾选 Shared virtual environment with child process 和 Compress files
4. Icon、Version随意设置,splash screen是程序打开时候出现的宣传图,后台程序不需要这个。
5. 回到上面,选择Input.exe为 <ExeDir>\bin\ruby.exe,packed.exe选择合适的位置导出
6. Override command line:
  1. <ExeDir>\bin\ruby.exe <ExeDir>\src\main.rb
复制代码

7. 勾选Run packed exe in virtual environment,否则可能打包失败。
8. 点击build,收菜,测试 main.exe 是否正常执行。要注意exe运行和ruby脚本正式开始执行中间约有3s的间隔。即使不执行脚本改为执行
  1. <ExeDir>\bin\ruby.exe -v
复制代码
也有明显1s的延迟。

4. 推荐一个网站:https://repl.it/languages,可以在此网站上运行 sinatra 服务端用作测试。

因为记忆力越来越差了,就写在这里以后还能回来找找。实际上有些步骤并不是很确定非做不可,但是照着做应该没问题。

评分

参与人数 1+1 收起 理由
SixRC + 1 以前发的帖我都要翻好久 悲伤了.

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2019-9-18 00:14

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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