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

Project1

 找回密码
 注册会员
搜索
楼主: 流川枫
打印 上一主题 下一主题

一款VX制作的游戏暴风书店,FPS就7帧!?事件执行拖慢

 关闭 [复制链接]

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3309
在线时间
3620 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

21
发表于 2008-10-20 04:45:13 | 只看该作者
没办法,事件就这效率。
RM就是有事件才有用。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
22
 楼主| 发表于 2008-10-20 04:53:36 | 只看该作者
以下引用link006007于2008-10-19 20:36:57的发言:

一定要有序的才能偏移吗?  在编译阶段 switch的case内容被编译成一段地址的跳转表,
然后在执行时,更具当前的值直接跳转到对应的代码段中, 也就是说  不管你case的内容有几条
在switch语句中, 都只有执行一次跳转(这可能也是switch要自己break的原因).  而if elsif 则是根据当前逻辑逐个判断...   
我不知道你是在什么环境下编译的, 不同的编译器, 在解释上是有一些差距的
case 0, 3, 5 直接就被编译成一张跳转表  和case值的有序,连续没太大关系

以上  我也不敢确定= =
不过Ruby的switch可能和C的不一样... C的只能是数值, 而RM可以case字符串= =
应该实现上不一样


[本贴由作者于 2008-10-19 20:39:42 最后编辑]

东灿 20:48:45
语法跟CPU指令不要混为一谈。。。。
东灿 20:49:00
语法是纯理想状态。

"这可能也是switch要自己break的原因"  
貌似不然,反汇编C的SWITCH代码段:


or ax,ax //case 0:
je  A
cmp ax,3 //case 3:
je  B
jmp C //default:

A: mov di,1 //variable=1
jmp D //break
B: mov di,2 //variable=2
jmp D //break
C: mov di,3 //variable=3
D: xor ax,ax
ret

break更像是 jmp X
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
23
 楼主| 发表于 2008-10-20 05:06:58 | 只看该作者
link006007、你能不能把C++中switch反汇编贴出来哈
我不是很明白你说的 表格 是怎么构造出来的饿
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
619
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

24
发表于 2008-10-20 05:08:31 | 只看该作者
为什么不eval("command_" + 代码对应的数字) ?
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
25
 楼主| 发表于 2008-10-20 05:13:51 | 只看该作者
以下引用zh99998于2008-10-19 21:08:31的发言:

为什么不eval("command_" + 代码对应的数字) ?


我想这个问题应该去问Enterbrain公司开发RM的程序员饿。。。
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

26
发表于 2008-10-20 05:22:36 | 只看该作者
不同的编译器, 在解释上是有一些差距的, 有些编译器
你在编译的时候, 是需要手动输入优化指令才能把switch的case编译成地址跳转表的

而且  switch在case时使用地址跳转表必须要在case整数时才有效  其他的都和if else 没什么差别
//Windows XP + gcc v3.4.2 (mingw-special)  C不是C++
int tswitch_perf(int i) {
        int rv = i;
       switch (rv)
... ...
反:
_switch_perf:
    pushl    %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %ecx
    leal    -10(%ecx), %edx
    movl    %ecx, %eax
    cmpl    $5, %edx             // 偏移
    ja    L2
    jmp    *L10(,%edx,4)
    .section .rdata,"dr"
    .align 4
L10:
    .long      L3  // 跳转地址表
    .long   
    .long
    ... ...
L8:
//
L2:
... ...

http://c.chinaitlab.com/cc/ccjq/200805/748102_2.html
找到了   这人的blog.. 你去看吧  汇编我可玩不来 ..
http://bigwhite.blogbus.com/

关于switch性能的  他的blog里有... 我的是转载= =||
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
27
 楼主| 发表于 2008-10-20 05:53:51 | 只看该作者
以下引用link006007于2008-10-19 21:22:36的发言:

不同的编译器, 在解释上是有一些差距的, 有些编译器
你在编译的时候, 是需要手动输入优化指令才能把switch的case编译成地址跳转表的

而且  switch在case时使用地址跳转表必须要在case整数时才有效  其他的都和if else 没什么差别
//Windows XP + gcc v3.4.2 (mingw-special)  C不是C++
int tswitch_perf(int i) {
       int rv = i;
      switch (rv)
... ...
反:
_switch_perf:
   pushl    %ebp
   movl    %esp, %ebp
   movl    8(%ebp), %ecx
   leal    -10(%ecx), %edx
   movl    %ecx, %eax
   cmpl    $5, %edx             // 偏移
   ja    L2
   jmp    *L10(,%edx,4)
   .section .rdata,"dr"
   .align 4
L10:
   .long      L3  // 跳转地址表
   .long   
   .long
   ... ...
L8:
//
L2:
... ...

http://c.chinaitlab.com/cc/ccjq/200805/748102_2.html
找到了   这人的blog.. 你去看吧  汇编我可玩不来 ..
http://bigwhite.blogbus.com/

关于switch性能的  他的blog里有... 我的是转载= =||


[本贴由作者于 2008-10-19 21:41:08 最后编辑]

在case中推荐使用小的连续的整数,因为在这种情况下,所有的编译器都可以把switch 转化成跳转表。


问题是 @list[@index].code 的序列中有几个甚至达到了600多。这样的序列也编译成跳转表?


在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

28
发表于 2008-10-20 06:01:19 | 只看该作者
不知道 =  =
ruby本身是怎么处理switch的我都不知道 {/gg}
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
29
 楼主| 发表于 2008-10-20 06:04:15 | 只看该作者
以下引用zh99998于2008-10-19 21:08:31的发言:

为什么不eval("command_" + 代码对应的数字) ?

我试过了,不行的。

因为code有时候是一些没有预定义的值,比如 0
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
485
在线时间
177 小时
注册时间
2006-10-3
帖子
618
30
 楼主| 发表于 2008-10-20 06:07:46 | 只看该作者
以下引用link006007于2008-10-19 22:01:19的发言:

不知道 =  =
ruby本身是怎么处理switch的我都不知道  

你贴出来的代码,我没看懂,不好意思哈。

不过我想所谓的 表格,应该就是构造了一个足够大的数组,
然后用 switch(x) 里的x直接寻址的吧?
那么如果case 999的话,不就需要分配999个成员了么?!{/pz}
在我初学RM的时候觉得脚本是高手的工具,等我学会了编程技术后才发现脚本原来是小孩子的玩具。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-6 18:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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