游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2879|回复: 6

算法比较好的帮帮忙看看啊?效率相差一倍~

[复制链接]

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2008-11-10 10:41:00 | 显示全部楼层 |阅读模式
想自己写矩阵旋转,可是比dx的相差了一倍,为什么啊??能不能帮忙看看差别:
//定义SinCos函数: 同时计算sin(Angle)和cos(Angle)的内嵌x86汇编函数
void __declspec(naked) __stdcall SinCos(const double Angle,double& sina,double& cosa)
{
asm
{
fld qword ptr [esp+4]//Angle
mov eax,[esp+12]//&sina
mov edx,[esp+16]//&cosa
fsincos
fstp qword ptr [edx]
fstp qword ptr [eax]
ret 16
}
}

//这个是结构,省略了些
struct XMatrix44
{
        union{
        struct {
            float        _00, _01, _02, _03;
            float        _10, _11, _12, _13;
            float        _20, _21, _22, _23;
            float        _30, _31, _32, _33;
        };
        float x[4][4];
        };

  void rotateX(double rad)
        {
                     double s,c;
                     SinCos(rad,s,c);
                _11=(float)s;
                _12=(float)c;
                _21=-_12;
                _22=_11;
                _00=_33=1;
        }
};

void testd3d()
{
        D3DXVECTOR3 vec(1,1,1),vec1;
        D3DXMATRIX mx;
        for (int i=0;i<2000000;i++)
        {
    D3DXMatrixRotationX(&mx,i*X_ONERAD);
        }
}
void test3dx()
{
        XVec3 vec(1,1,1),vec1(vec);
        XMatrix44 mxz;
        float ss;
    for (int i=0;i<2000000;i++)
        {               
        mxz.rotateX(i*X_ONERAD);
        }
}

void main()
{
testd3d();
test3dx();
}

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-10 11:27:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

你还没有将其他元素清零呢

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2008-11-10 11:40:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

先别管清零,就这个就差了好多啊~~~~为什么啊????????????

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-10 12:25:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

rotateX参数类型改成float
元素复制按内存地址从低到高顺序
把SinCos直接内联到的rotateX内,去掉函数调用的开销
打开优化
用Ctrl+F5启动程序

7

主题

17

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2008-11-11 09:30:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

谢谢各位,虽然还是行不通~~~晕

5

主题

972

帖子

975

积分

高级会员

Rank: 4

积分
975
发表于 2008-11-11 12:57:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

内联

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-11 13:51:00 | 显示全部楼层

Re:算法比较好的帮帮忙看看啊?效率相差一倍~

你要是非要那么高的效率、且你的汇编水平足够的化,可以继续优化:
全部用汇编写,免除所有栈上的临时变量,浮点计算用SSE指令,不要用f87指令,清零时用rep前缀

这样就能一样快了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 22:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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