어째서.. dx9.0 후면버퍼에 직접 접근해서 메모리 값 변경하는 것 보다
7.0에 있는 direct draw에서의 후면버퍼에 직접 접근해서 메모리값 변경하는게 더 빠르고 퍼포먼스가 좋게 나오지;;
이런식으로 후면버퍼 픽셀 하나하나 값 바꿔서 검정화면으로 바꾸는데 이 코드 넣자마자 엄청 느리니 환장할 지경...
for(int i = 0; i < 640; i++)
{
for(int j = 0; j < 480; j++)
{
imageData[i+(j * (lockedRect.Pitch/4))] = 0;
}
}//원래 1280 * 860이었는데 너무 느려서 640*480으로 바꿈. 근데 별 차이 없이 느린듯.. 아.. 이 코드 전엔 프레임 날라다니는데
// 후면버퍼 지우는 이 코드 넣으면 프레임 한 20?
이 코드말고 dx에서 기본지원되는 함수로 후면버퍼 지우면 엄청 빠르던데.. 이건 cpu가 아니라 gpu를 사용하는걸테니 그러려니 해도
왜 direct draw에서 구현한 비슷한 프로그램의 소스코드가 훨씬 빠른거지????
완전히 같은 소스코드는 아니지만 거기선 수작업으로 후면버퍼 지우는데도 이정도의 성능저하는 안 일어남;
후면버퍼 한 두세번 수작업으로 지워도 프레임 많이 안 떨어져야 정상 아니야?;;
해상도는 같고 dx7은 32비트가 아니라 16비트이긴 한데 이 차이가 그리 클 것 같진 않고...
dx7은 프레임 막 무한대로 뻗어 나가는데
dx9로 저리 구현하면 프레임 한 20 나올듯;
혹시 배열에 값을 넣는 저 연산이 그리 리소스를 많이 잡아먹나 해서 아무 의미없는 배열을 변경하는 코드로 바꿨더니 전과는 다르게 엄청 빠르게 돌아감..
후면버퍼의 배열의 값을 바꿀때만 시스템에 부하가 걸리고 아무 의미없는 배열의 값을 바꿀때엔 별로 부하가 안걸림..
혹시 후면버퍼의 값을 포인터로 접근해서 바꿀 때마다 자동으로 인식해서 무슨 연산이 일어나는건 아니겠지?? 비쥬얼베이직도 아닌데 ㅠㅜㅠㅜㅜ
아... 뭐야 이거 ㅠㅜㅠㅜㅠㅜ 고생고생해서 9.0으로 넘어온 보람이 없어...
저거 왜 그런거야??? 존잘 고수님 누가 설명 좀..
dx 안 잡은지 오래되서 하나도 모르겠지만... 메모리 풀과 관련된 설정이라던지 몇 가지 플래그에 따라 속도 차이가 크게 날 수도 있고, 애초에 dx9에서 후면 버퍼에 직접 접근해서 lock을 거는 것 자체가 권장되지 않던 걸로 기억한다. 일단 서페이스를 하나 잡아서 그걸로 lock을 걸어봐. 그리고 뭘 draw하고자 하는 지 모르겠지만 dx9에서는 직접 표면에 접근하기 보다는 3D 렌더링 파이프라인을 통한 2D를 구현하는 게 기본이다. 차라리 그쪽을 더 알아봐.
메모리풀 설정이랑 Lock할때 옵션에 따라 틀리것지
헐 토페형 매번 고맙 고맙 ㅠㅜㅠㅜ 직접 후면버퍼에 손대는 것보다 직교투영해서 2D이미지 뿌리는게 낫다는 말이지?
쮸쮸빠형도 왔네 굳
Performing a lock operation (or using IDirect3DDevice9::UpdateSurface to write) on the lockable back buffer decreases performance on many cards. In this case, consider using textured triangles to move data to the back buffer. 잠글 수 있는 백 버퍼에 접근하면 퍼포먼스가 떨어진다고 아예 SDK help에 써있네. 결론은 걍 직교투영ㅇㅇ
형들 나 진짜 많은거 안 바라고 화면에 출력될 픽셀 하나하나 값 변경해서 높은 프레임으로 화면에 출력시키기만 할 수 있으면 대 만족인데 대체 어떻게 해야하지..ㅠㅜ..
DX9가 소프트웨어가 복잡한 것도 있고, 그래픽카드에 따라서도 차이남. 보통 ATI가 DX를 덜 제대로 지원하지 - _-)
정말 저것만 아-주 빠르게 최적화 된 소스로 작업하고 싶어서... 직접 3D엔진도 만들어보고 싶고 한데..
래봤자 호랑이 담배빨던 시절 이야기라서... ㅁㄴㅇㄹ
쓰기성능 높이려면 D3DUSAGE_WRITEONLY로 생성해야 하지만, 보통 후면버퍼에 이 옵션은 잘 안넣으니.. 오프텍스쳐 하나 만들어서 거기서 작업을 해서 후면에 그리거나, UpdateSurface 또는 UpdateTexture로 복사하는게 젤 좋을듯
텍스쳐나 서페이스에 접근해서 업데이트 시키고 백버퍼에 뿌린다 or 쉐이더를 사용한다. 가능하면 쉐이더로 하는 게 좋겠지.
토페형 \"잠글 수 있는 백 버퍼\"라는 말은 잠글 수 있는 옵션이 없는 백버퍼 같은것도 존재한다는 말 맞아? 혹시 그거 찾아내서 그 백 버퍼로 작업하면 내가 원하는 픽셀 하나하나 조작해서 뿌리기에 최적화 된 소스코드로 작업할 수 있을까?
잠글 수 있는 백 버퍼를 만들어 주는 옵션은 D3DPRESENTFLAG_LOCKABLE_BACKBUFFER야. 내가 저번에 말해줘서 니가 지금 쓰고 있는 옵션이지. 그런데 이 옵션이 없으면 애초에 백버퍼를 못 잠궈. 그러니까 걍 백버퍼에 접근할 생각을 하지를 마.
응! 형들 정말 도와줘서 고마워 ㅠㅜ... 댓글 시스템 때문에 이것저것 물어보고 싶은게 많은데 한꺼번에 물어볼 수강 없네...
일단 이문동 쮸쮸바 형이 말한 D3DUSAGE_WRITEONLY로 생성하는거 찾아서 테스트 해봐야겠다 ㅠㅜ