연구
시간이 난다면 프로그래밍 엔지니어로서 망상 연구 테마가 몇가지 있다. 적어 놓고 나면 언젠가 해결하는 날도 있겠지.

임의의 스레드에 C++ 예외나 OS 예외를 일으키기
로딩한 데이터의 압축 해제 등을 게임 중에 실시간으로 하고 있을 때 해당 처리를 수행하는 데 시간을 너무 많이 쓰면 유저 반응성과 프레임율에 악영향을 미친다. 이런 류의 시간 제한을 갖고 수행해야 하는 처리가 한 종류만 있을 때는 작업의 규모도 대략 예측이 가능하기 때문에 1~10여개의 작업이 끝날 때마다 시간을 재서 타임 아웃을 체크하거나 해서 처리한다든가, 비교적 간단한 방법으로 해결할 수 있는데, 규모가 큰 작업은 해당 코드 여기저기에 시간이 얼마나 지났는지 확인해서 처리를 포기하는 호출을 넣어주거나 그에 준하는 방식으로 동작하도록 로직을 수정해야 하는 등, 아름답게 처리하기가 힘들다.

이런 류의 문제를 해결하기 위해서 생각해본 것이 한 스레드가 돌면서 일정 시각마다 다른 스레드에 예외를 발생시켜주는 것. 그러면 단숨에 catch나 __except 블럭으로 날아가면서 재진입을 위한 하이버네이션 처리도 언와인딩 과정에서 엘레강스하게 해결할 수 있다. 다만 OS가 이런 기능을 지원할 이유가 없다든가, 해당 호출 스택 상태를 보존하거나 아니면 안전하게 중단이 가능한 시점에만 예외를 받아야 한다든가하는 까다로운 난점으로 실현 가능성은 매우 희박.


애니메이션과 컬링의 조화
(MMORPG의 경우에는 화면에 나올 캐릭터의 위치를 컨트롤 할 수 없다는 전제하에) 애니메이션 엔진과 컬링 엔진은 서로가 서로의 최적화에 모순이 되는 관계다. 두드러지는 예는 캐릭터에 붙어있는 이펙트와 같은 서브 액터와, 컬링 경계를 넘어버리는 스케일링 애니메이션이다. CPU에서 애니메이션을 처리한다고 가정하면, 캐릭터 애니메이션의 계산도 CPU에 상당히 부담을 주는 요인이기 때문에, 가능한 한 계산을 하고 싶지 않기 때문에 위치를 결정하는 최상위 노드의 애니메이션만을 계산해서 미리 계산된 컬링 바운더리에 적용해서 화면에 나오는지 그렇지 않은지를 결정한 뒤, 화면에 나타나지 않는다면 다른 노드에 대해서는 아무런 계산을 하지 않길 원한다고 하자. ('가장 빠른 연산은 아무 것도 하지 않는 연산이다')

하지만 여기에 스케일링 애니메이션이 포함되어 있다고 하면 얘기가 꼬이기 시작한다. 통상 최 상위 노드의 애니메이션을 고정된 크기의 컬링 바운더리에 적용시켜서 화면에 나타나는 지를 결정할텐데, 스케일링으로 인해 이 바운더리를 넘어서는 놈이 등장하면 결과적으로 최적화로 인해서 올바른 동작이 깨지는 문제가 발생하게 되는 것이다. 이펙트 등의 서브 액터도 마찬가지인데, 이 경우는 보통 초기의 컬링 바운더리를 벗어나는 액터가 최상위 노드가 아닌 다른 노드에 달려있게 되기 때문에 해당 서브 액터가 달려있는 노드의 위치를 계산해보기 전에는 알 수가 없고, 이로 인해서 맨 처음 생각했던 '화면에 나오는 지 안 나오는 지를 결정한 뒤 애니메이션을 계산하겠다'라는 최적화 방향이 깨지게 된다.

(덤으로 서브 액터를 상위 액터의 컬링 바운더리에 포함시키기 어려운 경우, 서브 액터는 자신이 독립적인 액터로서 자신의 위치를 계산해야만 컬링을 계산할 수 있다고 주장해야 하는데, 이런 경우 노드의 트리 구조를 모두 순회하지 않고 서브 액터를 빨리 스캔하는 방법도 구현상 꽤 챌린징한 부분)

이 문제들을 해결하기 위해서 생각했던 대략의 해결책이 있긴 하다. 하위 노드의 애니메이션에 스케일링이 포함된 경우 해당 프레임의 컬링 바운더리의 스케일 수치를 전처리해서 최상위 애니메이션 트랙의 일부로 포함시킨다. 즉, 컬링 바운더리를 미리 계산해서 애니메이션화 시킨다는 것인데, 이 방법의 단점은 딱 보자마자 알 수 있듯이 실시간 스케일링을 허용하지 않는다는 점이다. 서브 액터 문제의 경우, 각 서브 액터로부터 최상위 노드까지 이어지는 패스 상의 노드에 대해서만 애니메이션을 계산해 볼 수 있도록 하는 것이 최선인 것 같다. 퍼포먼스 히트가 없이 전체를 계산하지 않고 일부 루트만 계산할 수 있도록 만드는 것이 예상되는 구현의 포인트.


by 매운맛나리 | 2004/12/10 00:09 | 개발 | 트랙백(1) | 덧글(4)
트랙백 주소 : http://beforu.egloos.com/tb/646948
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 이은석 항해일지 at 2004/12/10 01:41

제목 : 망상 연구
매운맛나리의 연구 나의 오늘 망상주제. 예전부터 해온 생각중의 하나는, 게임에 물리학 적용은 아직도 발전할 여지가 많이 있다는 것이다. 특히 액션게임에서의 격투쪽이 미개척분야인데, 지난 세월동안 스파, 버파 같은 위대한 격투게임들이 게임계에 이너베이션을 이끌었지만, 타격과 액션 판정에 있어서는 20여년간 아래와 같은 형식에서 달라진게 거의 없다. (1) 타격자와 피타격자는 pre-defined key 애니메이션을 재생한다. (2) 아래와 같이 타격판정을 한다. if 중첩됐나......more

Commented by 항해자D at 2004/12/10 00:57
이런저런 면에서 스케일링 애니메이션을 구현하는건 귀찮은 일인데, 옛날부터 닌텐도 게임들은 아무렇지도 않은듯이 스케일링을 해대서 신기하다오
Commented by 매운맛나리 at 2004/12/13 00:10
왜 회사에선 덧글이 안 되는지... 애니메이션-컬링 문제는 써놓고 나니 현업 종사자로서 수준 미달인 것 같은 느낌이...;
Commented by levites at 2005/02/24 14:24
서브 액터가 존재하는 트리 라인만 업데이트 하는 것은 멋진 아이디어군요! 하지만 기존에 없었던 전처리 연산이 포함되는 것인데 결국 최종 퍼포먼스는 비슷해지는게 아닐런지..? 개인적으로는 정밀함 보다는 "멋지게 잘 보이는" 을 목표로 바운딩 스피어를 서브 액터를 포함했을때의 가능한 최대 사이즈와 서브 액터를 고려하지 않은 사이즈의 이중 처리를 준비해두고, 작은 바운딩 스피어에 컬링 되지 않았을 때는 애니 업데이트 주기를 떨어뜨리는 식의 현실과의 타협을 생각중이었는데.. 이것도 마찬가지긴 하군요 ;
Commented by 매운맛나리 at 2005/03/01 02:40
반갑습니다~ 중국에 다녀올 일이 있어서 답글이 늦었습니다. (__) 최근 글로 봐서는 프로그래머 블로그로는 전혀 안 보일텐데 어떻게 알고 오신 건지 궁금하네요... :) 대강 특정 조인트에 이펙트가 붙는 시점에 그 트리 라인에 해당하는 인덱스 리스트를 구해서 메인 액터에 배열 형태로 저장하는 식이면 가능하지 않을까 생각하고 있습니다.

:         :

:

비공개 덧글



< 이전페이지 다음페이지 >