游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2285|回复: 7

想不通,矩形碰撞计算的效率问题

[复制链接]

13

主题

594

帖子

595

积分

高级会员

Rank: 4

积分
595
发表于 2005-11-19 05:10:00 | 显示全部楼层 |阅读模式
    Public Structure SEPoint '位置
        Public X As Single
        Public Y As Single
    End Structure
    Public Structure SERect '矩形
        Public Loca As SEPoint '位置
        Public ValHeight As Single '范围,高
        Public ValWidth As Single '范围,宽
        Public Function TestPointA(ByRef inP As SEPoint) As Boolean
            Return inP.X < Loca.X + ValWidth AndAlso inP.X > Loca.X - ValWidth AndAlso _
            inP.Y < Loca.Y + ValHeight AndAlso inP.Y > Loca.Y - ValHeight
        End Function
        Public Function TestPointB(ByRef inP As SEPoint) As Boolean
            Return Abs(inP.X - Loca.X) < ValWidth AndAlso Abs(inP.Y - Loca.Y) < ValHeight
        End Function
    End Structure

怎么都觉得B比A平均速度要快一点,但实际测试的结果却相反
太奇怪了,这是为什么呢?

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2005-11-19 08:41:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

应用到你的游戏里就知道了,例子是看不出效率的。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-11-19 16:19:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

B应为使用了函数,产生了较多的临时变量。

5

主题

217

帖子

222

积分

中级会员

Rank: 3Rank: 3

积分
222
发表于 2005-11-21 12:41:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

楼主怎么看出b比a快的?
偶看不出.....
用了abs,取正的判断难道会少?偶才想不通为什么b比A要快
除了执行相同的运算外,还要进行堆栈操作、寻址、分配临时变量.为什么b比a还要快?

13

主题

594

帖子

595

积分

高级会员

Rank: 4

积分
595
 楼主| 发表于 2005-11-21 19:25:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

不像是abs的问题,虽然代码中是调用了函数,但实际执行的时候并没有使用函数,浮点类型是可以直接运算绝对值的。

140

主题

1228

帖子

1233

积分

金牌会员

Rank: 6Rank: 6

积分
1233
QQ
发表于 2005-11-26 21:05:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

函数的效率一定低的,所以c里面才有内联和宏定义,这两个功能vb都没有。
函数会造成多余的开销,再简单的函数也不例外。不过差距也不会很大.

13

主题

594

帖子

595

积分

高级会员

Rank: 4

积分
595
 楼主| 发表于 2005-11-26 22:17:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

这是反汇编的结果
A
        Public Function TestPoint(ByRef inP As SEPoint) As Boolean
00000000 55               push        ebp  
00000001 8B EC            mov         ebp,esp
00000003 83 EC 10         sub         esp,10h
00000006 57               push        edi  
00000007 56               push        esi  
00000008 53               push        ebx  
00000009 8B F1            mov         esi,ecx
0000000b 8B FA            mov         edi,edx
0000000d 33 DB            xor         ebx,ebx
0000000f 90               nop              
            Return inP.X < Loca.X + ValWidth AndAlso inP.X > Loca.X - ValWidth AndAlso _
            inP.Y < Loca.Y + ValHeight AndAlso inP.Y > Loca.Y - ValHeight
00000010 D9 07            fld         dword ptr [edi]
00000012 D9 06            fld         dword ptr [esi]
00000014 D8 46 0C         fadd        dword ptr [esi+0Ch]
00000017 DF F1            fcomip      st,st(1)
00000019 DD D8            fstp        st(0)
0000001b 7A 33            jp          00000050
0000001d 76 31            jbe         00000050
0000001f D9 07            fld         dword ptr [edi]
00000021 D9 06            fld         dword ptr [esi]
00000023 D8 66 0C         fsub        dword ptr [esi+0Ch]
00000026 DF F1            fcomip      st,st(1)
00000028 DD D8            fstp        st(0)
0000002a 7A 24            jp          00000050
0000002c 73 22            jae         00000050
0000002e D9 47 04         fld         dword ptr [edi+4]
00000031 D9 46 04         fld         dword ptr [esi+4]
00000034 D8 46 08         fadd        dword ptr [esi+8]
00000037 DF F1            fcomip      st,st(1)
00000039 DD D8            fstp        st(0)
0000003b 7A 13            jp          00000050
0000003d 76 11            jbe         00000050
0000003f D9 47 04         fld         dword ptr [edi+4]
00000042 D9 46 04         fld         dword ptr [esi+4]
00000045 D8 66 08         fsub        dword ptr [esi+8]
00000048 DF F1            fcomip      st,st(1)
0000004a DD D8            fstp        st(0)
0000004c 7A 02            jp          00000050
0000004e 72 09            jb          00000059
00000050 C7 45 F0 00 00 00 00 mov         dword ptr [ebp-10h],0
00000057 EB 07            jmp         00000060
00000059 C7 45 F0 01 00 00 00 mov         dword ptr [ebp-10h],1
00000060 0F B6 45 F0      movzx       eax,byte ptr [ebp-10h]
00000064 8B D8            mov         ebx,eax
00000066 EB 00            jmp         00000068
        End Function
00000068 8B C3            mov         eax,ebx
0000006a 5B               pop         ebx  
0000006b 5E               pop         esi  
0000006c 5F               pop         edi  
0000006d 8B E5            mov         esp,ebp
0000006f 5D               pop         ebp  
00000070 C3               ret              

B
        Public Function TestPoint(ByRef inP As SEPoint) As Boolean
00000000 55               push        ebp  
00000001 8B EC            mov         ebp,esp
00000003 83 EC 18         sub         esp,18h
00000006 57               push        edi  
00000007 56               push        esi  
00000008 53               push        ebx  
00000009 8B F1            mov         esi,ecx
0000000b 8B FA            mov         edi,edx
0000000d 33 DB            xor         ebx,ebx
0000000f 90               nop              
            Return Abs(inP.X - Loca.X) < ValWidth AndAlso Abs(inP.Y - Loca.Y) < ValHeight
00000010 D9 07            fld         dword ptr [edi]
00000012 D8 26            fsub        dword ptr [esi]
00000014 D9 E1            fabs            
00000016 D9 5D F0         fstp        dword ptr [ebp-10h]
00000019 D9 45 F0         fld         dword ptr [ebp-10h]
0000001c D9 46 0C         fld         dword ptr [esi+0Ch]
0000001f DF F1            fcomip      st,st(1)
00000021 DD D8            fstp        st(0)
00000023 7A 1B            jp          00000040
00000025 76 19            jbe         00000040
00000027 D9 47 04         fld         dword ptr [edi+4]
0000002a D8 66 04         fsub        dword ptr [esi+4]
0000002d D9 E1            fabs            
0000002f D9 5D E8         fstp        dword ptr [ebp-18h]
00000032 D9 45 E8         fld         dword ptr [ebp-18h]
00000035 D9 46 08         fld         dword ptr [esi+8]
00000038 DF F1            fcomip      st,st(1)
0000003a DD D8            fstp        st(0)
0000003c 7A 02            jp          00000040
0000003e 77 09            ja          00000049
00000040 C7 45 EC 00 00 00 00 mov         dword ptr [ebp-14h],0
00000047 EB 07            jmp         00000050
00000049 C7 45 EC 01 00 00 00 mov         dword ptr [ebp-14h],1
00000050 0F B6 45 EC      movzx       eax,byte ptr [ebp-14h]
00000054 8B D8            mov         ebx,eax
00000056 EB 00            jmp         00000058
        End Function
00000058 8B C3            mov         eax,ebx
0000005a 5B               pop         ebx  
0000005b 5E               pop         esi  
0000005c 5F               pop         edi  
0000005d 8B E5            mov         esp,ebp
0000005f 5D               pop         ebp  
00000060 C3               ret              

13

主题

594

帖子

595

积分

高级会员

Rank: 4

积分
595
 楼主| 发表于 2005-11-26 22:23:00 | 显示全部楼层

Re:想不通,矩形碰撞计算的效率问题

00000014 D9 E1            fabs            
这里ABS函数直接转成了一条浮点运算指令


00000016 D9 5D F0         fstp        dword ptr [ebp-10h]
00000019 D9 45 F0         fld         dword ptr [ebp-10h]
这里用到了个临时变量,完全没有必要的,编译器太弱智了......


还是搞不懂慢在哪里???
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 18:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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