//vs.net 2003 p4 3.0G,512MB
#include "stdafx.h"
#include <xmmintrin.h>
#include "windows.h"
template < class Type >
struct Rectt
{
Type x;
Type y;
Type right;
Type bottom;;
};
typedef __declspec(align(16)) Rectt< float > Rect;
//是否包含r矩形
extern "C" bool RectAndRect(const Rect* l0, const Rect* l1, const Rect* r)
{
int flag = 0;
int flag1 = 1;
__asm
{
mov eax,[l0];
movaps xmm0,[eax];
mov eax,[r];
movaps xmm1, [eax];
cmpps xmm0, xmm1, 1;
movmskps eax, xmm0;
mov flag, eax;
mov eax,[l1];
movaps xmm0,[eax];
cmpps xmm0, xmm1, 1;
movmskps eax, xmm0;
mov flag1, eax;
}
return flag == 15 && flag1 == 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
int COUNT = 1000000;
Rect l = {0,0,100,100};
Rect* ls = new Rect[COUNT];
for ( int cnt =0; cnt <COUNT; cnt++ )
{
ls[cnt].x = rand()%10+1;
ls[cnt].y = rand()%10+1;
ls[cnt].right = 10;
ls[cnt].bottom = 10;
}
//l的左上点
Rect ll0 = {0.0f,0.0f,0.0f,0.0f};
//l的右下点
Rect ll1 = {100.0f,100.0f,100.0f,100.0f};
LARGE_INTEGER start,end,fre;
::QueryPerformanceCounter(&start);
::QueryPerformanceFrequency(&fre);
bool res;
for ( int cnt =0; cnt <COUNT; cnt++ )
{
res = RectAndRect(&ll0,&ll1,ls+cnt);
}
::QueryPerformanceCounter(&end);
double ress = double(end.QuadPart - start.QuadPart)/(double)fre.QuadPart;
std::cout<<ress<<std::endl;
std::cout<<res<<std::endl;
delete[] ls;
return 0;
}
VS.NET 2003 SSE指令优化矩形碰撞检测
本文介绍了一个使用VS.NET 2003编写的矩形碰撞检测算法,该算法利用SSE指令集进行了优化。通过模板定义了矩形结构并实现了两个矩形之间的碰撞检测,利用了xmm寄存器进行向量化比较以提高效率。

593

被折叠的 条评论
为什么被折叠?



