상세 컨텐츠

본문 제목

[포니 게임 개발] 24

프로그래밍/포니게임개발

by ∫2tdt=t²+c 2013. 5. 22. 14:26

본문




(날이 저물었네요... : 지금 내 심정?ㅋ)


최근에는 UI를 작업하다가, FPS가 너무 떨어지는걸 보고 최적화작업을 수행하는 중입니다.

큰 업데이트 사항을 보자면

* UI 기능 강화: 고해상도 모니터에서 볼때 UI텍스쳐도 고해상도 모드로 나올수 있게 ISSprite클래스이 scale요소를 추가했습니다.

* 전역조명 계산법이 강화되었습니다. 그 덕분에 두 조명 사이를 보간하며 변화시킬수 있습니다.

* 몇가지 최적화를 수행하여 FPS를 10~20 정도 상승시켰습니다.

* 확장성이 없던 ISEffect 클래스를 뜯어고쳐서, 불필요한 부분은 쳐내고, 다양한 셰이더 코드에 유동적으로 대응할 수 있게 변경했습니다.


각각 수정사항을 세세히 보자면,

1. UI 스케일링은 고해상도 텍스쳐를 따로 두는 방식으로 한 건 아니고, 저해상도 모드에서는 낮을 배율로 텍스쳐를 보여주고, 고해상도에서는 높은 배율로 텍스쳐를 보여주는 겁니다. 단순하죠.


2. 전역 조명을 좀더 자연스럽게 변경했어요. 일단 주광, 보조광, 환경광의 3세트는 그대로 유지하되, 주광과 보조광의 입사각도를 구면좌표계를 이용해 계산하게 바꾸었습니다. 실제 태양이 천구를 움직이는 것마냥 주광과 보조광이 천구를 자연스럽게 회전할 수 있게한 것이지요.

구면좌표계를 도입하면서 두 조명 상태 사이의 보간도 쉬워졌습니다. 구면좌표계에서의 theta값과 phi값만 보간하면 되는 거니까요


3. 그동안은 정말 막장코드였습니다. DP콜과 SetTexture, SetRenderState, SetIndices, SetStreamSource 등이 과다하게 호출되고 있었고, 몇가지만 손대는 최적화로도 어느정도 이득을 볼수 있었습니다.

오브젝트를 출력하기 전에 먼저 메쉬타입별로 정렬하고, 같은 메쉬를 출력할때는 SetIndices, SetStreamSource, SetTexture가 한번만 출력되도록 바꾸었습니다. 단순한 작업이었는데 의외로 성능이 올라서 흐뭇하네요.

조만간 옥트리를 구현해 컬링도 체계적으로 할 예정입니다.


4. 이전의 ISEffect 클래스는 텍스쳐 설정이 필요없는 셰이더 코드에서도 Diffuse, Opacity, Bump, Specular 텍스쳐를 업데이트하는 등 낭비가 심했고, 정해진 텍스쳐를 다른 목적으로 사용하기도 힘들게 되어있었습니다. (왜 이렇게 만들었지...ㅋㅋ) c 11의 조흔 함수객체 녀석들을 이용해서, 셰이더 테크닉별로 알맞게 텍스쳐 및 기타 변수를 업데이트할 수 있게 바꿨습니다.


원래 목표는 셰도우맵을 PSM 혹은 LiSPSM 기법 등으로 업그레이드해서, 그림자 품질을 향상시키고, 멀티렌더타겟을 구현하여 성능을 향상시키는거였는데, 셰도우맵은 생각보다 결과가 별로여서 때려쳤고, 멀티렌더타겟은 열심히 고민중입니다.



관련글 더보기

댓글 영역