游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3412|回复: 10

一段简单的程序,请教如何加速

[复制链接]

35

主题

340

帖子

350

积分

中级会员

Rank: 3Rank: 3

积分
350
发表于 2005-4-6 18:18:00 | 显示全部楼层 |阅读模式
#include "meshproc.h"

struct CUSTOMVERTEX
{
    D3DXVECTOR3 position; // The 3D position for the vertex
    D3DXVECTOR3 normal;   // The surface normal for the vertex
};

inline void mpp(CUSTOMVERTEX* points,long num_points,D3DXMATRIX*ma);

ID3DXMesh* MeshNormalWave(ID3DXMesh * pMesh,FLOAT Yaw,FLOAT Pitch,FLOAT Roll)
{
        HRESULT hr;
        CUSTOMVERTEX * ver;
        void * point;

        DWORD len;

        D3DXMATRIX pm;

        //set up matrix
        D3DXMatrixRotationYawPitchRoll(  &pm,
                                                                                        Yaw,                                                        Pitch,
                                Roll
                                                                                );

        hr=pMesh->LockVertexBuffer(        D3DLOCK_DONOTWAIT,
                                                                &point
                                                );
        if(FAILED(hr))
        {
                MessageBox(NULL,"锁定顶点失败",NULL,MB_OK);
                return NULL;
        }
        //get point;
        ver=(CUSTOMVERTEX *)point;
        //get len
        len=pMesh->GetNumVertices();

        mpp(ver,len,&pm);

        pMesh->UnlockVertexBuffer();
        return pMesh;

}

void mpp(CUSTOMVERTEX* points,long num_points,D3DXMATRIX*ma)
{
        D3DVECTOR temp_point;//临时的x,y,z
        for(DWORD iCount=0;iCount<num_points;iCount++)
        {
                temp_point.x=points->normal.x * ma->_11 + points->normal.y * ma->_12 +points->normal.z * ma->_13 + ma->_14;
                temp_point.y=points->normal.x * ma->_21 + points->normal.y * ma->_22 +points->normal.z * ma->_23 + ma->_24;
                temp_point.z=points->normal.x * ma->_31 + points->normal.y * ma->_32 +points->normal.z * ma->_33 + ma->_34;
                points->normal.x =temp_point.x;
                points->normal.y =temp_point.y;
                points->normal.z =temp_point.z;

               //由于找不到 顶点与矩阵相乘的函数,所以出此下策....
       //上面是旋转法线,在光源不改变的情况下,实现了反光面改变的效果
/*                temp_point.x=points->position.x * ma->_11 + points->position.y * ma->_12 +points->position.z * ma->_13 + ma->_14;
                temp_point.y=points->position.x * ma->_21 + points->position.y * ma->_22 +points->position.z * ma->_23 + ma->_24;
                temp_point.z=points->position.x * ma->_31 + points->position.y * ma->_32 +points->position.z * ma->_33 + ma->_34;
                points->position.x =temp_point.x;
                points->position.y =temp_point.y;
                points->position.z =temp_point.z;
*/     //这里是旋转物体,但是只有傻瓜这么做, 不执行,帧速为30, 执行后,帧速为17
//想不通了,为什么使用device->SetTansform()方法就那么快呢???


                points++; //指针后移,便历所有的点
        }
}


执行了以上代码后,帧速从   400 直接降到 30
暴寒[em7] [em7] [em7] [em7]
如果要实现旋转法线的效果,是否有其他方法
请指教

35

主题

340

帖子

350

积分

中级会员

Rank: 3Rank: 3

积分
350
 楼主| 发表于 2005-4-6 18:19:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

关键是  顶点与矩阵相乘 有没有快点的方法

6

主题

444

帖子

457

积分

中级会员

Rank: 3Rank: 3

积分
457
发表于 2005-4-6 18:46:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

顶点和矩阵相乘不就是用D3DXVec3Transform么?至少D3DX的lib还是为不同的CPU指令集优化过的
想快,就不要总是lock和unlock VB,用VertexShader解决问题。

63

主题

871

帖子

891

积分

高级会员

Rank: 4

积分
891
QQ
发表于 2005-4-6 22:06:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

device->SetTansform()是把矩阵发给GPU做硬件TnL的呀

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-4-6 22:15:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

.........

35

主题

340

帖子

350

积分

中级会员

Rank: 3Rank: 3

积分
350
 楼主| 发表于 2005-4-6 22:47:00 | 显示全部楼层

Re: Re:一段简单的程序,请教如何加速

顶点和矩阵相乘不就是用D3DXVec3Transform么?至少D3DX的lib还是为不同的CPU指令集优化过的
想快,就不要总是lock和unlock VB,用VertexShader解决问题。


多谢哦 [em20] [em20]

6

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2005-4-7 10:06:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

说一下自己的看法,可能不一定对,LOCK和UNLOCK只是用来分配内存(也有可能使显存),UNLOCK 结束后LOCK出来的那一块存储区应该仍然存在,所以可以个别地改变区内的元素值。之所以要LOCK 和UNLOCK我猜想可能是因为怕多线程同时写显存发生错误。

30

主题

298

帖子

299

积分

中级会员

Rank: 3Rank: 3

积分
299
QQ
发表于 2005-4-7 13:28:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

MS在SDK的文档里有说过,存在于显存里的资源(如SURFACE)等,LOCK后获得的指针在UNLOCK之后,是不能确定仍然有效的

6

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2005-4-7 14:43:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

刚刚也看了文档,MS大神教导说如果要经常改变缓冲区值在CreateVertexBuffer时使用D3DUSAGE_DYNAMIC方式,锁存时则用D3DLOCK_DISCARD。用(Dynamic Buffer作关键字搜索)

35

主题

340

帖子

350

积分

中级会员

Rank: 3Rank: 3

积分
350
 楼主| 发表于 2005-4-7 21:47:00 | 显示全部楼层

Re:一段简单的程序,请教如何加速

但是 这个是mesh
是通过 CloneMeshFVF() 来设置FVF 至于顶点缓冲的格式,不知道怎么弄了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-25 04:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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