以下引用虚幻死神于2008-10-19 13:19:35的发言:
這裡是XP.....
以下引用流川枫于2008-10-19 13:21:20的发言:
不过XP也有同样的问题,事件拖慢问题····
以下引用八云蓝于2008-10-19 13:20:28的发言:
那啥, 是不是 眼花了, 直接寻址? 汇编??
事件不行就用 脚本, 需要动用 汇编 么?
以下引用ONEWateR于2008-10-19 13:26:09的发言:
标签用错了 - -
帖子错区了 - -
以下引用流川枫于2008-10-19 13:15:39的发言:
发现在解释指令的时候 用了几十个when来判断。也就是说,每执行一个指令就需要做N个判断后才能执行对应的函数
以下引用八云紫于2008-10-19 13:25:18的发言:
记得 Ruby 没有 指针 这个数据类型吧。
有 指针 该多好.
以下引用link006007于2008-10-19 17:34:02的发言:
指针 ruby全部都是指针!!!
Ruby绑定C\C++数据用指针, ruby类的函数绑定也是用指针
ruby对象的操作是指针...
所以ruby没有类型, 应为全部是内存地址的交换... 较小的整型值就不是了
以下引用link006007于2008-10-19 17:23:59的发言:
以下引用流川枫于2008-10-19 13:15:39的发言:
发现在解释指令的时候 用了几十个when来判断。也就是说,每执行一个指令就需要做N个判断后才能执行对应的函数
你想太多了 逐个判断, 那是 if elsif 才是
switch做的是内存地址的偏移, 然后得到正确的函数代码段, 效率比if elsif 高 (C++中... ...
ruby未完全了解诶)
其实RM默认的很多脚本效率都不行...
比如角色和NPC的passable?函数(完全可以在每一帧建立一个passable的图缓存,就不要每个事件都要遍历全部事件), 地图事件的更新函数(基本上, 很多事件当前或长久更本不需要执行)..
说道函数指针 RM可以使用Proc...
比如
EVENT_1 = 0, EVENT_2 = 1, ... ..., EVENT_N = n-1;
EVENT_FUNC = [
Proc.new{
// EVENT_1 函数
},
Proc.new{
},
... ...
]
到时直接 EVENT_FUNC[index].call
当然了 如果事件的类型不是很多的话 proc.call 反而降低性能... ...
以下引用地龙于2008-10-19 17:36:50的发言:
你把事件删了被
然后再玩
以下引用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 最后编辑]
以下引用zh99998于2008-10-19 21:08:31的发言:
为什么不eval("command_" + 代码对应的数字) ?
以下引用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 最后编辑]
以下引用zh99998于2008-10-19 21:08:31的发言:
为什么不eval("command_" + 代码对应的数字) ?
以下引用link006007于2008-10-19 22:01:19的发言:
不知道 = =
ruby本身是怎么处理switch的我都不知道
以下引用link006007于2008-10-19 22:19:25的发言:
case怎么分配 就简单的方法就是自己写一个switch 然后自己看.
我也是3脚猫的水平
做作业 = = 到现在一题都没有做出
以下引用link006007于2008-10-20 11:08:25的发言:
不知道你说的是什么"人才"
个人觉得. 把C\C++代码翻译成ruby代码(RGSS)没有什么了不起
你学过C 然后发1~2天的时间阅读ruby官方文档的Extending Ruby 基本也可以做了
以下引用八云紫于2008-10-20 16:46:19的发言:
LS 请不要说脏话
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |