안녕하세요 예전부터 있었던 궁금증인데,
스타에보면 엄청난 유닛들이 전부다 실시간으로 동시에 제각각의 반응과 움직임을 보이잖아요.
이게 어떻게 가능할까요? 멀티쓰레드에 관하여 배웠지만 스타같이 하나의 종족에 인구수가 200을
육박하는 상황에 유닛하나하나에 전부다 쓰레드를 생성하나요? 그 방법은 관리하기가 너무 벅차서
현실적이지 못할것 같습니다. 과연 어떻게 구현되는 걸까요?
생각하시는 것 처럼 당연히 쓰레드를 쓰지 않습니다.
보통은 무한 루프를 돌면서 게임에서 쓰이는 시간 단위(ex: frame)로 이벤트 폴링을 하며, 각각의 유닛은 이벤트에 맞게 상태를 변경해가며 계속해서 자신의 스프라이트를 화면에 출력하는 식입니다.
자세한 질문은 전공 분야가 아니라서 패스입니다. :)
쓰레드 풀'같은걸 사용하지 않을까 생각하네요. 1. 일정한 시간안에 처리된 연산결과를 어떤 버퍼에 저장하고 2. 해당 시간이 되면. 버퍼내용을 렌더링 하는 방식으로요.
스타크래프트를 보면 리플레이가 되는데. 그걸 생각해보면. 연산된 데이터를 저장하고 그 결과를 렌더링 하는걸로 보여집니다.
---------------------------------------------------------------------------- 젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다. 정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
설명해 놓으신 것은 쓰레드 풀이 아니라 더블 버퍼링입니다. 화면과 똑같은 버퍼를 둬서
하나의 프레임 동안의 연산된 결과를 모두 가상의 버퍼에 그리고 실제 화면에 한 번에 렌더링하는 방식입니다.
차례대로 이뤄집니다. 200개의 유닛이 있다면 1번부터 200번까지 일단 시간당 움직일 수 있는 거리를 움직입니다. 그리고 모든 유닛이 움직이고 나면 화면에 뿌려줍니다. 화면에 뿌리는 속도는 최소한 30frame/sec입니다. 즉, 모든 유닛이 움직이는게 0.03초 이내에 이뤄져야 한다는 거죠.
------------------------------ How many legs does a dog have?
상당히 리소스를 많이 먹어서 힘들것 같았는데 그런방식이었군요.
대단하네요 그 짧은 시간안에 엄청난 처리가 이루어지다니.
답변 감사합니다.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
생각하시는 것 처럼 당연히 쓰레드를 쓰지
생각하시는 것 처럼 당연히 쓰레드를 쓰지 않습니다.
보통은 무한 루프를 돌면서 게임에서 쓰이는 시간 단위(ex: frame)로 이벤트 폴링을 하며,
각각의 유닛은 이벤트에 맞게 상태를 변경해가며 계속해서 자신의 스프라이트를 화면에 출력하는 식입니다.
자세한 질문은 전공 분야가 아니라서 패스입니다. :)
ㅇ_ㅇ''' 저도 모르지만..
쓰레드 풀'같은걸 사용하지 않을까 생각하네요.
1. 일정한 시간안에 처리된 연산결과를 어떤 버퍼에 저장하고
2. 해당 시간이 되면. 버퍼내용을 렌더링 하는 방식으로요.
스타크래프트를 보면 리플레이가 되는데. 그걸 생각해보면.
연산된 데이터를 저장하고 그 결과를 렌더링 하는걸로 보여집니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
설명해 놓으신 것은 쓰레드 풀이 아니라 더블
설명해 놓으신 것은 쓰레드 풀이 아니라 더블 버퍼링입니다. 화면과 똑같은 버퍼를 둬서
하나의 프레임 동안의 연산된 결과를 모두 가상의 버퍼에 그리고 실제 화면에 한 번에 렌더링하는 방식입니다.
차례대로 이뤄집니다. 200개의 유닛이 있다면
차례대로 이뤄집니다.
200개의 유닛이 있다면 1번부터 200번까지 일단 시간당 움직일 수 있는 거리를 움직입니다.
그리고 모든 유닛이 움직이고 나면 화면에 뿌려줍니다.
화면에 뿌리는 속도는 최소한 30frame/sec입니다.
즉, 모든 유닛이 움직이는게 0.03초 이내에 이뤄져야 한다는 거죠.
------------------------------
How many legs does a dog have?
그렇군요
상당히 리소스를 많이 먹어서 힘들것 같았는데 그런방식이었군요.
대단하네요 그 짧은 시간안에 엄청난 처리가 이루어지다니.
답변 감사합니다.
댓글 달기