yuchi's Development Home
글 수 201
최근 'CPU트랜스폼과 버텍스 버퍼 캐쉬'를 포기하고 GPU기반으로 코드를 싹 뜯어고쳤습니다.
당연한 얘기지만 캐쉬 히트율이 높을땐 사무실의 모든 PC에서 GPU코드보다 렌더링 속도가 빨랐습니다.
100% 캐쉬 미스시에도 'CPU트랜스폼+버텍스 버퍼 락& 업데이트'가 지포스8600GT이하에선 GPU코드보다 빨랐습니다.
9600GT에선 GPU트랜스폼이 더 빠르더군요. 락을 걸고 버퍼를 갱신하는 오버헤드를 감안할땐 트랜스폼의 자체의 속도는 그래도 CPU가 빠를것으로 추측합니다만.
(참고로 현재 저희 게임은 1920*1080,32비트 컬러 모드에서 테스트시 평균 350-450프레임 정도 나옵니다.)
하여간 퍼포먼스에서 큰 득이 없음에도 불구하고 GPU코드로 전환한 것은 앞으로의 유지보수를 위해서, 또 그래픽 카드의 발전에 맞추기 위해서입니다.
버텍스 버퍼 캐쉬 코드를 짜며 밤을 새던 시절, 혼자서 삽질해가며 SSE 명령어를 학습하던 시절을 생각하면 참으로 버리기 아까운 코드였습니다.
해서 제 홈피에 놀러오시는 분들(64비트 어셈블리와 SSE에 관심있는 분들이 있을까 의문입니다만)에게 약간의 도움이라도 될까 하여 공개합니다.
ML64.EXE로 어셈블할 수 있습니다. 비졀스튜됴에서 링크하는 방법은 이 게시판에서 FSCANF로 검색하면 찾을 수 있습니다.(vs2005이상필요)
소스코드는 .ASM 파일과 데이타 타입을 정의하는 .INC파일로 첨부합니다.
C코드 부에서 사용할 PHYSIQUE_VERTEX의 스트럭쳐 타입은 다음과 같습니다.
#pragma pack(push,4)
struct BONE_LITE
{
DWORD dwBoneObjectIndex; // 포인터를 대신하는인덱스
float fWeight;
DWORD dwLinearMatrixIndex;
};
struct PHYSIQUE_VERTEX
{
VECTOR3 v3Pos; // 0
VECTOR3 v3Normal; // 12
VECTOR3 v3Tangent; // 24
TVERTEX tv; // 36
BYTE bBonesNum; // 44
BYTE bReserved0; // 45
BYTE bReserved1; // 46
BYTE bReserved2; // 47
BONE_LITE* pBoneList; // 48
};
#pragma pack(pop)
그럼 즐거운 프로그래밍 생활들 되시길.
당연한 얘기지만 캐쉬 히트율이 높을땐 사무실의 모든 PC에서 GPU코드보다 렌더링 속도가 빨랐습니다.
100% 캐쉬 미스시에도 'CPU트랜스폼+버텍스 버퍼 락& 업데이트'가 지포스8600GT이하에선 GPU코드보다 빨랐습니다.
9600GT에선 GPU트랜스폼이 더 빠르더군요. 락을 걸고 버퍼를 갱신하는 오버헤드를 감안할땐 트랜스폼의 자체의 속도는 그래도 CPU가 빠를것으로 추측합니다만.
(참고로 현재 저희 게임은 1920*1080,32비트 컬러 모드에서 테스트시 평균 350-450프레임 정도 나옵니다.)
하여간 퍼포먼스에서 큰 득이 없음에도 불구하고 GPU코드로 전환한 것은 앞으로의 유지보수를 위해서, 또 그래픽 카드의 발전에 맞추기 위해서입니다.
버텍스 버퍼 캐쉬 코드를 짜며 밤을 새던 시절, 혼자서 삽질해가며 SSE 명령어를 학습하던 시절을 생각하면 참으로 버리기 아까운 코드였습니다.
해서 제 홈피에 놀러오시는 분들(64비트 어셈블리와 SSE에 관심있는 분들이 있을까 의문입니다만)에게 약간의 도움이라도 될까 하여 공개합니다.
ML64.EXE로 어셈블할 수 있습니다. 비졀스튜됴에서 링크하는 방법은 이 게시판에서 FSCANF로 검색하면 찾을 수 있습니다.(vs2005이상필요)
소스코드는 .ASM 파일과 데이타 타입을 정의하는 .INC파일로 첨부합니다.
C코드 부에서 사용할 PHYSIQUE_VERTEX의 스트럭쳐 타입은 다음과 같습니다.
#pragma pack(push,4)
struct BONE_LITE
{
DWORD dwBoneObjectIndex; // 포인터를 대신하는인덱스
float fWeight;
DWORD dwLinearMatrixIndex;
};
struct PHYSIQUE_VERTEX
{
VECTOR3 v3Pos; // 0
VECTOR3 v3Normal; // 12
VECTOR3 v3Tangent; // 24
TVERTEX tv; // 36
BYTE bBonesNum; // 44
BYTE bReserved0; // 45
BYTE bReserved1; // 46
BYTE bReserved2; // 47
BONE_LITE* pBoneList; // 48
};
#pragma pack(pop)
그럼 즐거운 프로그래밍 생활들 되시길.