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

Project1

 找回密码
 注册会员
搜索
查看: 3833|回复: 6
打印 上一主题 下一主题

[原创发布] 【RMXP改造计划:开源】0x01模块化开发与多线程支持

[复制链接]

Lv2.观梦者

梦石
0
星屑
900
在线时间
75 小时
注册时间
2017-7-10
帖子
27
跳转到指定楼层
1
发表于 2019-6-7 17:13:06 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

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

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

x
本帖最后由 antilmid 于 2019-6-7 17:45 编辑

【项目简介:自己正在制作游戏,于是在自己的游戏项目中衍生出了一个RMXP的空壳框架思想,打算将这一部分开源分享。框架改造我们会一边进行一边发帖,目的是让大家了解我们的框架思想,并且鼓舞更多作者制作更多精彩的框架,更新不定期,不需要关注和塞糖】

1.模块化的开发,让mod成为可能

        模块化的开发,是增加工作效率和协同开发的好方案,为了实现模块化开发,我们引入一个Import类,我们可以亲切的称呼Import对象为“加载器”,每一个“加载器”都是一个域,倘若两个“加载器”互相独立,则里面的环境也自然互相独立。所以有了这个想法之后,那么这个想法的行为可以用伪代码描述为:        
       loader = Import.new(根目录名,  扩展名)        
        这里描述了“加载器”的创建,loader和loader2虽然都是加载器,但是他们提供给代码运行的域是不同的,所以对于一般的开发,我们通常只需要一个域,则我们只需要复用一个加载器就好了。
        让“加载器”加载代码,我们设想了三种方案:1,export曝出到全局   2,open自我曝出,get全局接收  3,run无视曝出规则直接运行,曝出最后一条语句返回值。我们用伪代码来诠释三种方案。

        ⚪export方案
        # 这个文件我们视为    mod.ruby
       def foo
              p "这里是mod"
       end

       # 这里是主程序
        loader.load("mod.ruby")
       f = loader.export
       f.foo    # 输出    这里是mod  


        ⚪open/get方案
        # 这个文件我们视为    mod.ruby
       f  = Proc.new{
              p "这里是mod"
       }
       open(f)

       # 这里是主程序
        loader.load("mod.ruby")
       f = loader.get
       f.call    # 输出    这里是mod


        ⚪run方案
        # 这个文件我们视为    mod.ruby
              p "这里是mod"

       # 这里是主程序
        loader.load("mod.ruby")
       f.run   # 输出    这里是mod  
        介于这一种模块化思想,我们做了一个简单的Import类,完成了上面的规则方案。
class Import
  #--------------------------------------------------------------------------
  # ● 初始化
  #     dir      : 根目录
  #     ext      : 扩展名
  #--------------------------------------------------------------------------
  def initialize(dir="scripts/", ext=".ruby")
    @hashKey = 0
    @data = nil
    @dir = dir
    @ext = ext
  end
  #--------------------------------------------------------------------------
  # ● 载入
  #     filename : 文件名
  #--------------------------------------------------------------------------
  def load(filename)
    @data = nil
    @str = ""
      File.open(@dir + filename + @ext, 'r') { |file|
        file.each_line { |line|
          @str = @str+line+"\n"
        }
      }
    end
  #--------------------------------------------------------------------------
  # ● 模块化导出
  #--------------------------------------------------------------------------
   def export
     @str = "class Export"+ @hashKey.to_s + " \n" + @str +"end\n"
     @str =  @str + "Export" + @hashKey.to_s + ".new"
     @hashKey = @hashKey + 1
   end
  #--------------------------------------------------------------------------
  # ● 运行载入的文件
  #--------------------------------------------------------------------------
   def run
     return eval(@str)
   end
  #--------------------------------------------------------------------------
  # ● (内核函数)自我导出
  #-------------------------------------------------------------------------
   def open(param)
     @data = param
   end
  #--------------------------------------------------------------------------
  # ● 获取自我导出数据
  #-------------------------------------------------------------------------
   def get
     if @data == nil
       eval(@str)
     end
     return @data
   end
end


        这个类是很简单一个基础实现,喜欢动手的开发者可以丰富这个模块,定义出自己的模块化规则。基于该类,我们把RM的官方构架搬到了外部,只是做一个实验,有兴趣可以下载尝试

官方框架外部实现.zip (215.46 KB, 下载次数: 92)

2.多线程,让RM效率提升
一个线程,就是一个世界,两边的人独立的或者,他们,一同改变RM这个大世界... ...
我们中二的定义一个类,叫做“World”,由它产生的对象,都是一个“次世界”,我们将主世界的一些事情移交到次世界去执行,让我们的主世界安心的渲染游戏... ...
       # 这里是伪代码
        world = World.new
    task = Proc.new{
         p "这是被主世界抛弃的任务"
    }
    world.join(task)
         基于想法,我们粗糙的实现了一个“世界类”。

class World
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize
    @proc = []
    @thread = Thread.new {
      loop do
        proc = @proc.shift
        if proc
          proc.call()
        end
      end
    }
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #     proc     : 作用函数,类或Proc对象
  #--------------------------------------------------------------------------
  def join(proc)
    @proc.push(proc)
  end
  #--------------------------------------------------------------------------
  # ● 获取线程
  #--------------------------------------------------------------------------
  def getThread
    return @thread
  end
  #--------------------------------------------------------------------------
  # ● 队列是否有任务
  #--------------------------------------------------------------------------
  def task?
    return @proc.length
  end
  #--------------------------------------------------------------------------
  # ● 退出
  #--------------------------------------------------------------------------
  def exit
    @thread.exit
  end
end















评分

参与人数 1+1 收起 理由
ppspssss + 1 看不懂...如新手能用就好了

查看全部评分

Lv4.逐梦者

梦石
0
星屑
19468
在线时间
3108 小时
注册时间
2013-1-11
帖子
1292
5
发表于 2019-6-8 09:07:35 | 只看该作者
可惜XP没Fiber..
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
42399
在线时间
7602 小时
注册时间
2009-7-6
帖子
13506

开拓者贵宾

4
发表于 2019-6-7 22:01:41 | 只看该作者
Ruby的多线程表现不尽人意

点评

的确只有一条呀,ruby没有真正意义上的多线程  发表于 2019-6-8 09:28
你说的对,就目前测试来看,除了有一种异步的感觉,性能上毫无提升,我甚至开始怀疑它可能程序线程只有一条。  发表于 2019-6-7 22:21
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

3
发表于 2019-6-7 21:47:44 | 只看该作者
高大尚的样子,是提升xp软件性能用的吗?
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
664
在线时间
101 小时
注册时间
2016-7-15
帖子
143
2
发表于 2019-6-7 21:35:51 | 只看该作者
大佬发帖,支持一波。话说模组是类似于steam上扩展包这样或者类似于饥荒创意工坊这种有额外功能的?如果是这样开个开关让玩家自由选择是否开启,默认下载即可。如果大佬要做那种别人也可以进行模组写作来一定限度的改变游戏的话就当我没说过= =
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-23 13:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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