游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2647|回复: 4

求高手:关DOOM3的math.h

[复制链接]

2

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2007-7-11 12:41:00 | 显示全部楼层 |阅读模式
脱的有点久的一个问题,请Niu人帮我解决一下。

去年的这个时候,我有幸接触游戏引擎,下载了DOOM3的SDK ,对其中的底层算法加速部分非常有兴趣,Carmack在math.h中使用了大量的浮点加速算法,包括早已被人熟知的InvSqrt( )和0x5f3759df这个MagicNum . 我经过数个月的改进测试,将math.h的大部分算法加速了,有除法,平方根倒数,立方根和高次方根的快速精确计算,另还有常用的SIn16(x),Cos(x),Tan(x),这些比Carmack用的算法快3~10倍不等.
    因为其他原因,我现在对3D引擎还有很多所不了解的地方,因此想问一下,这些算法,在一个3D引擎中,占着一个什么样的位置? 请各位高手帮着支几招,不甚感激.........!!!!

6

主题

74

帖子

100

积分

注册会员

Rank: 2

积分
100
发表于 2007-8-6 17:44:00 | 显示全部楼层

Re:求高手:关DOOM3的math.h

好像doom3sdk中 Cos(x),Tan(x),这些只是简单调用标准c函数,没有做什么优化

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2007-8-7 09:28:00 | 显示全部楼层

Re:求高手:关DOOM3的math.h

这些算法在游戏干什么?你连这个都不知道却花几个月时间去改进让你说的sin这种东西在快3-10倍.不明白你是想做游戏还是要当科学家??你这样造轮子~有必要吗?在大行硬件加速的今天.和你哪个函数快点慢点关系不会是瓶劲的,你直接用c 的sin cos 能慢多少.如果你要做游戏,别在这种东西上花几个月.个人觉得不值得

22

主题

144

帖子

193

积分

注册会员

Rank: 2

积分
193
发表于 2007-8-7 15:27:00 | 显示全部楼层

Re:求高手:关DOOM3的math.h

据各例子来说明开方的用法:

A*算法扩展节点的时候:每个节点的权值f(n)=g(n)+h(n)
g(n)是从出发点看是扩展次数的一个算法,就是离起点越高,值越大,
h(n)是需要设计的一个启发式函数。

在某些引擎中可以这样设计:return abs(src.x-dest.x)+abs(src.y-dest.y);
然而这不是十分精确,会使寻路的monster有些古怪的行为,所

return sqrt(abs(src.x-dest.x)^2+abs(src.y-dest.y)^2);//伪码

那么这样就可能得出更好的AI行为,但是多了两次乘法和一次开方(可能需要10次乘法)(每次乘法在x86下世10~30个cup cycle不等).

如果在屏幕上有100只monster,有一个玩家在不断逃避monster的追捕(移动monster的dest point),那么monster就要不断调用这个h(n),可能每一帧都要调用.

100*(10+2)*20 cup cycle用来做如此的启发函数计算.

如果你将sqrt()换成Q_rsqrt()(只需4次乘法左右),就减少了100*(6)*20 个cycle,但是产生了0.01或更低的误差.

但是对于一个3D world coordinate的float会不准:monster追得是玩家肚脐眼,后来变成了肚脐眼下面三寸的地方了..

这对一个游戏来说换来了什么??

sin 和 cos就更不用说了.

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2007-8-9 22:39:00 | 显示全部楼层

Re:求高手:关DOOM3的math.h

用处很大,加快算法也是好事,但是精度问题也是很头痛的问题,个人觉得一板一眼的算比较好,至少要保证0.00001的精度。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 13:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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