|
시간이 난다면 프로그래밍 엔지니어로서 망상 연구 테마가 몇가지 있다. 적어 놓고 나면 언젠가 해결하는 날도 있겠지.
임의의 스레드에 C++ 예외나 OS 예외를 일으키기 로딩한 데이터의 압축 해제 등을 게임 중에 실시간으로 하고 있을 때 해당 처리를 수행하는 데 시간을 너무 많이 쓰면 유저 반응성과 프레임율에 악영향을 미친다. 이런 류의 시간 제한을 갖고 수행해야 하는 처리가 한 종류만 있을 때는 작업의 규모도 대략 예측이 가능하기 때문에 1~10여개의 작업이 끝날 때마다 시간을 재서 타임 아웃을 체크하거나 해서 처리한다든가, 비교적 간단한 방법으로 해결할 수 있는데, 규모가 큰 작업은 해당 코드 여기저기에 시간이 얼마나 지났는지 확인해서 처리를 포기하는 호출을 넣어주거나 그에 준하는 방식으로 동작하도록 로직을 수정해야 하는 등, 아름답게 처리하기가 힘들다. 이런 류의 문제를 해결하기 위해서 생각해본 것이 한 스레드가 돌면서 일정 시각마다 다른 스레드에 예외를 발생시켜주는 것. 그러면 단숨에 catch나 __except 블럭으로 날아가면서 재진입을 위한 하이버네이션 처리도 언와인딩 과정에서 엘레강스하게 해결할 수 있다. 다만 OS가 이런 기능을 지원할 이유가 없다든가, 해당 호출 스택 상태를 보존하거나 아니면 안전하게 중단이 가능한 시점에만 예외를 받아야 한다든가하는 까다로운 난점으로 실현 가능성은 매우 희박. 애니메이션과 컬링의 조화 (MMORPG의 경우에는 화면에 나올 캐릭터의 위치를 컨트롤 할 수 없다는 전제하에) 애니메이션 엔진과 컬링 엔진은 서로가 서로의 최적화에 모순이 되는 관계다. 두드러지는 예는 캐릭터에 붙어있는 이펙트와 같은 서브 액터와, 컬링 경계를 넘어버리는 스케일링 애니메이션이다. CPU에서 애니메이션을 처리한다고 가정하면, 캐릭터 애니메이션의 계산도 CPU에 상당히 부담을 주는 요인이기 때문에, 가능한 한 계산을 하고 싶지 않기 때문에 위치를 결정하는 최상위 노드의 애니메이션만을 계산해서 미리 계산된 컬링 바운더리에 적용해서 화면에 나오는지 그렇지 않은지를 결정한 뒤, 화면에 나타나지 않는다면 다른 노드에 대해서는 아무런 계산을 하지 않길 원한다고 하자. ('가장 빠른 연산은 아무 것도 하지 않는 연산이다') 하지만 여기에 스케일링 애니메이션이 포함되어 있다고 하면 얘기가 꼬이기 시작한다. 통상 최 상위 노드의 애니메이션을 고정된 크기의 컬링 바운더리에 적용시켜서 화면에 나타나는 지를 결정할텐데, 스케일링으로 인해 이 바운더리를 넘어서는 놈이 등장하면 결과적으로 최적화로 인해서 올바른 동작이 깨지는 문제가 발생하게 되는 것이다. 이펙트 등의 서브 액터도 마찬가지인데, 이 경우는 보통 초기의 컬링 바운더리를 벗어나는 액터가 최상위 노드가 아닌 다른 노드에 달려있게 되기 때문에 해당 서브 액터가 달려있는 노드의 위치를 계산해보기 전에는 알 수가 없고, 이로 인해서 맨 처음 생각했던 '화면에 나오는 지 안 나오는 지를 결정한 뒤 애니메이션을 계산하겠다'라는 최적화 방향이 깨지게 된다. (덤으로 서브 액터를 상위 액터의 컬링 바운더리에 포함시키기 어려운 경우, 서브 액터는 자신이 독립적인 액터로서 자신의 위치를 계산해야만 컬링을 계산할 수 있다고 주장해야 하는데, 이런 경우 노드의 트리 구조를 모두 순회하지 않고 서브 액터를 빨리 스캔하는 방법도 구현상 꽤 챌린징한 부분) 이 문제들을 해결하기 위해서 생각했던 대략의 해결책이 있긴 하다. 하위 노드의 애니메이션에 스케일링이 포함된 경우 해당 프레임의 컬링 바운더리의 스케일 수치를 전처리해서 최상위 애니메이션 트랙의 일부로 포함시킨다. 즉, 컬링 바운더리를 미리 계산해서 애니메이션화 시킨다는 것인데, 이 방법의 단점은 딱 보자마자 알 수 있듯이 실시간 스케일링을 허용하지 않는다는 점이다. 서브 액터 문제의 경우, 각 서브 액터로부터 최상위 노드까지 이어지는 패스 상의 노드에 대해서만 애니메이션을 계산해 볼 수 있도록 하는 것이 최선인 것 같다. 퍼포먼스 히트가 없이 전체를 계산하지 않고 일부 루트만 계산할 수 있도록 만드는 것이 예상되는 구현의 포인트.
|
포토로그
카테고리
이전블로그
최근 등록된 덧글
최근 등록된 트랙백
메뉴릿
이글루링크
없음
▒ 제닉스의 사고뭉치 ▒ 뭉시리의 집.. Mii Plluto's cheerful Geh.. 일본에 먹으러가자. Sequoia WebLog the world is naked. 태양의 곁자리 하얀까마귀의 테스트베드.. v e r . b e t a 주식회사 이디스 sphere burster ; whit.. gundown의 食遊記 LOVEstation AD/DA -.. I Hate You 이은석 항해일지 soup_box[물고기.. 히엔 돈 카펠리아노 산벽달회 나를 숨기는 것은 얼마나.. ozzyz review 허지웅.. ▷단열 곤충 채집통◁ sIMAGINATIONs ZELONGLOO3OTH Groove Tube P.C하지 않은 ㅎㅅㅎ 25세 빛의 탑, 어둠의 던전 紙月 오리대마왕님 집 Field's Nest Astralium Report rehn's トイレ kyungjae.net 사회디자인연구소 Blameless life.... 龍孤視遠天爲時振威名 카즈군의 Holyland ROUGH SKETCH ▣Lac pourpre▣ Oxymoronic World 우리는 꽁패밀리!!!! 한글날의 부활. 쌀밥게임 대왕 gimmesilver's blog 무디의 무책임한 세상 Discoveries Noenoe Sweet & Slow ZelDaQ 빈틈씨의 먹자골목 You're on the blitzkre.. 매거진 프라우드 MAGAZ.. CASSIS PEACH 랩좀비. 랩은 못하지만 .. rootrain '-')/ 毎日がスペシャル 마나네 타이요(taiyo) 쑥의 pro.TOT.yping Relish the Process 정열의 아자베 둥글게 君という光 rose 구찮아... Stay hungry, stay fo.. 깔짝깔짝 생활 Dream of Time 얼어붙은 수돗물 파이프 낭만과 해학으로 함께 가.. 쳐키의 드라이빙 Ohyecloudy's S3 Counter-revolutionar.. 도로시를 부탁해 ★ Stella et Fossilis SAGA 완성의 그 날 M과 M사이 Incarnation 카로 택시지 Li ucciderò. 망치와 모루 마케터의 블로그스타 - 200.. ANTHOLOGY 2731A 공돌이 옵빠 K 송아지 스팀밀크 백기사님의 이글루 grand blue 따뜻하고 한가로운 블로그 하드보일드하게 사는 거야! 야재나라 야햑묜 이글루 바깥 세상
|