查看: 11424|回复: 30

高手讨论→RM里你们在乎程序效率吗?

[复制链接]
梦石
0
星屑
1408
在线时间
831 小时
注册时间
2007-12-25
回帖
1406
发表于 2010-9-15 16:00:48 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 九夜神尊 于 2010-9-15 19:28 编辑

忘了是哪位高手说的,RM的内部结构不是最优的。

那时候我还不懂,只是记住并知道这么回事。

在我写自己的系统的时候,写到了人物属性的取得。
这个模块我想大家都很熟悉,防御 =武器防御+帽子防御+盾防御+衣服防御。

但是,每次获取防御力都要经过这么一次运算,然而结果却大部分相同。显然程序效率低很多(当今的电脑似乎可以忽略)。

不过我想,RM作者最初不会没考虑到,而是为了让使用者容易上手。如果把每个属性保存成一个变量,每次读取的时候,直接
调用,在换装备的时候,再改属性。虽然效率会高很多,但是新手却很难上手。

不晓得各位高手对程序效率怎么看待的,就我本人而言,一个程序在我能力下,有优化的空间,我就觉得这程序没完成。

不过像我说的,属性的获取我倒是决定不优化,因为优化后会与现有大部分脚本脱节。

以下是我的一个感叹

血条,每次都要描绘么?

不,只需要在HP 或MAX_HP有改变的时候重新描绘

每次改变都要重新描绘么?

不,血多了就描绘一段红色把黑条盖住,血少了就描绘一条黑色把红条盖住

然而最后要吐自己的是:在乎效率就别用RUBY

点评

现在的电脑运算能力越来越快,内存容量越来越大.....  发表于 2010-10-3 15:40

评分

参与人数 1星屑 +100 收起 理由
回转寿司 + 100 讨论帖鼓励~

查看全部评分

精卫赤龙腾    九
总是存在一种强大,去完成似乎不可能的事情.
无畏战乾程    夜
或是需要一种勇气,去挑战几乎不存在的胜利.
一味玄真魂     神
这是拥有一种恒心,去化解根本没有解的困难.
烈卫开天径    尊
只是带着一种决心,去争取残存的最后的希望。

无节操

梦石
0
星屑
608
在线时间
795 小时
注册时间
2009-2-6
回帖
3910

开拓者贵宾

发表于 2010-9-15 19:26:08 | 显示全部楼层
别同?是指别用麽......

点评

moy
我只知道RGSS != Ruby ...不过反正Ruby本身也完全谈不上高效就是...  发表于 2010-9-15 19:40
咋给999经验不得行呢  发表于 2010-9-15 19:28

评分

参与人数 1星屑 +60 收起 理由
九夜神尊 + 60 强人

查看全部评分

Brandnew day, Brandnew Life
                             规 实在  中
暂为素材区版主,版其  琢磨
应援一下~
RPG制作大师授权素材推广计划
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-9-15 20:41:36 | 显示全部楼层
程序效率是一个大话题,够写好几本书了(编译原理中的编译器优化理论),不过概括地说,常用的手段有:

降低算法复杂度
包括优化整体算法结构,使用合适的、高效的数据结构,给耗时的运算添加合适的分歧跳转(即主楼提到的“只需要在HP 或MAX_HP有改变的时候重新描绘”)等

最小化冗余
见 http://rpg.blue/thread-154785-1-2.html 11楼

紧密分配相关性强的代码和数据的位置
这提高了空间访问局部性,也就提高了 Cache 和内存操作效率

发挥内存阶层的长处
效率上,目前主流的配置大概是:CPU 寄存器 > CPU Cache > 闪存(USB 内存) > RAM(主内存) > HDD(硬盘) > 磁带 > ……
效率越高的存储方式在内存阶层中越处于上层,要尽量使用上层的存储,比如 RM 的 Cache 就是避免了频繁进行硬盘读写操作,而把位图的存储带到了相对高效的 RAM 内存中(因为 RAM 在 HDD 的上层)

简化语言相关、机器相关的运算
有些运算方式在有些语言或机器上效率低于另一些运算方式——
语言相关:如在头部检测条件的循环效率效率低于在尾部检测条件的循环
机器相关:如加减法效率低于乘除法、浮点数效率低于定点数

以上,优化 in a nut shell

点评

单片机就更需要考虑效率了 XD  发表于 2010-9-16 06:00
moy
为什么突然想到"单片机"这个称谓0_0.....  发表于 2010-9-16 00:29
咱来膜拜一下紫苏酱。。然后捏XD~  发表于 2010-9-15 21:15

评分

参与人数 1星屑 +100 收起 理由
回转寿司 + 100 赞认真的讨论

查看全部评分

回复

使用道具 举报

梦石
0
星屑
15346
在线时间
2995 小时
注册时间
2008-11-23
回帖
2551

开拓者贵宾

发表于 2010-9-16 00:17:08 | 显示全部楼层
RM这系列软件,乃至整个tkool系列,从一开始就不是作为普通的游戏制作软件而开发的
这系列的特色和优势就在于使用简单,容易上手,只需要掌握最基础的操作就能轻松地制作出自己想要的作品
我认为在这个前提下,谈论效率是毫无意义的
I'm the bone of my Second Grade.
回复

使用道具 举报

梦石
0
星屑
8502
在线时间
7361 小时
注册时间
2010-7-16
回帖
4709

开拓者

发表于 2010-9-18 01:44:46 | 显示全部楼层
必要的优化还是要的,比如至少不能每桢都refresh一次,尽量避免遍历事件列表
回复

使用道具 举报

旅之愚者

梦石
0
星屑
560
在线时间
814 小时
注册时间
2007-7-28
回帖
2121

贵宾

发表于 2010-9-30 11:33:10 | 显示全部楼层
回复 九夜神尊 的帖子

小九注意到脚本的效率是很可喜的。

话说愚者第一次注意到这点是因为【后知后觉】前辈的点评。http://rpg.blue/forum.php?mod=vi ... p;page=1#pid1456488

为此愚者重新写了那段改变选项颜色的代码【没能完善,后来坑掉了】

目前的经验就是:对于bitmap类的draw_xxx方法【其它涉及到bitmap位图类的方法也是】,代价是很大的,还是应该在非draw不可的场合再draw。其它类似一些数据计算或者数据计算之类的迭代,时间效率还是非常不错的。

另外对小九的一些想法有一些不同意见:

【防御 =武器防御+帽子防御+盾防御+衣服防御。但是,每次获取防御力都要经过这么一次运算,然而结果却大部分相同。显然程序效率低很多】

如果用一个新变量来取值的话:

首先,增加内存开销,空间效率下降【虽然也是忽略不计】

其次,每次更新【武器防御】或【任意护具防御】的时候,都要顺带更新这个【防御】,额外的计算量降低时间效率【依然忽略不计】

最后最重点的是:用【查询方法替换冗余变量】可以使程序结构更易懂【有点拗口么。。试想一下,如果一个类有20个实例变量和它如果只有10个实例变量,哪种情况更易读】

点评

话说你从哪得知我叫小九。 此外我还有一点点小问题问你,可以给方式么。  发表于 2010-9-30 13:14

评分

参与人数 1星屑 +100 收起 理由
回转寿司 + 100 赞认真的讨论

查看全部评分

回复

使用道具 举报

酱油的

梦石
0
星屑
1840
在线时间
2161 小时
注册时间
2007-12-22
回帖
3216

贵宾

发表于 2010-10-1 10:07:08 | 显示全部楼层
ruby 的效率雖然多有咎病,但問題其實不算大嚴重。如果沒有良好習慣的話,就算是匯編也救不了你。
1不要用大數值運算,2不要重複讀取大量數據,3不要不要過多刷新bitmap或使用諸如rand,GC.start等高代價方法。
這樣寫出來的程序效率其實還是蠻高的。
底層語句不得力不是借口,我們選擇ruby是因為他方便易用。而方便易用其實和效率并不衝突,在力所能及的位置對程序進行優化是必不可少的工序。君不見提問區老是出現:為甚麼我的遊戲做出來會卡?而其他人的不會?——這就看出水平的高低了。
不做頭像做簽名,看我囧冏有神(多謝山人有情提供 )
回复

使用道具 举报

66RPG站长

梦石
0
星屑
54
在线时间
615 小时
注册时间
2005-10-10
回帖
4793

RMVX自由创作大赛亚军第2届短篇游戏比赛亚军第5届短篇游戏比赛冠军

发表于 2010-10-1 11:14:37 | 显示全部楼层
实践证明,RM的效率还行。之前为了游戏的帧率,用了个微秒测试器仔细测过游戏里所有主要函数在大多数情况下的运行时间。即时以我优化得最差的时候,基本也是逻辑占10%时间左右,渲染占90%左右。优化好一些逻辑占时间更少。
总之和画图相比,逻辑占用时间几乎可以忽略。除非游戏画面是静态的……那就当我没说好了=。=

点评

+1~~愚者的意见基本和柳大一致~渲染开销大二基本逻辑运算消耗很小  发表于 2010-10-1 15:35
第一次得到柳大人的回复,我感动的泣不成声。 目前泪目中。 因为帖子被到柳大人路过。 我决定加倍努力。 PS:站长大人能不能弱弱的给点经验。  发表于 2010-10-1 13:36
回复

使用道具 举报

梦石
0
星屑
8502
在线时间
7361 小时
注册时间
2010-7-16
回帖
4709

开拓者

发表于 2010-10-2 03:54:09 | 显示全部楼层
回复 柳柳 的帖子
看是什么类型的游戏了,如果是arpg,而每桢都要计算的话,逻辑占用时间也是很恐怖的。比如我发出一串子弹,每颗子弹每桢都要遍历事件列表检查是否与其他事件相撞。

   
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-10-2 07:51:10 | 显示全部楼层
底層語句不得力。
禾西 发表于 2010-10-1 10:07

Ruby 1.8 高层也不甚得力,主要还是由于 MRI 直接在语法树上求值,既没有经过优化的中间代码,也没有即时编译的代码 Cache 机制。

之前为了游戏的帧率,用了个微秒测试器仔细测过游戏里所有主要函数在大多数情况下的运行时间。即时以我优化得最差的时候,基本也是逻辑占10%时间左右,渲染占90%
柳柳 发表于 2010-10-1 11:14


不知这个测试器是如何获取渲染时间的?Graphics.update 中进行实际的屏幕渲染也是需要考虑的,但它同时也包括程序空闲时间(不占用 CPU 的时间),直到从调用为止到结束经过了固定的时间(取决于 FPS)才返回。
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部