Subversion, Bitnami Redmine 다운, 설치 및 저장소 연동 그리고 백업과 복원



이 글에서는 우리가 자주 사용하는 SVN Subversion과 Bitnami Redmine을 Windows7에 다운, 설치 및 저장소 연동, 

그리고 백업과 복원에 대해서 정리를 한다. 내 스스로가 나중에 잊어버리지 않기 위해...;; 요즈음 머리가;;


여기 자료들은 Subversion SVN과 Redmine 설치를 위해서 웹 검색을 하면서 모은 자료이기도 하다.

그때그때 정리해서 저장을 해 뒀지만, 어느 분의 웹에서 검색을 했던 자료인지는 저장해 두지를 않았다;; 구찮기도 하고;;

본인이 작성한 자료를 삭제하라고 하면 삭제를 해야하지 않을까 싶다. 

문제가 되는 자료가 있다면 거침없이 하이킥을;;


다만 조금이라도 도움이 되는 분이 있으면 그것으로 대 만족이다.

일단 내 자신의 만족을 위해서 작성했다. ^^



0. 목표 및 진행순서

목표는 Linux에 비해서 접근이 쉬운 Windows7 환경에서 Subversion과 Redmine의 저장소 연결을 통해서,

소스코드 버전 관리(Subversion SVN) 및 프로젝트 관리 시스템(Redmine)의 모든 환경을 쉽게 셋팅하는 것이 목표다.

물론 장비 이동등으로 인한 백업 및 복원도 포함한다.


소스로 직접 인스톨 하고 싶은 사람은 최신 버전을 받아서 커맨드 입력을 해도 되지만, 여기서는 패스한다.


진행 순서는 아래와 같다.


1. Subversion 다운로드 및 설치(Setup-Subversion-1.6.6.msi)

  1-1. 다운로드

  1-2. 설치

  1-3. SVN Repository 생성

  1-4. SVN Repository 정보 셋팅

  1-5. SVN Commit시 반드시 Message 남기기

  1-6. Subversion 구동방법

    1-6-1. 수동 구동

    1-6-2. 서비스 구동

    1-6-3. 서비스 삭제

    1-6-4. SVNSERVE Manager 사용


2. SVNSERVE Manager 다운로드 및 설치(SVNManager-1.1.2-Setup.msi)

  2-1. 다운로드

  2-2. 설치

  2-3. 실행 및 셋팅

  2-4. 방화벽 해제


3. TortoiseSVN 다운로드 및 설치(TortoiseSVN-1.8.8.25755-x64-svn-1.8.10.msi)

  3-1. 다운로드

  3-2. 설치

  3-3. 실행 및 정보 셋팅
  3-4. 사용방법


4. Bitnami Redmine 다운로드 및 설치(bitnami-redmine-2.6.0-1-windows-installer.exe)

  4-1. 다운로드

  4-2. 설치

  4-3. 실행 및 셋팅


5. Redmine의 저장소에 Subversion 연동하기

  5-1. 연동 방법

  5-2. 일감 및 저장소


6. SVN 데이터 백업(Backup) 및 복원(Restore)

  6-1. SVNServer IP 변경 데이터 및 히스토리 보전한 상태로 이동 및 백업

  6-2. 백업(Backup) - Dump

  6-3. 복원(Restore) - Create, Repository 생성

  6-4. 복원(Restore) - Load

  6-5. Relocate


7. Bitnami Redmine 데이터 백업(Backup) 및 복원(Restore)

  7-1. 백업 전 알아야 할 사항

  7-2. 백업(Backup)

    7-2-1. 구동 서버 Stop

    7-2-2. 첨부파일 백업

    7-2-3. DB ID & PW 체크

    7-2-4. ID & PW를 이용하여 SQL 데이터를 백업

  7-3. 복원(Restore)

    7-3-1. DB ID & PW 체크

    7-3-2. 백업 SQL 파일 복사

    7-3-3. 빈 Redmine DB 생성

    7-3-4. SQL 데이터 복원

    7-3-5. DB Migration

    7-3-6. 첨부파일 복원

  7-4. 서비스 실행


그럼, 팀 작업을 위해 필수인 Subversion, Redmine 두가지 프로그램에 대한 다운, 설치, 백업 및 복원에 대해서 알아보자.




1. Subversion 다운로드 및 설치

1-1. 다운로드

일단 Subversion 을 아래에서 다운 받는다.

예전하고 다르게 메뉴가 변경이 되어서.. 현재 1.8.10까지 나와 있는데, 

1.6.6 버전까지만 인스톨 버전을 제공해서 1.6.6 버전을 기준으로 합니다. (소스가 아닌 쉽게 인스톨 하는것이 기준;;)


https://subversion.apache.org/를 통해서 찾아 들어가다보면 아래의 소스포지 사이트에서 다운 받을 수 있음

http://sourceforge.net/projects/win32svn/files/1.6.6/의 Setup-Subversion-1.6.6.msi 클릭



1-2. 설치

Setup-Subversion-1.6.6.msi 파일을 더블클릭해서 설치한다.(default로 설치)


중요!! 이 아래의 Subversion과 관련한 모든 설치에 대한 부분은 편의상 아래와 같이 가정한다.

D:\SVNProject> 라는 폴더에 프로젝트 데이터를 저장한다고 가정하고, D:\SVNProject 폴더를 생성한다.

<프로젝트명>은 ProjectX로 한다.


1-3. SVN Repository 생성

폴더 생성이 완료되면 검색(윈도우키 + R)에서 cmd를 입력해서 띄운 후, D:\SVNProject>로 이동한다.

아래와 같이 실행해서 프로젝트 SVN Repository를 생성한다. <프로젝트명>은 ProjectX.

D:\SVNProject>svnadmin create --fs-type fsfs ProjectX



1-4. SVN Repository 정보 셋팅

메모장을 열어서 D:\SVNProject\ProjectX\conf 폴더안의 authz / passwd / svnserve.conf 파일을 아래와 같이 수정한다.

모든 유저에게 모든 권한 부여를 기본으로 설명하고, 폴더별 권한은 설명으로 대체한다.

수정사항은 주황색으로 표시한다.


<svnserve.conf>

anon-access = none                     # 익명사용자의 액세스가 불가함(default는 # anon-access = read)

auth-access = write                     # 인증 사용자의 쓰기가 가능함(default는 # auth-access = write)

password-db = passwd                 # 패스워드 정보로 passwd 파일을 사용함(default # password-db = passwd)

realm = Welcome to ProjectX !!    # SVN 접속시 뜨는 인사말(선택사항으로 realm = 뒷부분을 수정하면 된다.)


#authz-db = authz                      # 인증 정보로 authz 파일 사용(선택사항)

: 이 부분을 사용하면 폴더별로 권한 설정이 가능함, authz 부분 참조.  이 부분이 주석이면 모든 유저에게 모든 권한 부여


<passwd>

: SVN 접속시 계정 정보(ID) 및 패스워드 설정

# User 1

babytook = 1234


<authz>

: 계정을 그룹화 하거나 폴더별 권한 설정, 모든 유저에게 모든 권한으로 설정하므로 여기서는 수정할 내용이 없다.


주의!! svnserve.conf 파일의 authz-db = authz 가 주석이 아닐 경우에만 의미있다. 

authz 가 주석이면 모든 유저에게 모든 권한 부여가 되고, 여기도 전부 주석처리이거나 아무것도 없어야 한다. 


주석이 아닐 경우 아래의 내용 참조

---------------------------------------------------------------------------------

[/]

babytook = rw                 # babytook 계정으로 루트에 쓰기삭제 가능


아래는 세부사항이다.


Users 

    사용자 계정을 관리합니다.

    한글 이름을 사용할 수 있습니다.

    비밀번호에는 한글을 사용할 수 없습니다


Groups 

    계정을 그룹으로 묶어서 관리합니다.

    아래와 같은 양식으로 작성합니다.


    group = user1, user2, ...


Authz 

    접근권한을 설정합니다. 다음과 같은 형태로 권한을 설정할 수 있습니다.

      - 단일 사용자                                   

      - [groups] 섹션에서 정의된 그룹 사용자         

      - 와일드크드 '&star;' 는 모든 사용자를 의미함 

      - 롤 앞에 '~' 를 붙이면 반전을 의미함        


    접근권한 설정은 다음 3가지로 할 수 있습니다.

      - 'r' 읽기    

      - 'rw' 읽기/쓰기

      - '' 권한없음 


    예) 아래와 같이 작성하면 다음의 접근권한 제어가 발생한다.

      - sysadmin 계정은 모든 경로에 읽기/쓰기 가능

      - sys 그룹은 모든 경로에 읽기/쓰기 가능

      - adm 그룹은 tags, branches, trunk 경로에 읽기/쓰기 가능

      - dev 그룹은 trunk 경로에만 읽기/쓰기 가능

      - 계정이 없는 사용자도 읽기는 가능


        [/]

        @sys = rw

        * = r

        

        [/tags]

        @sys = rw

        @adm = rw

        * = r

        

        [/branches]

        @sys = rw

        @adm = rw

        * = r

        

        [/trunk]

        @sys = rw

        @adm = rw

        @dev = rw

        * = r

---------------------------------------------------------------------------------


1-5. SVN Commit시 반드시 Message 남기기

팀원들 중에 새로운 파일을 Commit시 간혹 아무런 내용없이 파일만 올리는 사람들이 종종 있다.

이런 팀원들을 위해서 반드시 Message를 남겨야만 Commit이 되도록 설정하는 방법이다.


D:\SVNProject\ProjectX\hooks 라는 폴더가 있다.

그 폴더안에 메모장을 열어서 pre-commit.bat 파일을 생성하고 아래와 같이 입력하면 된다.

---------------------------------------------------------------------------------

@echo off   

 :: Stops commits that have empty log messages.         

@echo off   

 

setlocal   

 

rem Subversion sends through the path to the repository and transaction id   

set REPOS=%1   

set TXN=%2            

 

svnlook log %REPOS% -t %TXN% | findstr . > nul   

if %errorlevel% gtr 0 (goto err) else exit 0   

 

:err

echo --- Message가 없으면 Commit을 할 수 없어요 --- 1>&2

echo --- Message를 작성해 주세요. ProjectX --- 1>&2

exit 1

---------------------------------------------------------------------------------


1-6. Subversion 구동방법

설치 및 셋팅이 완료 되었으므로 마지막으로 서버를 띄우는 작업이 남아있다.


1-6-1. 수동 구동

D:\SVNProject>svnserve -d -r D:\SVNProject

하지만, 매번 이렇게 구동하는 것이 귀찮기 때문에, Windows가 부팅되면 자동으로 시작되게끔 

서버를 아래와 같이 Windows 서비스로 등록한다.


1-6-2. 서비스 구동

커맨드 창에서 아래와 같이 입력하면 서비스에 등록이 된다.

주의사항으로는 등호(=) 다음에 공백이 하나 있어야 한다.


C:\>sc create svnserve binpath= "C:\Program Files\Subversion\bin\svnserve.exe --service -r D:\SVNProject" displayname= "Subversion Svnserve" depend= tcpip start= auto


1-6-3. 서비스 삭제

C:\>sc delete svnserve


1-6-4. SVNSERVE Manager 사용

다른 방법으로는 아래의 SVNSERVE Manager를 통해서 조금 더 편리한 방법을 제공한다.

그리고 SVNSERVE Manager를 통해서 하위에 여러가지 프로젝트를 동시에 구동이 가능하다.

이 부분이 궁극적인 목적이기도 하다.



2. SVNSERVE Manager 다운로드 및 설치

2-1. 다운로드

아래의 경로에서 SVNManager-1.1.2-Setup.msi를 클릭해서 다운 받는다. 감사의 말씀도 필수 ~~

http://www.pyrasis.com/main/SVNSERVEManager 



2-2. 설치

SVNManager-1.1.2-Setup.msi 파일을 더블클릭해서 설치한다.

(설치 경로는 Subversion이 설치된 경로의 bin폴더에서 실행되므로 default로 설치하면 된다.)


2-3. 실행 및 셋팅

설치가 완료되고, SVNSERVE Manager를 실행하면 아래와 같은 화면이 뜨는데,

아래 화면과 같이 셋팅한 후 Start를 누르면 Subversion이 구동된다.



<세부셋팅>

Subversion Repository Root --> D:\SVNProject

Port --> 3690

Settings Run Mode --> Normal

Automatically run program when you log on --> V(체크)


말 그대로 Root다. 하나의 프로젝트 뿐만 아니라 그 하위 폴더에 다양한 프로젝트를 구동가능하다.

이전에 프로젝트명을 ProjectX라고 Repository를 생성했는데, ProjectA, ProjectB 등으로 추가 생성이 가능하다는 말이다.


Automatically run program when you log on에 체크해 두고, 서비스에 추가하거나 

간단한 방법으로는 시작 프로그램에 바로가기를 만들어 두면 윈도우 시작시 자동으로 Subversion Server가 구동된다.


물론 Stop을 누르면 멈추게 되고, Exit를 누르면 프로그램 종료, Hide나 오른쪽 위 상단의 X 버튼은 minimize가 된다.


2-4. 방화벽 해제

Subversion의 목표는 팀 프로젝트이므로 다른 컴퓨터에서 동시에 여러 유저가 접속하는데 포트 방화벽을 해제해 줘야 접속이 가능하다.


제어판 -> Windows 방화벽 -> 고급설정 -> 

<고급 보안이 포함된 Windows 방화벽 창> 인바운드 규칙 -> 우클릭해서 새규칙(N) -> 

<새 인바운드 규칙 마법사 창> 포트 -> TCP(T) / 특정 로컬 포트(S) 3690 -> 연결허용(A) -> 규칙 적용 시기(각각 체크) -> 이름, 설명 입력(예 SVNProject)



3. TortoiseSVN 다운로드 및 설치

앞에서 서버 셋팅이 끝났으므로 팀원들 각각의 컴퓨터에서 서버로 접속을 해야 한다.

이 접속하는 클라이언트 프로그램을 개발자들이 거부기라 부르는 TortoiseSVN 이다.


3-1. 다운로드

아래의 경로에서 TortoiseSVN-1.8.8.25755-x64-svn-1.8.10.msi 파일을 다운 받는다.

http://tortoisesvn.net/downloads.html



3-2. 설치

TortoiseSVN-1.8.8.25755-x64-svn-1.8.10.msi 파일을 더블클릭해서 설치한다. (default로 설치)


3-3. 실행 및 정보 셋팅

설치가 끝나면 D:\SVNProject 폴더로 이동한 후, 마우스 우클릭해서 SVN Checkout.. 을 선택하면, 아래와 같은 화면이 뜬다.



아래의 <IP> 부분에 자신이 셋팅한 컴퓨터의 IP주소를 입력해 준다.

URL of repository: svn://<IP>/ProjectX 입력

Checkout directory: D:\SVNProject\ProjectX 입력


그리고, OK 버튼을 클릭하면 아래와 같은 계정 정보(ID) 및 패스워드를 입력하는 화면이 뜨고,

SVN Server에 있는 데이터를 받아오게 된다.




3-4. 사용방법

거부기의 사용방법에 대해서는 웹 검색을 해 보면 정말 많이 나와 있으므로 패스한다.


일반적인 사용법은 다들 아시겠지만, 기본적인 것만 보면 아래와 같다.


Add : 소스 데이터를 추가할 때

Commit : 소스 데이터를 서버에 올릴 때

Update : 신규 데이터를 서버로부터 받을 때

Export : 외부로 소스만 따로 백업할 때


이것으로 SVN Server와 각각의 팀원들의 Client 연동을 통해서 소스 버전 관리를 할 수 있다.



4. Bitnami Redmine 다운로드 및 설치

4-1. 다운로드

일단 Bitnami Redmine을 아래에서 다운 받는다.



4-2. 설치
bitnami-redmine-2.6.0-1-windows-installer.exe 파일을 더블클릭해서 설치한다. (default로 설치)
설치하는데 시간이 좀 걸린다.


설치에 어려움이 있거나 하진 않고, 설치에 대한 자세한 부분은 아래와 같이 순차적으로 인스톨 진행을 하면 된다.


기본 디폴트 경로를 지정하면 된다.


레드마인에서 관리자(Admin)인 user(디폴트) 계정 정보를 생성한다.

여기서 생성한 이름 및 패스워드를 사용하게 된다. 첫 로그인 이후 변경 가능하니 걱정없다.


Subversion을 미리 인스톨해서 3690 포트를 사용하고 있으므로, 여기서는 3691을 포트로 지정한다.

각자 자신이 원하는 포트를 지정하면 된다.




이메일로 통보해 주는 기능으로 기본 gmail 을 사용한다.

자신의 gmail 패스워드를 기록해 두면 일감 등록시 이메일로 전송이 된다.

다른 메일은 직접 정보를 넣어주면 된다.


클라우드 호스팅은 패스한다.



설치 완료 !!



4-3. 실행 및 셋팅
실행을 하게 되면 아래와 같은 레드마인 초기화면이 뜨게 된다.


Bitnami 레드마인 인스톨 후 어플 구동시 화면





레드마인 초기화면..

Access Bitnami Redmine Stack 클릭하면 아래와 같은 레드마인 초기화면으로 이동한다.


우측 상단의 로그인 클릭



관리자 user(디폴트) 계정으로 로그인




세부적인 관리나 프로젝트 관련 부분은 직접 사용해 보면 알 수 있으므로 패스한다.

단지 Redmine의 저장소에 Subversion을 연동하는 부분만 알아보겠다.



5. Redmine의 저장소에 Subversion 연동하기


5-1. 연동 방법

연동 방법은 의외로 간단하다. 프로젝트를 생성하고 나서 설정탭안의 저장소 탭을 클릭해서

+ 저장소 추가 를 눌러주고 SVN 정보를 입력해 주면 된다.




SVN URL 주소와 접속할 때 사용하는 계정 정보를 넣어주면 된다.



저장소가 추가된 모습이다.



5-2. 일감 및 저장소

이걸로 작업내역 부분에 SVN 작업 내용도 함께 공유가 된다.

일감에서 추가를 할 때, 공유할 팀원을 선택하면 그 팀원의 이메일로 함께 공유도 된다.


저장소 탭을 클릭해 보면 아래와 같은 SVN 내용이 보이게 된다.

데이터가 Commit 되면 바로 갱신이 된다. 

차이점이나 기타 기능은 직접 만지작 거리다 보면 알게 될 것이다.




6. SVN 데이터 백업(Backup) 및 복원(Restore)


6-1. SVNServer IP 변경 데이터 및 히스토리 보전한 상태로 이동 및 백업

D:\SVNDatas 하위에 있는 ProjectX 폴더의 데이터를 기준으로 하고, 히스토리를 보전한 상태로 복원하는 것을 기준으로 한다.

가장 중요한 IP가 변경되거나 다른 장비로 이동하는 것도 가능하다.


도움말은 아래와 같다.

svnadmin --help create


6-2. 백업(Backup) - Dump

첫번째로 기존 데이터 전체를 백업한다.

D:\SVNDatas안의 ProjectX SVN 데이터를 덤프떠서 현재 D:\SVNDatas 안에 ProjectX.dump를 생성한다.

<Command> D:\SVNDatas>svnadmin dump D:\SVNDatas\ProjectX > ProjectX.dump



프로젝트가 여러개일 경우 프로젝트별로 각각 Dump 뜬다.


6-3. 복원(Restore) - Create, Repository 생성

저장될 Repository를 생성한다. 기본 리비전 0

<Command> D:\SVNDatas>svnadmin create --fs-type fsfs ProjectX



6-4. 복원(Restore) - Load

생성한 Repository안으로 현재 D:\SVNDatas 폴더안의 ProjectX.dump 파일을 밀어 넣는다.

그러면 이전 히스토리도 같이 저장된다.

<Command> D:\SVNDatas>svnadmin load D:\SVNDatas\ProjectX < ProjectX.dump



6-5. Relocate

TortoiseSVN 안의 Relocate를 이용해서 IP 변경을 한 후 SVNServe Manager로 접속하면 잘 되는것을 확인할 수 있음

경로는 신경쓰지 마시길...;;




이것으로 SVN 백업 및 히스토리 복원은 마무리 된다.




7. Bitnami Redmine 데이터 백업(Backup) 및 복원(Restore)


7-1. 백업 전 알아야 할 사항

bitnami를 이용하여 설치한 레드마인 버전 2.6.0-1 기준으로 한다.

C:\Bitnami\redmine-2.6.0-1 여기에 인스톨 한 것을 기준으로 한다.(기본셋팅)

레드마인 버전이 다른 경우는 아래 7-3-5. DB Migration 부분을 참조한다.


Subversion SVN 백업은 바로 위 6항목의 백업하는 방법을 이용해서 별도로 백업해야 한다.


7-2. 백업(Backup)

7-2-1. 구동 서버 Stop

manager tool을 실행시켜 구동되고 있는 서버를 모두 stop 한다.

단, mysql DB는 제외한다.(Apache, Subversion, redmine, remine2 모두 stop)



7-2-2. 첨부파일 백업

아래의 경로에 있는 files 폴더를 폴더 채로 모두 압축해 둔다.

C:\Bitnami\redmine-2.6.0-1\apps\redmine\htdocs\files


7-2-3. DB ID & PW 체크

아래 경로의 database.yml 파일을 메모장으로 오픈해서 DB ID & PW 체크해 둔다.

C:\Bitnami\redmine-2.6.0-1\apps\redmine\htdocs\config\database.yml


database: bitnami_redmine

username: bitnami

password: c8db869edb



7-2-4. ID & PW를 이용하여 SQL 데이터를 백업

아래 경로 mysql bin으로 이동한다.

C:\Bitnami\redmine-2.6.0-1\mysql\bin


그리고, 아래의 내용을 실행한다. (주의사항 : -p 뒤에 바로 붙여서 c8db869edb 패스워드를 입력해야 함)

C:\Bitnami\redmine-2.6.0-1\mysql\bin>mysqldump.exe -u bitnami -pc8db869edb bitnami_redmine > redmine_backup.sql

이렇게 진행하면 redmine_backup.sql 파일이 mysql\bin에 저장되고, 프롬프트가 떨어짐



데이터 백업이 완료 되었다.



7-3. 복원(Restore)

보통 새로운 장비로 이동하는 것을 기준으로 하므로, 새로 인스톨 되는 경로도 역시 C:\Bitnami\redmine-2.6.0-1 로 한다.

password는 XXXXXXXXXX 라 가정한다.


7-3-1. DB ID & PW 체크

새로 인스톨 된 redmine의 database.yml 파일을 메모장으로 오픈해서 DB ID & PW를 체크한다.

C:\Bitnami\redmine-2.6.0-1\apps\redmine\htdocs\config\database.yml


7-3-2. 백업 SQL 파일 복사

아래 경로 mysql bin으로 이동하고, 이 폴더에 redmine_backup.sql 파일을 복사한다.

C:\Bitnami\redmine-2.6.0-1\mysql\bin


7-3-3. 빈 Redmine DB 생성

mysql에 접속해서 빈 redmine용 DB를 생성한다.


C:\Bitnami\redmine-2.6.0-1\mysql\bin>mysql.exe -u bitnami -pXXXXXXXXXX

mysql> drop database bitnami_redmine;

mysql> create database bitnami_redmine;

mysql> exit



7-3-4. SQL 데이터 복원

백업 되어있는 redmine_backup.sql을 이용하여 데이터를 복원한다.

(주의사항 : -p 뒤에 바로 붙여서 XXXXXXXXXX 패스워드를 입력해야 한다.)

C:\Bitnami\redmine-2.6.0-1\mysql\bin>mysql.exe -u bitnami -pXXXXXXXXXX bitnami_redmine < redmine_backup.sql



7-3-5. DB Migration

DB Migration : 상위 버전으로 업그레이드 할 경우에 필요하다.(동일한 버전 복원시는 필요없다.)

백업할 때의 DB 내용은 예전 버전의 DB이므로, 새로운 버전으로 변경해주는 작업이 필요하다.


아래 경로로 이동

C:\Bitnami\redmine-2.6.0-1\apps\redmine\htdocs


ruby의 rake 도구를 사용하여, DB 업그레이드

PATH=D:\Bitnami\redmine-2.6.0-1\ruby\bin;%PATH%

rake db:migrate RAILS_ENV=production

rake redmine:plugins:migrate RAILS_ENV=production


그러면 기존 복원했던 DB의 정보를 모두 현재 버전에 맞게 이전 해주면서 정리된다.


7-3-6. 첨부파일 복원

기존 압축했던 파일을 아래의 경로에 덮어 쓴다.

D:\Bitnami\redmine-2.6.0-1\apps\redmine\htdocs\files 



7-4. 서비스 실행

이제 manager tool을 실행시켜 구동되고 있는 모든 서버를 start 시키면 복원까지 완료된다.




이것으로 Subversion 과 Bitnami Redmine 의 인스톨과 백업 및 복원까지 완료되었다.
이렇게 정리해 뒀으니 나중에 까먹지 않겠지 ㅎㅎ;;

스스로에게 만족 ^^



Posted by 노을삼킨별
,

특이한 프로젝트 관리술이 있기에 아래에서 퍼옴
http://naridy.egloos.com/4652893


개똥으로 유명한 FF14의 리빌딩 프로듀서를 맡고 있는 분의 강연이라 꽤나 현실감 있는 내용이 많습네다



예전에 꽤나 재밌게 봐서 언제 소개 해봐야겠다...고 생각하던 물건인데...

텍스트가 너무 많아서 차일피일 미루다가, 계속 냅두고 있으니 똥 싸고 안 닦은 기분이 자꾸 들어서 말이죠.

그래서 어떻게 대충 정리해서 올립니다.

PPT 위주의 강연이라 PPT 번역이 중요한데, PPT 문서를 내가 새로 베껴 만들긴 귀찮고, 그렇다고 빼자니 의미가 없고, 일본어 파일 그대로 올리기도 뭐하고...

결론은 그냥 PPT 문서 들어가는 위치에 그대로 번역... =ㅠ=

큰 문자로 강조된 부분은 일본어 PPT 문서가 들어가는 부분이니깐, 그 부분 참고해 가시며 읽으시면 될 듯.

아래 뉴스 사이트의 기사를 그대로 번역한 거라, 기자가 직접 강연 들으며 요약한 거니까 얼추 이해는 되겠지만...




[SQEXOC]プロジェクトを失敗させないためには? スクウェア・エニックスで実施されているプロジェクト管理術公開


  10월 8일, 도쿄 신주쿠에서 개최된 「스퀘어 에닉스 오픈 컨퍼런스 2011」에서, 스퀘어 에닉스의 CTO / 테크놀러지 추진부 담당 코퍼레이트 이그젝티브 겸 제너럴 매니저 / 신세대 게임엔진 Luminous Studio 프로듀서 겸 테크니컬 디렉터 / 리얼타임 테크놀러지 데모 Philosophy 프로듀서 겸 통합 디렉터 / FINAL FANTASY XIV 테크니컬 디렉터인 하시모토 요시히사 (橋本善久) 씨에 의한「게임 개발 프로젝트 매니지먼트 강좌」를 다룬 강연이 있었다.

 
  그의 직함에서도 알 수 있듯이 하시모토 씨는 여러 가지 프로젝트를 담당하고 있다. 그런 그에 의해 스퀘어 에닉스에서 실제로 사용되는 프로젝트 매니지먼트 수법이 소개되었다.
 
서두에 하시모토 씨는 「어째서 프로젝트는 실패하는가?」라고 묻고, 프로젝트 실패 포인트를 6종류  들었다. 즉,

ㆍ스코프의 문제 (사양 변경)
ㆍ품질의 문제
ㆍ코스트의 문제
ㆍ시간의 문제
ㆍ리소스의 문제 (멤버 등)
ㆍ비지니스의 문제

다. 이 포인트들이 복잡하게 얽히면서 프로젝트 예정에 오차가 생기기 시작한다.


프로젝트 실패 포인트의 사례

ㆍ예상보다 매상이 적다
ㆍ계획보다도 비용이 더 들었다
ㆍ발매시기가 늦었다
ㆍ발매일을 맞추기 위해 내용이 빠졌다
ㆍ유저의 평가가 나쁘다
ㆍ오작동이 발생
ㆍ개발진의 만족도가 낮고, 고장난 사람이 발생




  위와 같이 프로젝트의 실패라는 것엔 이런저런 경우가 있는데, 강연에선 주로 시간적인 실패에 집중한 이야기가 전개되었기에, 이후 기본적으로 시간적인 문제에만 신경 써서 읽는 편이 알기 쉬우리라.


  본론으로 돌아가자. 그럼 그 오차가 얼마가 되는가, 라고 하시모토 씨는 계산을 시작했다. 상당히 간략화된 예지만, 우선 변동요인을 8개 들어 각각의 분야에서 에러가 발생할 경우 아래 도표와 같이 쌓이기 시작하고, 그 누계가 10배의 오차를 만들어낸다고 지적했다. 2년으로 개발할 예정인 물건이었다면, 20년이 걸린다는 계산이다. 물론 이러한 요인이 죄다 곱절로 돌아오는 상황이 될 리는 없을테지만, 상당히 큰 변동이 생길 가능성이 있는 건 틀림없으리라.


계획의 주된 변동요인
ㆍ스코프의 변화
    -사양의 추가, 변경

ㆍ태스크 분해의 에러 
    - 이미 정해진 사양에 대해 태스크 나눈 게 빠진 게 있을 경우

ㆍ견적 설정의 에러
    - 태스크 소화에 들어가는 시간을 잘못 계산했을 경우

ㆍ하루당 작업시간을 잘못 계산한 에러
    - 회의 같은 것으로 생각한 것보다 작업시간을 확보하지 못한 경우

ㆍ인원계획의 에러
    - 생각보다 인원을 늘릴 수 없다
    - 생각보다 능력이 없다

ㆍ품질 매니지먼트의 에러
    - 품질이 오르지 않으니 다시 만들기

ㆍ기술 매니지먼트의 에러
    - 프로그램적으로 실현이 어려워서 다시 만들기

ㆍ그 밖의 기타 등등...


변동요인별 변화폭의 사례

ㆍ사양 추가로 스코프 변경 → 1.5배

ㆍ태스크 분해의 에러 → 1.4배
ㆍ견적 설정의 에러 → 1.3배
ㆍ하루당 작업시간을 잘못 계산한 에러 → 작업시간 -20% = 1.25배
ㆍ인원계획의 에러
    - 생각보다 인원확보를 할 수 없었다 → -20% = 1.25배
    - 생각보다 능력이 없었다 → -30% = 1.4배
ㆍ품질 매니지먼트의 에러 → 1.3배
ㆍ기술 매니지먼트의 에러 → 1.3배
ㆍ그 밖의 기타 등등...


1.5 × 1.4 × 1.3 × 1.25 × 1.25 × 1.4 × 1.3 × 1.3

≒ 10배!!



  그럼 어떻게 대처하는가? 사양의 축소, 인원추가투입, 개발기간연장, 품질의 타협 등을 해도 아직 부족하다. 최종적으론 노동시간을 대폭 늘리는 것으로 스케쥴에 맞추는 경우가 많은 것은, 소프트웨어 업계 공통의 문제라 할 수 있으리라.
  이러한 비극, 각 항목에서의 견적 판단 에러에 의해 발생하는 것이지만,  「프로젝트의 정확한 예상 따위 불가능하다」라고 하시모토 씨는 이야기한다.



대처 1

사양을 35% 삭제

→ 1.54배의 대책효과



대처 2

인원을 60% 추가투입

→ 1.6배의 대책효과

※물론 인원을 충원한다고 인원수 만큼의 효과가 나는 건 아닙니다만 간략계산으로 가겠습니다.



대처 3

기간을 50% 연장

→ 1.5배의 대책효과



대처 4

품질을 30% 타협한다

→ 1.43배의 대책효과

※품질을 낮춤으로서 작업수를 줄인다는 의미로 계산하고 있습니다.



1.54 × 1.6 × 1.5 × 1.43

≒ 5.64배의 대책효과


음~ 아직도 10배의 대책효과는 내지 못 하고 있습니다




대처 5

1달 노동시간을

160시간에서

290시간으로 한다

→ 1.8배의 대책효과





1.54 × 1.6 × 1.5 × 1.43 × 1.8

≒ 10배의 대책효과


이제야 대책을 세울 수 있게 되었습니다!!



대처 1  사양을 35% 삭제
대처 2  인원을 60% 추가투입
대처 3  기간을 50% 연장
대처 4  품질을 30% 타협한다
대처 5  월 노동시간을 80% 늘린다



아주 멋진 죽음의 행진의 완성입니다.

꽤 자주 보는 풍경 아닙니까?





결국 프로젝트의

정확한 예상 따위

아무도 할 수 없습니다.



  그럼 프로젝트 매니지먼트에 의미가 없는가 하면, 그런 게 아니라 프로젝트는 불확실한 것이라는 걸 전체로 한 프로젝트 관리가 중요하다는 게 하시모토 씨의 설명. 그리고 그는 그 요점을「능동적인 대응」이라고 정의한다. 사전대처형 진행을 함으로서 프로젝트의 제어가 가능하다는 듯 하다.



프로젝트란

불확실한 것이다


라는 사실을 받아들이고 리액티브한

사후대처형(일단 일이 터지면 그때 대처)에서

프로액티브한 사전대처형으로

적응함으로서 프로젝트를 제어할 수 있습니다.




불확실성을 이겨낸다


ㆍ불확실성을 제어하는 방법은 몇 개정도 있습니다

   - 사후대처형

     ㆍ꼬리를 물고 일어나는 문제를 조기발견해, 어린 싹일 때 대처를 한다
          - 이터레이션을 돌린다

   - 사전대처형
     ㆍ불확실성을 줄인다
           - 잘 파악되지 않은 부분의 조사나 검증/실험을 제대로 한다
           - 작업 데이터를 얻어 피드백 해나감으로서 예측정밀도를 올린다
           - 계획규모를 작게 한다
           - 설계를 최대한 자세하게 한다
           - 리스크 높은 요소를 미리미리 최대한 줄인다

     ㆍ불확실해도 좋은 걸 한다
           - 리스크 높은 요소를 없애더라도 성립될 설계를 해둔다



  이렇게 불확실성을 전제로 한 사전대책법으로는

● 불확실성을 줄인다
● 불확실해도 괜찮은 걸 한다

  는 2가지 방향성을 제시했다. 「불확실성을 줄인다」는 것은 프로젝트의 전체 파악을 좋게 해, 견적의 정밀도를 올리고, 처음부터 리스크가 적은 사양으로 만든다는 것. 「불확실해도 괜찮은 걸 한다」는 것은 조금 알기 힘든 것이지만, 강연에선 사양을 정할 때 있어 RPG에서의  「마을」이 사례로 꼽혔다. NPC나 모델링 데이터가 많아 구현이 간단하지 않을 경우, 최악의 상황에선 마을이 없어도 게임의 진행에 문제가 없도록 사양을 정해둔다는 것이다. 이러한 걸 간단히 종합해보면 (흔한 얘기이긴 하지만) 「Agile 방법론을 활용하자」는 게 된다.
 
  애자일 방법론으로는 이런저런 게 있지만, 거의 모든 것에 공통되는 것이 단기간에 소규모개발 iteration (계획 - 설계 - 검증의 반복)을 해나간다는 부분이다. 이 메리트에 대해 예를 들어가며 해설되었지만, 상당히 일반적인 내용이니 여기선 생략한다. 한 마디로 「궤도수정하기 쉽게 한다」는 것이다.
  그럼 이터레이션을 자주, 많이 반복하면 모든 게 해결되는가 하면, 그렇지만도 않다고 한다. 하시모토 씨는 개집을 만드는 것과 고층빌딩을 건설하는 경우를 예로 들어, 대규모개발에선 세밀한 계획을 세워 작업해 가는 게 불가피하다고 설명한다. 완벽한 설계와 사양책정을 한 뒤 개발을 시작하는 수법이, (이터레이션이 필요한 경우가 많은) 폭포수 형태 개발인 관계로, 공업분야에서는 상식적인 것인데 소프트웨어 개발에선 어째서인지 소홀시되고 있다고 한다. 대규모개발에서 애자일 방법론을 활용한다고 해서, 폭포수 형태에 필요한 세밀한 조사ㆍ설계ㆍ계획으로부터 자유로워지는 것은 아니라는 걸 강조했다.

  이후엔 스퀘어 에닉스 테크놀러지 추진부에 도입되어 있는 프로젝트 매니지먼트 수법의 해설이 행해졌는데, 대규모개발에서의 개발 세부에 스크럼을 베이스한 것이라 생각되는 애자일 방법론을 융합한 독특한 것이었다.


  하시모토 씨는 프로젝트 매니지먼트의 요점으로서 아래 4개를 들며, 이번엔 계획과 제작 부분에 맞춰 스퀘어 에닉스의 대처방법을 소개하며 대규모 게임개발 프로젝트의 진행법에 대해 해설했다.


 
프로젝트 매니저먼트의 요점

ㆍ조사한다
ㆍ설계한다
ㆍ계획한다

    - 태스크를 뽑아낸다
    - 견적설정을 한다
    - 우선도를 정한다
ㆍ제작한다 (이터레이션을 돌린다)
    - 스프린트, 아침회의, 태스크 관리 보드, 태스크 관리 시트
    - 정기적으로 돌아보며 문제를 조기발견
    - 정책을 조율한다
        ㆍ설계의 수정 (게임사양, 아트, 프로그램 등의 수정)
        ㆍ계획의 수정 (태스크 추가 및 변경, 견적의 변경, 우선도의 변경)
        ㆍ리소스의 수정 (인원의 추가나 포지션 변경 등)

  업무의 열거에는 유저 스토리를 기반으로 항목을 만들어간다.
  「유저 스토리」란 「게임에서 실현하고 싶은 걸 문장으로 표현한 것」으로, 특징으로는 어미가 「할 수 있다」로 되는 게 많은 것. 요점이라면 빼먹는 부분이 없는 게 중요하며, 내용적으로는 중복되는 건 상관없으니 가능한 많은 요소를 뽑아내야 하는 듯 하다. 많은 사람이 리스트를 갖고 가져오면 마인드맵 툴 등을 이용해 종합하면 된다고.


유저 스토리란? ①

ㆍ그 소프트웨어 (게임 포함) 에서 표현하고 싶은 걸 「문장으로」 표현한 것입니다
ㆍ유저 스토리와 도해를 조합해 「사양서」로 사용해도 좋습니다
ㆍ일례

    - 100km 공간의 필드를 자유롭게 산책할 수 있다
    - 플레이어도 적도 건물을 파괴할 수 있다
    - 플레이어는 라이프가 0이 되면 죽어서 리스타트 포인트로 귀환한다
    - 적 캐릭터는 50명 동시에 화면에 등장한다
    - 플레이어는 포복 전진해서 좁은 틈새를 빠져나갈 수 있다
    - 연막은 캐릭터를 비틀거리게 하는 움직임을 시킨다
    - 스위치를 밟으면 문이 열린다


  이어서 「피쳐」라는 것은 유저 스토리를 실현하기 위해 제작해야만 하는 기능 등을 열거한 것이다. 「~~ 시스템」 등의 명사형이 되는 경우가 많다고 한다. 작업상으론 큰 작업 덩어리로서 취급되며, 똑같은 피쳐로 복수의 유저 스토리를 실현하는 경우도 적지 않다고 한다.



피쳐란? ①

ㆍ제작할 기능이나 대상을 의미합니다
ㆍ유저 스토리를 분해하며 열거합니다
ㆍ○○ 기능, ○○ 시스템 등의 「명사로 끝나는」 경우가 많습니다
ㆍ일례

    - 라인 묘화 기능
    - 플레이어의 점프
    - 플레이어의 포복 전진
    - 화염공격
    - 메모리 관리 시스템


피쳐란? ②

ㆍ「커다란 태스크」라 말해도 좋습니다
ㆍ각각의 스토리를 분해해 보면, 똑같은 피쳐가 나오는 게 보통입니다


  피쳐를 개인의 개인의 작업단위로까지 분할한 것을 「태스크」라 부른다. 하루에 1, 2 태스크를 할 수 있는 작업량이 될 때까지 분해해간다. 다만 모든 작업을 일괄적으로 태스크로 분할한다는 것은 현실적이지 않기 때문에, 태스크 분할은 작업을 진행해 가며 LOD(Level of Detail)적으로 해가면 된다고.
 

태스크란?

ㆍ각 멤버가 작업을 하는 관리 단위입니다
ㆍ피쳐를 분해한 것입니다
ㆍ하루 당 1 ~ 2 태스크 정도의 사이즈까지 분해합니다
ㆍ일례

    - 스코어 표시의 페이드인, 페이드아웃 처리
    - 포복 전진 모션
    - 문 열고 닫기


  자 그럼, 이 태스크를 실제로 진행해가는 작업은, 태스크의 열거(태스크 분할시 끝나있음), 태스크의 견적, 태스크에 우선도를 매긴다는 3단계로 이뤄지며, 태스크에 우선도를 선정한 시점에서 이미 스케쥴이 만들어지는 것이라고 하시모토 씨는 설명했다.
 
  우선 견적에선 1점 견적 설정과 2점 견적 설정이 있다고 소개한 뒤 2점 견적내기의 메리트를 해설했다. 1점 견적 설정이란 「마감은 4일 뒤」란 느낌으로 마감기한을 설정하는 것. 2점 견적 설정은 「마감은 빠르면 3일 뒤, 최악의 경우 5일 뒤」란 느낌으로 기간을 설정해두는 타입을 가리킨다.
 
  1점 견적 설정이라면 일단 완성이 될 경우 그 이상의 작업을 하지 않지만(파킨슨 법칙), 마감 아슬아슬할 때까지 손을 안 댄다(학생증후군), 일단 마감을 넘겨버리면 그 뒤는 아무리 늦어도 같은 거라 생각한다(뜨거운 걸 삼키면 잊어버리는 법칙)이라는 문제가 발생하기 쉽다고 한다.
 
  2점 견적 설정이라면 심리학적으로 제시되는 문제는 둘째 치고, 통계적으로 대략 4일 정도면 완성되는 경우가 많다는 듯 하다. 참고로 2점 견적 설정의 마감 설정은, 각각 확률 20% 정도로 설정하면 좋다고 한다. 「굉장히 순조롭게 진행되면 3일이면 되겠지만, 그 확률은 20% 정도겠지」 「잘 안 풀리면 5일은 걸릴지도. 이럴 확률 20% 정도」는 느낌으로 견적 설정을 하는 것이다.



1점 견적 설정의 문제점과
2점 견적 설정의 메리트

ㆍ작업일수의 견적 설정은 하나의 태스크에 대해 하나의 마감일로 설정하는 1점 견적 설정이 일반적
ㆍ하지만 이 방식은 문제나 단점이 많다

    - 파킨슨 법칙
    - 학생증후군
    - 뜨거운 걸 삼키면 잊어버리는 법칙
ㆍ2점 견적 설정은 심리적인 작용도 포함해 스케쥴 실적 정밀도가 향상되는 마법의 방법



  처음에 언급된 프로젝트의 오차를 적게 해 궤도수정을 빠르게 한다는 목적을 생각해보면, 이러한 견정 성정 부분의 정밀함이 매우 중요해진다는 건 간단히 이해할 수 있다. 어떻게 이 부분의 정밀도를 올리느냐에 대해선, 재밌는 방법이 사용되고 있었다. 담당자와 상관을 비롯한 몇 명이 「견적 포커」라고 불리는, 마감날짜가 적힌 카드를 갖고 모여 각자가 적당하다고 생각되는 2점 견적 설정 날짜를 동시에 제출한다는 듯 하다.
 
  당연히 서로가 생각한 마감일이 다르게 튀어나오겠지만, 어째서 기간이 더 필요하다고 생각하는가, 어째서 기간을 단축할 수 있다고 생각하는가 등에 대해서 의견을 교환한 뒤, 다시 마감일을 적은 카드를 펼친다. 이걸 몇 번 반복하면 마감 기간이 타협되기 시작하고, 태스크를 반복해가면서 정밀도도 올라가게 된다고 한다.

스퀘어 에닉스 명물 「견적 포커」용 카드
 
  견적을 통해 스케쥴이 나온 단계에서 실제 제작에 이행한다. 그리고 개발 부분의 이터레이션에 대해선, 「스프린트」라는 스크럼용어가 사용되고 있다. 


스프린트

ㆍ4주일 고정인 이터레이션 기간
ㆍ휴일 같은 게 있으니 대략 18 ~ 20 영업일
ㆍ스프린트 첫날은 해당 4주일 분량의 태스크를 중장기 태스크 리스트 (견적 설정 완료) 에서 가지고 옵니다
ㆍ태스크 분해나 견적 설정의 정밀도가 대충일 경우엔 이 시기에 세밀하게 정리합니다
ㆍ스프린트 최종일엔 데이터 분석 등을 하며 돌아 봅니다


  하시모토 씨가 사용하는 수법에서의 스프린트 기간은 4주일로 고정된 듯 하며, 일반적인 애자일 방법론을 생각하면 길게 느껴지는 경향이 있다. 스프린트 첫 날엔 태스크나 견적 설정의 세분화 등을 하며, 마지막 날엔 그 과정을 돌아본다. 매일 아침 회의에서 시작해, 하루 단위, 주 단위의 계획을 세우는 등, 스프린트 기간은 짧지만 상당히 세부적으로 매니지먼트되고 있다. 스프린트의 끝에 성과물 발표회가 치뤄지게 되지만, 성과물이라는 형태로의 발표가 없는 경우도 있다고 한다. 애자일 방법론에 따르면 반드시 성과물을 내는 걸 중시하도록 되어 있지만, 이 부분은 유연한 구성을 한 듯 하다. 


계획에 대하여

ㆍ마일스톤 계획 (중장기 계획)
ㆍ매 스프린트 계획

    - 목표성과물의 계획
    - 스프린트 첫 날에 그 스프린트의 태스크 계획
ㆍ매주의 계획
    - 월요일 아침회의에 그 주의 태스크 계획
ㆍ매일의 계획
   - 매일 아침회의에 해당 일의 태스크 계획


견적 설정 정밀도

ㆍ(현재의 실적 - 최소 견적) / (최대 견적 - 최소 견적) × 100 = 견적 설정 정밀도
ㆍ견적 설정 정밀도의 평균이 0%에 가까울 경우, 또는 0%를 밑돌 경우 → 견적 설정이 어설프니 다음 스프린트부터 견적 일자를 약간 타이트하게 수정
ㆍ견적 설정 정밀도가 100%에 가까울 경우, 또는 100%를 넘어선 경우 → 견적 설정이 너무 타이트한 거니 다음 스프린트부터 견적 일자를 조금 너그럽게 수정
ㆍ견적 설정 정밀도는 40 ~ 50% 정도로 유지하는 편이 이상적
ㆍ30% 이하를 녹색, 30 ~ 70%를 노란색, 70% 이상을 빨간색으로 해 태스크 관리 보드 위의 포스트잇에 표기해둔다



  태스크의 진행상황은 게시판에 포스트잇을 사용해 태스크 관리 보드에서 일람할 수 있도록 했다고 한다. 견적 기간에 대해서도 빨리 끝난 것은 파란 포스트잇, 통상적인 것은 노란 포스트잇, 늦은 것은 빨간 포스트잇을 사용한다는 느낌으로 한 눈에 상황을 알 수 있다. 다른 회사의 매니지먼트 사례에서도 보드를 사용하는 경우는 많지만, 이런 부분에서 굳이 전자화 하지 않는 것이 일반적인 듯다.


되돌아보기

ㆍ매일 돌아보기
    - 아침회의
ㆍ매주 돌아보기
    - 주간보고
ㆍ매 스프린트 중간 돌아보기
    - 스프린트 중간보고
ㆍ매 스프린트 돌아보기
    - 스프린트 보고
ㆍ프로젝트 돌아보기


태스크 견적 설정 미스와 작업 열거 누락

ㆍ계획의 오차엔 두 가지 요소가 있으며, 구별할 필요가 있다
    - 수치 견적  미스
    - 작업 열거 누락

ㆍ수치 견적 미스는 2점 견적 설정을 대처할 수 있다
    - 견적 버퍼
         ㆍ최대 견적과 최소 견적의 차이 합계를 시간적 버퍼라고 본다

ㆍ작업 열거 누락엔 전용 버퍼를 준비
    - 피쳐 버퍼
         ㆍ작업 내용의 추가전용기간을 설정해 둔다



  이렇게 프로젝트 매니지먼트를 도입한 결과로서는 역시 프로젝트의 전체 파악이 쉬워졌다는 것이나 궤도 수정이 간단해졌다는 것 등을 들었다. 참가 멤버도 잔업의 프레셔에서 해방되어 멘탈적인 부분에서도 좋은 영향을 보였다고 한다.

  이번에 소개된 수법은 하시모토 씨의 독자적인 방법이지만, 자세한 내용에 대해선 하시모토 씨가 현재 책을 낼 준비를 하고 있으니 흥미가 있는 사람은 기다려 보자.



프로젝트 매니지먼트를 하며 얻은 효과

ㆍ불확실성을 제어
    - 전체파악이 된다
    - 조기에 문제 발견
    - 계획수정도 쉽다

ㆍ멘탈 효과
    - 자신의 작업과 기간이 파악되어 근거는 없지만 잔업을 해야만 할 거 같다는 프레셔에서 해방됨 → 잔업, 주말출근이 줄어듬
    - 서로의 업무를 알게 됨
    - 즐거워진다


 
  이번 강연에선 프로젝트 관리의 중요성과 애자일 방법론의 유효성에 대해 소개되었지만, 약간 소화불량인 듯한 사람이 있을지도 모른다.
 
  약간 심술궂은 시점으로 바라보자.
 
  초반에 제시된 사례와 같이 100명의 인원이 필요하다 견적나온 것이, 파국을 맞이해 나중엔 결국 1000명짜리 프로젝트가 되었다는 사례가 있을 경우, 그 1000명짜리 프로젝트의 성과물과 제대로 된 프로젝트 매니지먼트로 완성된 100명짜리 성과물이 과연 똑같은 것인가?는 의문이 남는다. 물론 다른 물건이 나오는 게 보통이다. 일반적인 소프트웨어 산업의 경우, 사양만 만족시키면 프로젝트는 성공하게 되지만, 게임업계의 경우 꼭 그런 것만도 아니다.
 
  만약 최종적인 성과물이 똑같은 것이 된다면, 아마도 들어간 코스트도 거의 동일. 마감지옥일 때도 산더미 같은 잔업을 회피하는 행복한 매니지먼트라면, 개발기간이 당연히 늘어나게 될 텐데 이건 용서받을 수 있는 것일까? 초반 사례에서 80% 늘어난 노동시간 대신, 180%의 작업효율이 나온 것일까?
  80%는 어쨌든 작업효율 자체는 아마도 향상되었으리라 생각하지만, 매니지먼트 수법의 도입으로 의해 늘어나는 작업량이라는 것도 존재한다. 앞서 이야기한 것처럼 잔업 없이 만들면 다들 까먹게 될 무렵 게임이 완성되는 스케쥴이 될 가능성도 있다. 또한 사양에서 리스크를 철저히 배제하면서 개발하면, 별로 획기적인 부분이 없는 게임이 만들어진다는 건 굳이 이야기하지 않아도 되리라.
 
  그럼 이렇게 시시콜콜하게 하는 프로젝트관리에 의미가 없는가 하면, 그렇지는 않다. 큰 리스크를 회피하기 위해선 매우 실용적이며, 프로젝트의 파악을 쉽게 하는 것도 중요한 일이다. 그리고 더욱 개발효율을 올리는 방법과 리스크가 높은 개발이 용납되는 부분이 더해짐으로서 프로젝트 관리는 큰 의미를 갖게 된다. 즉, Luminous Studio의 개발과 연구개발부분의 존재이유이다.
 
  Luminous Studio에 의해 고품질의 게임이 적은 노동력으로 만들어질 것이 기대받고 있다. 그리고 사운을 건 대형 타이틀에 신규개발기술을 잔뜩 직업넣으려고 하는 건 무모하므로, 연구개발부분에서 기술적인 부분을 파악해가며 장차 도입해간다는 흐름이 되면, 적은 리스크로 대형 프로젝트를 진행하는 것도 가능해지리라. 현재 스퀘어 에닉스는 이러한 부분을 잘 활용함으로서 게임개발체제를 근본부터 바꿔가려 하고 있다고 보여진다. 실제로 이러한 매니지먼트가 효과를 발휘하는 것은 좀 더 시간이 걸릴 지도 모르지만, 빛을 보게 되면 일본게임업계에 있어 혁명적인 일이 되리라. 스퀘어 에닉스의 앞으로 동향에 주목하고 싶다.
 
 


끄, 끝났다...

저도 쪼렙이다 보니 프로젝트 매니지먼트라는 좀 큰 업무는 잘 몰라서 이것저것 찾아보며 번역했습니다.

나름 공부 되었네요.

어쨌든 꽤 괜찮은 강연이었으니, 일본어가 되시는 분은 스퀘어 에닉스에서 직접 올린 해당 강연의 PPT 문서를 직접 보시는 것도 좋을 듯 합니다.


http://www.square-enix.com/jp/info/library/dldata/PM/PM.pdf


.............300페이지 좀 안 되는 분량이지만, 문자가 큼직큼직해서 볼 만 합니다. =ㅠ=

그러고 보니 FF14 리빌딩이 끝나서 내년 1월부터 유료로 서비스한다고 하던가?

이러한 강연하는 사람이 어떻게 게임을 다시 만들었을지 좀 궁금하긴 하군요. ㅎㅎ

오늘의 짤방. 옛날 게임처럼 우당탕 만드는 게 안 통하는 시대라 관리하는 게 큰일이죠, 요즘 시대는
Posted by 노을삼킨별
,

아래에서 퍼옴
http://blog.naver.com/chizeta?Redirect=Log&logNo=100071508252


VC 8.0 런타임 (vcredist) 패키지 몰래 인스톨하기


얼마전에 비주얼 C++ 8.0 런타임 재배포 셑업 패키지의 사일런트 설치 (몰래 설치) 옵션에 대해 포스팅을 했다. (원문의 번역임에 주의) 이 포스팅을 썼을 때, 난 비주얼 스튜디오 2005를 설치하여 깔리는 %ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Packages 디렉토리에 있는 버전의 vcredist_x86.exe, vcredist_x64.exe, vcredist_ia64.exe 의 명령행 옵션을 기준으로 작성했었다.

그러나, 한 고객이 얼마전에 내가 모르던 점을 알려주었다. 웹으로 다운로드할 수 있는 VC 런타임 재배포 패키지 스탠드얼론 버전은 좀 다르게 패키징 되어 있어서, 이전 포스팅에서 설명한 몰래 설치방법의 명령행 옵션이 먹지 않는다. 즉, 스탠드얼론 버전은 EULA를 먼저 보여주고 실제 실행되는 메인 셑업 패키지가 풀려 실행되도록 한 겹 더 싸여있다. 비주얼 스튜디오 2005에 포함된 패키지는 두겹으로 싸여있지 않았다.

그래서, 여기 수정된 VC 8.0 런타임 재배포 패키지에 대한 몰래 설치법이 있다. 비주얼 스튜디오 2005에 포함된 패키지를 사용한다면, 이전 포스팅의 명령행 스위치를 사용해도 된다.

하지만, 스탠드얼론 VC 8.0 재배포 패키지를 다운로드 했다면, 명령행 옵션을 조금 바꿔야 한다. 아래 명령으로 오리지널 스탠드얼론 VC 8.0 재배포 패키지를 설치할 수 있다.

  • For x86: vcredist_x86.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
  • For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
  • For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "

아래 명령으로는 비주얼 스튜디오 2005 SP1 스탠드얼론 VC 8.0 재배포 패키지를 설치할 수 있다.

  • For x86: vcredist_x86.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
  • For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
  • For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "

VC 런타임 패키지를 언어텐디드 모드 (작은 프로그레스바를 보여주지만 사용자 인터렉션은 요구하지 않는 모드)로 설치하려면, /qn 스위치를 /qb로 바꾸면 된다. 프로그레스바가 취소 버튼을 보이지 않길 원한다면, /qn 스위치를 /qb!로 바꾸어 주면 된다.

http://blogs.msdn.com/astebner/archive/2007/02/07/update-regarding-silent-install-of-the-vc-8-0-runtime-vcredist-packages.aspx

Update regarding silent install of the VC 8.0 runtime (vcredist) packages

A while back, I posted this item on my blog that describes optionsfor silent installation of the Visual C++ 8.0 runtime redistributable setup packages.  When I investigated this issue and wrote that blog post, I based the command line parameters on the versions of vcredist_x86.exe, vcredist_x64.exe and vcredist_ia64.exe that are included in the directory %ProgramFiles%\Microsoft Visual Studio 8\SDK\v2.0\Bootstrapper\Packages when installing Visual Studio 2005.

However, a customer recently alerted me to an issue that I wasn't aware of previously.  The standalone versions of the VC runtime redistributable packages that are available for download via the web are packaged differently, and so the command lines that I previously documented for silent installation will not work with those versions of the packages.  Essentially, the standalone versions are wrapped in a second self-extracting EXE that displays a EULA before allowing extraction and execution of the main setup package, whereas the packages included as part of Visual Studio 2005 directly launch setup and are not doubly wrapped.

Therefore, here are some amended silent install instructions for the VC 8.0 runtime redistributable packages.  If you are using the packages included as a part of Visual Studio 2005, you can continue to use the silent install switches from my previous blog post.

However, if you have downloaded the standalone VC 8.0 redistributable packages, you will need to modify the command lines slightly.  The following command lines can be used to install the original release of the standalone VC 8.0 redistributable packages:

    * For x86: vcredist_x86.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
    * For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
    * For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "

The following command lines can be used to install the Visual Studio 2005 SP1 release of the standalone VC 8.0 redistributable packages:

    * For x86: vcredist_x86.exe /q:a /c:"VCREDI~3.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
    * For x64: vcredist_x64.exe /q:a /c:"VCREDI~2.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "
    * For ia64: vcredist_ia64.exe /q:a /c:"VCREDI~1.EXE /q:a /c:""msiexec /i vcredist.msi /qn"" "

If you would like to install the VC runtime packages in unattended mode (which will show a small progress bar but not require any user interaction), you can change the /qn switch above to /qb.  If you would like the progress bar to not show a cancel button, then you can change the /qn switch above to /qb!

출처 : http://secuprint.tistory.com/entry/vcredist-몰래설치

 


 

Posted by 노을삼킨별
,



아래에서 퍼옴
http://kiho.egloos.com/2785161


화면에 보여줄 내용을 백버퍼 대신 사용자가 지정한 서피스(Surface)에 그리게 하는 기능이다.

IDirect3DDevice9 의 함수중에 쓸것은..

CreateRenderTarget
SetRenderTarget
GetRenderTarget

CreateRenderTarget으로 surface를 만든다.
GetRenderTarget으로 원본 백 버퍼를 가져와 보관하고...
SetRenderTarget으로 위에서 만든 서피스를 지정한다...
그 후
BeginScene, EndScene으로 원래 하던 렌더링을 한다..
그 내용이 지정한 서피스안에 들어가게 된다..
그 후 SetRenderTarget으로 원래 백 버퍼를 복구시키고..

이 과정에서 얻은 서피스의 내용을 텍스쳐로 옮겨서
그대로 화면에 렌더링한다.. (안 그러면.. 당연히 그 프레임에는 아무것도 안나오게된다.... 서피스에만 그렸으니까)


CreateRenderTarget 함수를 쓰지 않고
RenderTarget옵션을 줘서 CreateTexture를 호출하여 텍스쳐를 바로 만들어도 된다...
대신 D3DPOOL_DEFAULT 옵션만을 지원하므로.. 귀찮은 점이 있다.. (D3DPOOL_MANAGED 가 편하다..)

나는 요청이 들어올때 마다 캡쳐를 하여 새로운 텍스쳐에 복사하도록 코딩하였다..

밑은 내가 작성한 코드를 정리한것이다.


LPDIRECT3DSURFACE9 originalTarget; // 백 버퍼
LPDIRECT3DSURFACE9 capturingTarget; // 캡쳐된 내용이 들어갈 서피스
device->GetRenderTarget(0, &originalTarget); // 가져온다..(백업?)

// 백 버퍼와 같은 속성으로 렌더타겟을 만든다.
D3DSURFACE_DESC desc;
originalTarget->GetDesc(&desc);
device->CreateRenderTarget(desc.Width, desc.Height, desc.Format, 0, 0, TRUE, &capturingTarget, NULL);

// 렌더타겟 설정후 그림.
device->SetRenderTarget(0, this->capturingTarget);
device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0);
device->BeginScene();
// 그릴 내용이 여기에..
device->EndScene();

// 여기서 텍스쳐를 만들어 캡쳐된 서피스의 내용을 복사한다...

// 원래대로 되돌린다.
device->SetRenderTarget(0, originalTarget);
device->BeginScene();
// 위에서 만든 텍스쳐를 전체화면에 그림.. 혹은 맘대로..
device->EndScene();
device->Present(NULL, NULL, NULL, NULL);

capturingTarget->Release(); // 다 쓴 건 release....

아 실제로는.. capturingTarget은 한번 만들고 계속 쓰게 했다.. 마지막에 release하고..


Posted by 노을삼킨별
,

아래에서 퍼옴
http://mwultong.blogspot.com/2008/01/kb-mb-gb-tb-pb-convert.html



컴퓨터에서 디스크, 메모리, 파일 등의 용량을 표현할 때에는: 바이트(Byte), 킬로바이트(KB), 메가바이트(MB), 기가바이트(GB), 테라바이트(TB), 페타바이트(PB) 단위를 사용합니다. 그 단위들을 상호 환산하는 계산기입니다.

1KB = 1024 Bytes (Default/기본값)
1KB = 1000 Bytes

바이트 입력     : Bytes

킬로바이트      : KB
메가바이트      : MB
기가바이트      : GB
테라바이트      : TB
페타바이트      : PB

킬로바이트 입력 : KB

바이트          : Bytes
메가바이트      : MB
기가바이트      : GB
테라바이트      : TB
페타바이트      : PB

메가바이트 입력 : MB

바이트          : Bytes
킬로바이트      : KB
기가바이트      : GB
테라바이트      : TB
페타바이트      : PB

기가바이트 입력 : GB

바이트          : Bytes
킬로바이트      : KB
메가바이트      : MB
테라바이트      : TB
페타바이트      : PB

테라바이트 입력 : TB

바이트          : Bytes
킬로바이트      : KB
메가바이트      : MB
기가바이트      : GB
페타바이트      : PB

페타바이트 입력 : PB

바이트          : Bytes
킬로바이트      : KB
메가바이트      : MB
기가바이트      : GB
테라바이트      : TB



주의: 자바스크립트의 한계 때문에, 거대한 숫자의 경우 오차가 다소 있습니다. 예를 들어, 1024 PB 는 정확히 1152921504606846976 바이트이지만, 1152921504606847000 바이트로 표시됩니다. 24바이트의 오차가 발생했습니다.


bps kbps Mbps Gbps Tbps 를, KB/s MB/s GB/h 로 변환하기:
▶▶ bps kbps Mbps Gbps Tbps, 데이터 전송속도 계산기 Calculator





Posted by 노을삼킨별
,

아래에서 퍼옴

http://chulin28ho.egloos.com/5272883#5272883_1

아이쿠 예예. 좀 어려웠죠.
저번 시간이 살짝쿵 어려웠을 겁니다.
알파 채널의 '개념' 은 익숙해지지 않으면 잘 안 생기는 개념이라, 그걸 응용까지 하려면 확실히 이해하기 힘들죠.

자아 저번 시간에 이어서, 이번에도 개악마 알파 블렌딩과 싸우기 위한 기술을 알아보는 시간입니다.
저번 시간에는 알파 블렌딩과 테스팅을 적절히 사용하여 개악마 알파 블렌딩의 횡포를 줄이는 법에 대해 알아보았습니다
이번엔 좀 다른 방법으로 개악마 알파 블렌딩을 잡으러 레이드 뛰어 보기로 하죠.

자 , 1강과 2강에서의 Z 값 Read / Write에 대해 기억 나십니까?

이런 그림이 있으면 그려지기 전 자신의 Z 값을 보고, 자신보다 앞에 있는것이 있는지를 읽는(Read) 다고 했지요.

그리고 자신보다 앞에 있는게 없어지면 자신의 Z 값을 다시 쓴다(Write) 고 했었습니다.

네에 이것은 확실한 렌더링의 기본 신조. 꼭 지켜야 하는 내용이었습니다. 안지키면 안되는 법전 같은 것이었지요.

그렇지만, 이것을 조작할 수 있지 않을까요? 뭔가, 조작하면 뭔가, 뭔진 잘 모르겠지만,
하여간 뭔가 일어날 수 있지 않을까요?
뭔가 , 뭔가 말입니다.
Z Read와 Z Write을 맘대로 조작해 보잔 말입니다.

 
1.     Z Read = Off     Z  Write = On

자아. 만약 오브젝트를 찍을 때, Z Read를 안하고 Z Write를 한다면 무슨 일이 일어납니까?
으으음.. 머리가 좀 아프지만, 고민해 보자면...

Z Read는 왜 하는 것입니까? 자신의 앞쪽에 누가 있는게 아닐까 - 라고 검사하는 짓을 안한다는 말이지요?
즉 '나는 내 앞에 누가 있건 그냥 그려 버리겠다' 라는 겁니다 !

그러면서 Z Write는 하니까, '그대신 내 뒤의 놈들은 내 Z 값을 인식해서 내 앞에 오는 일이 없도록 하여라' 라고 하는 것입니다.
우왕 이기적이네요. 나는 맘대로 그리겠지만 너는 그러지 말아라 라고용?
(하지만 뭐 자신과 똑같은 Z 옵션을 가진 놈이 뒤에 오면 똑같이 무시되겠지만)

자 그림으로 찬찬히 풀어보도록 하죠.

오랫만에 봅니다. 지금 저 plan이 그려졌습니다. plan은 4의 깊이에 있고 Z read와 Z write 를 했습니다. 그래서 화면에 씌여진 Z값은 현재 4의 상태입니다.


 

그리고 주전자가 이렇게 나중에 그려졌습니다. 분명히 주전자는 뒤에 있습니다. Z 값으로 따지면 말이죠.
그렇지만 이 주전자는 Z Read가 Off 되어 있습니다. 즉 Z Read 과정을 하지 않도록 되어 있습니다.
그럼 나중에 그려진 이 주전자는, 그리긴 그려야 겠고, 기존에 있는 Z 값을 읽지 않기 때문에, 아무 생각없이 그려버리게 됩니다.
마치 저 plan 앞에 있는 것 처럼 말이죠.


 

즉 이렇게 보이게 됩니다. 분명히 주전자는 뒤에 있는데도 불구하고 앞에 보이게 되는 기현상이 일어나게 됩니다.

이번엔 그 상태에서 Z 값을 Write를 합니다.하지만 화면이 비어있으면 모를까 지금처럼 자신보다 더 앞의 Z 값이 잔뜩 있는 이 상황에서는 어차피 씌여지지 않으니 이 과정은 무의미합니다.
즉 Z Read를 Off 해 버리면, 앞에 뭐가 있건 무조건 자기가 그릴 타이밍에 그려 버립니다.
무식한 녀석이지요.

특별히 이 녀석을 동영상으로 보면 다음과 같습니다.

훌륭하다 멀티미디어

그렇지만 이 녀석이 앞에 있으면 문제는 달라지는데, 이 녀석 뒤쪽에 일반적인 오브젝트가 그려지면,
 


 

이번엔 또 그려지는 순서와는 상관없이 아주 정상적인 오브젝트처럼 앞뒤가 결정된다는 것입니다.
왜냐면 이녀석은 Z read는 안하지만 write는 해 놨기 때문이지요.


 

이런 무식한 녀석을 어디다 쓸 수 있을까요? 남들보다 무조건 앞에 그려버릴 일이 세상에 어디 있을까요? 그러면서 자기 Z 값은 쓰기 때문에, 자신보다 나중에 생기는 일반적인 오브젝트는 자신의 뒤로 가려져야만 합니다.


전혀 쓸모없을 것 같군요. 물론 좋은 점도 있습니다. 자신의 앞 쪽에 무슨 Z 값이 있건 없건 자신은 무조건 그려 버리기 때문에,
알파 블렌딩을 사용할 때 나오는 짤림 현상이 일어나지 않습니다.


 


이런 현상은 더이상 일어나지 않습니다

그래서 이펙트 담당자들이 이 기능을 쓰고자 하는 유혹을 자주 느낍니다. 이펙트만 놓고 뷰어에서 봤을 때, 짤림 현상이 없이 잘 나오거든요!!! 그래서 잘 되었구나.. 라고 생각한 채 게임에 넘기면, 이번엔 게임에서 이런 현상이 나타나게 됩니다.


 

네에. 기둥이나 다른 캐릭터, 건물 등을 뚫고 이펙트가 보이게 된다는 거지요. 위의 경우는 기둥을 뚫고 이펙트가 보이는 현상인데, 만약 기둥이 이펙트보다 나중에 그려졌다면 아무 문제가 없지만 '불투명한건 반투명보다 나중에 그린다' 는 원칙에 따르면 저렇게 보일 수 밖에 없는 것입니다. OTL
이펙트면 그나마 낫지요. 머리카락 같은거였다면 난리가 납니다. (얼굴을 뚫고 그려지는 머리카락들...)
네 실패입니다. 이 방법은 알파 블렌딩에 맞지 않습니다.


하지만 정말로 이 기능이 필요가 없느냐? 만약 이 기능을 쓴다면 이런 데 쓸 수 있을겁니다
바로 인터페이스!
인터페이스야말로 모든 게임의 오브젝트의 위에 그려져야만 하고, 그리는 순서를 바꿔줌에 따라 맨 앞에 나와야만 하는 것이므로, 이 옵션에 가장 잘 맞는 데이터입니다.
사실 뭐 게임에서는 굳이 Z 값을 이렇게 안해줘도 프로그래머들이 알아서 처리해 주곤 하지만 말이죠.


 

2.     Z Read = On     Z  Write = On

아... 이건 뭐 여태까지 5강동안 설명해 온 것이지 않습니까?
이게 기본이자 진리입니다. 알파 블렌딩이고 테스팅이고 불투명이고 사실은 이걸 써야만 합니다.
이게 안되니까 다른 짓을 하는 겁니다 지금. 하하하.

3.     Z Read = Off     Z  Write = Off

자, 둘 다 꺼버렸습니다 !! ㄷㄷㄷ
일단 슬쩍 생각해도 뭔가 정상적이지는 않을 것 같습니다.

차근차근 생각해 보지요. 뭔 일이 일어나겠습니까?
일단 Z read를 하지 않습니다. 즉. 1번과 같이 자신이 그릴땐 아주 소신있게 그려버리는 녀석입니다.
자신의 앞에 뭐가 있건 상관 안합니다.
"사나이 앞길을 막지 마라!" 이것이 Z read Off 입니다.

그런데 이번엔 Z write도 하지 않습니다! 이건 뭥미?
Read는 하지 않고 Write는 하면 인터페이스처럼 사용가능하다고 했습니다. 즉 자신의 뒤에 그려지는 녀석은 자신의 뒤에 가려집니다.
그렇지만 Write도 하지 않으면, 자신보다 나중에 그려지는 녀석이 Z read를 해 보니까, 자신의 앞에 아무것도 없다고 나오게 됩니다!!!! Z 값을 아무도 안 써 놨으니까요!!!!

자신보다 늦게 그려지는 놈한테 덮여집니다!!! 아아 괴이합니다!!!!

다시 한 번 설명하지요.


 

이런 상태에서


 

이렇게 주전자를 나중에 그려도,


 

주전자가 앞에 그려진다는건 똑같습니다.


 

근데 이 주전자가 앞에 있는 상태에서,  나중에 뒤에 있는 공이 그려진다면?


 

그렇다면 나중에 그려지는 공은, Z 를 read하려고 시도하겠지만, 주전자가 Z 값을 Write 해 놓지 않았기 때문에
공 입장에서는 앞에 아무것도 없다고 인식하게 될 것입니다.
그러니 나중에 그려진 공이 기존의 주전자를 덮어버리겠지요.

아아 괴이합니다. 이거야말로 괴이합니다. 정말 쓸모가 없게 생겼군요.
생각하기도 복잡하고, 쓰기에도 애매한 놈이 됩니다. 이거 알파 블렌딩에 쓸 수 있는 녀석이 있긴 한 겁니까?


알파 블렌딩에 쓸 생각은 일단 접어둡시다. 그전에 이걸 쓸 데가 있기나 한지 궁금하군요.

말씀드리자면, 쓸 데는 거의 없지만 있기는 합니다.
바로 스카이박스 (또는 스카이돔) 입니다.

이 스카이 박스는, 보통 맨 처음에 그려집니다.
그리고 이 스카이 박스에 가려져서 보이지 않는 오브젝트 따위는 존재하지 않습니다.

즉 이 스카이 박스를 그릴 때에는 Z 값을 읽는 (read) 하는 행위가 무의미합니다. 오히려 쓸데없는 계산이 되어 버리기 때문에,
아예 read 안하는 것이 낫습니다.

또한 이 스카이 박스에 가려지는 오브젝트 따위는 없습니다. 무조건 맨 뒤에 그려져야 하는 거지요.
그러므로 괜한 z값 연산을 할 필요가 없는 관계로 쓰는(write) 하는 작업도 무의미합니다.

즉 꼭 그래야 한다기 보다 (Z read on Write on 해도 결과는 같거든요) '할 필요가 없는 연산을 줄여버린다' 라는 의미에서 쓸모가 있는 방법이라고 할 수 있습니다.
그렇다고는 해도 굉장히 마이너한 방법임에는 틀림이 없지만 말이죠 (...)


4.     Z Read = On     Z  Write = Off
이제 남은건 이것밖에 없습니다.
그래! 분명히 마지막에 남은 이것이 해답이라서 맨 마지막에 소개하는걸 꺼야!!!!
라고 생각하시는 분들 반드시 계시겠지요? 어디 한 번 봅시다. 정말 그런지 후후후.
 
아 그런데 이제 좀 퇴근해야겠군요. 이거 쓰는것도 꽤나 힘든 일이랍니다
다음 시간까지 Z read on , Write off 가 정말로 알파 블렌딩을 해결하는 해답이 될지 생각하는게 숙제입니다.

6부작에서 끝내려 했는데 너무 양이 많군요. 애석하게도 7부까지 가야만 하겠습니다.
쓰다보니 조금 지치네요. 읽으시는 분도 꽤 지치셨을 겁니다. 이게 한번에 쉽게 이해되는 개념은 아니거든요.

그럼 다음 시간인
최종회 : Z 버퍼의 Read / Write 개념 (7부, Z Read On / Write Off)

시간을 기다려 주세요.




Posted by 노을삼킨별
,

아래에서 퍼옴
http://eppengine.com/zbxe/programmig/3103


( 차폐컬링은 본 설명에서 제외된다. )

early z test 는 pixel 단위의 culling 방식이다.

간단히 이야기 하면, 각 픽셀을 연산이 되기전에 깊이테스트를 통해서 보이지 않는 pixel 에 대한 연산은

적절히 skip 하기위한 pixel culling 방식이라고 이해하면 된다.

하지만 Pipe Line 단계에서 Z test 는 pixel shader (fragment shader) 다음에 이루어진다.

그렇다면, pipe 라인상에서는 z-test 가 pixel 연산 다음에 이루어 지는데, 어떻게 앞에서 처리 할 것 인가?

결론부터 이야기 하면 하드웨어 단계에서 지원이 되어야만 가능한 부분이다.

예를들어 Nvidia Geforce 8000 대의 gpu 의 경우 특정 상황에서는 자동적으로 early z 기능이 활성화 된다.


Use

다음의 순서를 따른다.

1. 컬러쓰기를 disable 하고 write depth 만 enable 한다.

(이럴경우 nvidia 의 fx 이상급 gpu 에서는 double speed z write 가 활성화 된다.)

2. depth 를 clear 하지 않은 상태에서 ( depth buffer 를 clear 하지 않는다는 의미 ) 정상적인 rendering 을 실시한다.

(이때 depth test 연산자를 equal 로 설정한다. )

3. 1번 단계에서 기록된 depth buffer 값은 2번 단계를 거치면서 깊이비교에서 실패한 pixel 들을 자동적으로 연산에서 제외 시키게 된다. ( early z )

Posted by 노을삼킨별
,

아래에서 퍼옴
http://eppengine.com/zbxe/programmig/3195

현재 제가 사용하는 노트북 CPU 가 모바일용 i7 이라 굳이 인크리드 빌드를 사용하지 않고 분산 컴파일 옵션을 활용해서 컴파일 하고 있습니다.
뭐 인크리드빌드 프로그램을 활용해서 컴파일 하는것 보다 체감적으로는 더 느리지만 ( 8개 코어를 잡았다는 가정하에....) 실질적으로 분산컴파일을 안했을때보다는 엄청 빠르더군요.

설정 방법은
1. 프로젝트 속성 - C++ - 명령줄 - /MP 설정.
2. 프로젝트 속성 - C++ - 코드생성 - 최소 다시빌드 가능 - 아니요 설정.
해두면 됩니다.

Posted by 노을삼킨별
,

아래에서 퍼옴
http://eppengine.com/zbxe/programmig/3117

최근 gpu 들의 성능은 사실적인 라이팅 처리를 위한 많은 연산들을 실시간으로 처리한다.
 
하지만 여전히 사실적인 광원처리는 무거운 연산이며, 이러한 연산들을 실시간으로 처리하는데 많은 애로사항이 있다.
 
적절한 gamma 보정은 image quality 를 개선하기 위한 가장 편하고 일반적인 기술이다.
 
그렇다면 적절한 gamma 보정을 위해서는 어떠한 것들이 필요한가?
 
우리가 흔히 이미지를 표현할때 사용되는 대부분의 display 장치들은 sRGB 의 생공간을 사용한다.
 
그러므로 이러한 장치에 알맞게 대부분의 image 들은 sRGB 공간으로 저장되게 된다.
 
sRGB 의 생공간이 linear 한 공간인가? 결론은 아니다.
 
그렇다면 앞서 이야기 한 것과 같이, 대부분의 표현장치들은 nonlinear 한 생공간을 표현하는데,
 
우리의 렌더링 연산은 이러한 생공간이 linear 하다고 가정하고 이루어 진다.
 
여기서 문제가 발생하는데, 이러한 문제로인해 gamma 값이 잘못 표현되게 되고, 이는 사실적인 렌더링을 저해하는
 
요소가 된다.
 
그렇다면 이를 위한 적절한 해결책으로 image 의 imput 값을 아래와 같이 변경한다. ( gamma 2.2 에 근접한다고 가정)

   float3 diffuseCol = pow( f3tex2D( diffTex, texCoord ), 2.2 );  

  or ( 보다더 비용이 적은 방법으로 gamma 값을 2.0에 근접한다고 가정하고 ) 

  •  
  •    float3 diffuseCol = f3tex2D( diffTex, texCoord );  
  •    fuseCol = diffuseCol * diffuseCol;  
  • 그리고는 최종 색정보를 return 할때

       float3 finalCol = do_all_lighting_and_shading();

       float pixelAlpha = compute_pixel_alpha();  

       return float4(pow(finalCol, 1.0 / 2.2), pixelAlpha);

       or

       return float4( sqrt( finalCol ), pixelAlpha );

    위와같이 처리함으로써 다시 sRGB 공간으로 변경하여 리턴한다. ( 이유는 display 장치들은 sRGB 생공간을 사용함으로..)

     
    주의
    컬러 이미지 외에 선형적인 데이터(노멀맵, 스페큘러맵, 하이트맵,...) 들은 이미 linear space 에 있기 때문에
    따로 처리할 필요는 없다.

     참고
    Posted by 노을삼킨별
    ,

    아래에서 퍼옴
    http://eppengine.com/zbxe/programmig/3144

    UberShader 을 이용하여 게임을 제작하는 방법에 대한 소개한다.

    InHouse 엔진에서 자주 사용되는 기법으로, 간단하면서도 편리한 기법이다.

    EPPENGINE 에도 UberShader 를 지원하는 시스템을 갖출 생각이다.

    들이는 노력에비해 Material 제작이 아주 간편하고 간략해지며, 변화에 유연하게 대처가 가능해 진다.

    우선 UberShader 를 제작하여야 하는데,  모든 기능이 가능한 shader 를 제작한다.

    그리고는 각 기능별로 #ifdef 을통해 각 기능을 묶어둔다.

    이렇게 제작된 shader 는 define 을 무엇을 정의하느냐에따라 기능이 추가되기도 기능이 감소되기도 한다.

    여기까지 글만 보았을때는 특별히 느낌이 없을 수 있다.

    예를 들어보자.

    특정 게임에 있어서 이미 렌더링 방식자체가 어느정도 정해진 상황이라면

    가령... 범프를 사용하는경우 도 있고 범프를 사용하지 않는경우도 있고, 포인트라이트를 사용하는 경우도 있고, 포인트 라이트를 사용하지 않는경우도 있고, 스펙큘러 마스킹을 디퓨즈 텍스쳐의 알파에 있는경우도 있고, 따로 텍스쳐로 만드는 경우.. 등..

    각가지 상황이 이미 정해져 있다고 한다면,

    위의 상황에따른 case by case 로 material 을 제작한다면 유지보수 해야할 material 수가 많아질 것이며, 각 material 마다의 기능이 조금씩 변경될때마다, 작업은 계속해서 늘어날 것 이다.

    eppengine 을 사용하는 특정프로젝트의 경우 오브젝트가 멀어졌을때 specular 사용을 disable 한다던지 그림자 처리를 하지 않는 경우가 있었다.

    이러한 경우가 매번 생길때마다, 매번 머터리얼에디트를 통해 새로이 제작하는것은.... 조금 과장하면 구멍뚤린 독에 물붇기????

    하지만 이러한 모든 상황이 가능한 shader 을 만들어 두고, 각 기능별로 ifdef 로 묶어둔 상황이라면,

    각 케이스에 따라서 define 만 재정의 해주면 간단히 처리된다.

    그렇다면.. 예제 소스를 보고 생각해보자.

    ... shader 코드 내부 ...

    float4 diffuse_color = tex2d( diffuse , texcoord );
    float spec = calculate_specular();

    #ifdef   
    DIFFUSE_SPEC_MASK
             float4 spec_color = diffuse_color.a * spec;
    #endif
    #ifdef    SPECULAR_MAP_MASK
             float4 specular = tex2d( specularSampler, texcoord );
             float4 spec_color = specular * spec;
    #endif

    float4 final_color = use ( specular_color );
    return final_color;


    위와 같은 material 을 제작해 두었다면...

    실제 클라이언트 코드 쪽에서...


    String    strUberShder  =  ubershader_code;
    if( use_specular_map == true )
    {
                strUberShder = "#define SPECULAR_MAP_MASK" + strUberShder;
    }
    else
    {
                strUberShder = "#define DIFFUSE_SPEC_MASK" + strUberShder;
    }
    ......


    그리고 마지막으로 이러한 define 정의는 툴에서 연동하게만 해준다면,  보다 편리하면서도 유연한 material 제작 공정이 가능하게 된다.

    물론..... 당연한 이야기 겠지만, 각 게임에 맞는 모든기능을 갖는 shader 는 미리 제작되어져야함은... 두말하면 잔소리!!


    Posted by 노을삼킨별
    ,