글 수 83
피지크를 사용하게 되면 cpu에 부담이 상당히 갑니다. 버텍스 쉐이더나 매트릭스 팔레트등을 사용하면 가속기에 어느 정도 부하를 넘길수 있으나 가속기 종속적인 코드가 되어 재활용이 어렵게 되고 기껏해야 2링크 정도밖에 사용할 수 없습니다.
그래서 ss3d엔진은 피지크 처리를 전적으로 소프트웨어에 의존합니다.덕분에 무제한의 n링크 피지크를 사용할 수 있습니다.속도에서의 약점은 피지크 트랜스폼 함수를 최적화된 SSE 코드로 짜서 C만 사용해서 짠 코드보다 3배정도 빠르게 처리했습니다.
그럼에도 불구하고 피지크 처리는 cpu에 많은 부하를 걸리게 합니다.왜냐하면 일단 락을 걸고 버텍스 데이타들을 갱신해야하기 때문이죠.cpu에서 아무리 빠르게 처리한다 해도 버스를 타고 비디오 메모리로 전송되는 병목은 피할 길이 없습니다.
이 부하를 줄이고자(즉 락걸고 업데이트하는 시간을 줄이고자) 버텍스 버퍼 캐쉬를 사용합니다.
컨셉은 간단합니다. 버텍스 애니메이션을 흉내내는 것이죠. 거의 모든 게임에서는 일반적으로 애니메이션은 반복 사용됩니다. 예를 들어 걷는 동작이 있다 칩시다.30프레임짜리 걷는 동작이 있으면 적어도 1초정도 후에는 그 동작을 다시 필요로 하게 됩니다.정석대로 투영하여 그림자를 출력하는 SS3D엔진같은 경우는 적어도 두번이상 같은 애니메이션이 프레임이 사용됩니다. 이런 경우 피지크 트랜스폼된 버텍스들을 그대로 가지고 있다가 필요로 할때 다시 돌려주면 락을 걸고 새로 갱신할 필요가 없게되죠.
여기서 문제가 되는 것이 각각의 매쉬 오브젝트들은 사용하고 있는 버텍스 개수가 다르다는 것입니다. 버텍스 버퍼를 메모리 풀로 만들어서 실시간 할당,해제를 해야만 하는데 게임 등장하는 수많은 매쉬오브젝트들의 버텍스 개수가 일정치 않으므로 최대치를 정해서(오브젝트당 최대 버텍스 개수는 4000개다..이런식으로) 고정 사이즈로 할당하게 되면 메모리 효율이 극히 나빠지고 캐쉬 미스 가능성이 높아지게 됩니다.
그래서 사용하는 것이 버텍스 버퍼 힙입니다. 일반적으로 우리가 사용하는 malloc, new, HeapAlloc처럼 버텍스 버퍼의 큰 덩어리를 놓고 가변적으로 버텍스 버퍼 블럭을 할당해주고 해제시 병합하여 큰 블럭으로 만들어주는 메모리풀이죠.몇개월전에 버텍스 버퍼에 그대로 매칭시킬수 있는 유져모드 고속 메모리 힙을 만들었는데 이 힙 라이브러리를 사용하고 곧 버텍스 버퍼 힙을 만들었습니다. SS3D엔진은 같은 힙 라이브러리를 사용하여 만든 버텍스 버퍼 힙과 인덱스 버퍼 힙을 사용합니다. 덕택에 버텍스 버퍼 캐쉬와 인덱스 버퍼 캐쉬를 사용할 수 있게 된 것이죠.
버텍스 버퍼 캐쉬를 사용한 덕분에 SS3D엔진을 사용하는 코룸온라인은 평균 50%이상 과부하시 90%정도의 속도의 이득을 볼 수 있었습니다.
답변이 되었는지 모르겠군요.
>기본적으로 동일한 구조의 오브젝트면 몰라도
>캐릭터가 각각 다른데 이게 가능한지요?
>어떻게 하셨는지 힌트라도 좀 주세요...
>그럼 수고하세요
>
>
그래서 ss3d엔진은 피지크 처리를 전적으로 소프트웨어에 의존합니다.덕분에 무제한의 n링크 피지크를 사용할 수 있습니다.속도에서의 약점은 피지크 트랜스폼 함수를 최적화된 SSE 코드로 짜서 C만 사용해서 짠 코드보다 3배정도 빠르게 처리했습니다.
그럼에도 불구하고 피지크 처리는 cpu에 많은 부하를 걸리게 합니다.왜냐하면 일단 락을 걸고 버텍스 데이타들을 갱신해야하기 때문이죠.cpu에서 아무리 빠르게 처리한다 해도 버스를 타고 비디오 메모리로 전송되는 병목은 피할 길이 없습니다.
이 부하를 줄이고자(즉 락걸고 업데이트하는 시간을 줄이고자) 버텍스 버퍼 캐쉬를 사용합니다.
컨셉은 간단합니다. 버텍스 애니메이션을 흉내내는 것이죠. 거의 모든 게임에서는 일반적으로 애니메이션은 반복 사용됩니다. 예를 들어 걷는 동작이 있다 칩시다.30프레임짜리 걷는 동작이 있으면 적어도 1초정도 후에는 그 동작을 다시 필요로 하게 됩니다.정석대로 투영하여 그림자를 출력하는 SS3D엔진같은 경우는 적어도 두번이상 같은 애니메이션이 프레임이 사용됩니다. 이런 경우 피지크 트랜스폼된 버텍스들을 그대로 가지고 있다가 필요로 할때 다시 돌려주면 락을 걸고 새로 갱신할 필요가 없게되죠.
여기서 문제가 되는 것이 각각의 매쉬 오브젝트들은 사용하고 있는 버텍스 개수가 다르다는 것입니다. 버텍스 버퍼를 메모리 풀로 만들어서 실시간 할당,해제를 해야만 하는데 게임 등장하는 수많은 매쉬오브젝트들의 버텍스 개수가 일정치 않으므로 최대치를 정해서(오브젝트당 최대 버텍스 개수는 4000개다..이런식으로) 고정 사이즈로 할당하게 되면 메모리 효율이 극히 나빠지고 캐쉬 미스 가능성이 높아지게 됩니다.
그래서 사용하는 것이 버텍스 버퍼 힙입니다. 일반적으로 우리가 사용하는 malloc, new, HeapAlloc처럼 버텍스 버퍼의 큰 덩어리를 놓고 가변적으로 버텍스 버퍼 블럭을 할당해주고 해제시 병합하여 큰 블럭으로 만들어주는 메모리풀이죠.몇개월전에 버텍스 버퍼에 그대로 매칭시킬수 있는 유져모드 고속 메모리 힙을 만들었는데 이 힙 라이브러리를 사용하고 곧 버텍스 버퍼 힙을 만들었습니다. SS3D엔진은 같은 힙 라이브러리를 사용하여 만든 버텍스 버퍼 힙과 인덱스 버퍼 힙을 사용합니다. 덕택에 버텍스 버퍼 캐쉬와 인덱스 버퍼 캐쉬를 사용할 수 있게 된 것이죠.
버텍스 버퍼 캐쉬를 사용한 덕분에 SS3D엔진을 사용하는 코룸온라인은 평균 50%이상 과부하시 90%정도의 속도의 이득을 볼 수 있었습니다.
답변이 되었는지 모르겠군요.
>기본적으로 동일한 구조의 오브젝트면 몰라도
>캐릭터가 각각 다른데 이게 가능한지요?
>어떻게 하셨는지 힌트라도 좀 주세요...
>그럼 수고하세요
>
>