[한글화 상식]압축의 개념과 원리에 대해서[한글화 상식]압축의 개념과 원리에 대해서

Posted at 2012. 2. 1. 16:01 | Posted in 이전 카테고리/한글화 강좌 시즌 2
안녕하세요, Hangeru Team.의 MG게이버입니다.~
오늘도 다시 한글화 강의 들어갑니다. ㅎㅎ


 강좌 개요

압축에 대해 간단히 알아봅니다.

 본 강좌

한글화를 하다보면 여러가지 어려움이 있는데 그중에서 가장 많은 분들이 어려움을 느끼시는 압축에 대해 알려드리고자 합니다.

압축.. 많이 들어봤고 실제로도 많이 사용하고 있지만 한글화에서의 압축은 뭔가 생소하실겁니다.

사실 기본적인 개념은 똑같고 범용 프로그램이 있는가 없는가의 차이밖에는 없습니다.. 

범용 프로그램이란 우리가 많이 사용하는 압축 프로그램, winrar, 반디집, 알집 등을 말하는데 이런 범용 프로그램들은 주로 파일을 압축해서 보내거나 보관할 때 사용합니다. 압축을 하게 되면 여러 가지 파일을 한 파일로 묶어서 쉽게 보낼 수 있고 용량도 줄일 수 있기 때문에 일석이조겠지요?

그렇다면 프로그램에서는 어떨까요?

역시 데이터를 보관하고 쉽게 관리하기 위해 사용합니다.
즉 프로그램에서도 데이터를 압축하면 여러개의 데이터를 묶을 수 있고 용량도 줄일 수 있기 때문에 일반인들이 사용하는 것과 거의 같은 목적으로 사용합니다.

다른 점은 무엇이 있을까요?

바로 사용 방식의 차이인데, 일반 파일 압축은 여러 종류의 파일(문서, 음악, 비디오, 실행 파일 등)을 효율적으로 압축할 수 있어야 하며 보관을 위해 압축률을 최대화하고, 분할 압축 등의 기능 지원과 호환성(여러가지 OS에서 풀 수 있도록)을 중요시합니다.
반면 프로그램에서는 빠른 구동을 위한 압축된 데이터를 빨리 풀 수 있어야하며, 여러 종류의 데이터 별로 최적화된 압축루틴을 사용합니다.
또한 라이센스 문제로 자체적으로 압축 루틴을 개발하는 경우도 있지요..

이런 차이 때문에 프로그램 내부의 압축 루틴은 범용 프로그램이 존재하지 않는 경우가 많고, 따로 압축 해제 툴을 개발하여야 합니다.(물론 zip, gz 등의 범용 압축 루틴을 사용하는 프로그램도 많습니다.)

압축의 원리

압축의 원리는 간단합니다.
중복되는 데이터를 방지하고 줄이는 것인데 쉽게 말해서 사과가 든 상자와 바나나가 든 상자, 귤이 든 상자들이 아래처럼 배열되어 있다고 해봅시다.
사과|사과|사과|사과|바나나|바나나|귤|사과|사과|바나나|바나나

이걸 문서로 작성한다고 할때 어떻게 하면 글자 수를 줄일 수 있을까요?

사과x4|바나나x2|귤x1|사과x2|바나나x2

이렇게 쓰면 글자수가 많이 줄어들겠죠?

압축은 위와 같은 원리입니다.
중복된 데이터를 줄이고, 간단한 기호로 작성하는 것이죠.
물론 압축을 하게 되면 사람이 한눈에 알아보기는 힘들어지지만, 컴퓨터가 압축 해제도 처리하기 때문에 상관 없겠지요?

 강좌를 마치며

이번 강좌에서는 압축에 대해 말해보았습니다.
나중에 고급강좌에서는 압축 루틴 등도 직접 살펴보고 해제 툴 제작 방법도 알려드리겠습니다.
궁금한 점이 있으시면 메일 주시기 바랍니다. 
//

[한글화 관련]게임 한글화에 대한 질문 또는 분석 요청 받습니다.[한글화 관련]게임 한글화에 대한 질문 또는 분석 요청 받습니다.

Posted at 2011. 9. 1. 00:24 | Posted in 이전 카테고리/한글화 강좌 시즌 2
· 게임 한글화 지원 정책 소개

Hangeru Blog. 에서는 한글패치를 제작하기 원하시는 분들께 아래와 같은 지원 정책을 준비하였습니다.

질문은 강좌에 작성되어 있는 내용에 대한 질문 외에도 궁금하신 점을 질문하실 수 있습니다.

게임 분석은 한글패치를 제작하기 위해 게임 파일을 분석하는 작업이며 게임명과 기종, 한글화 진행 계획, 게임의 구동 파일을 메일로 보내주시면 분석 작업을 하고 있습니다.
단 분석에 실패하거나 한글화가 불가능할 때도 있으며 이런 경우에도 메일을 통해 답변하며, 한글화가 가능한 경우에는 게임 파일의 구조를 메일로 알려드리거나 필요한 정보를 드립니다.
단 게임 파일의 수정(인코딩 변경, 폰트 확장 등)은 해드리지 않으며 이 경우 안내만 해드립니다.

툴 제작은 게임 한글화 작업을 쉽게 할 수 있도록 전용 프로그램을 제작하는 작업이며 위에 나와 있는 게임 분석시에 필요한 자료들(구조를 알고 있다면 관련 정보도 첨부) 메일로 보내주시기 바랍니다.
제작 가능한 전용 프로그램은 대사 입출력툴 또는 패키징 해제툴, 그래픽 수정 툴입니다.
단 툴 제작 후 패치를 배포할 때에는 라이센스 문서 또는 배포 문구에 "Tools by Hangeru" 문구와 블로그 주소를 추가해주셔야 합니다.

* 주의사항

1. 문의/요청 내용을 토대로 문제가 될 수 있다고 판단되는 경우 답변을 거부할 수도 있습니다.

2. 게임에 따라 툴 제작이 불가능한 경우도 있습니다.

3. 시간 관계상 압축되어있는 게임은 공개된 알고리즘이 아니면 툴 제작 요청이 거부될 수 있습니다.
 


문의처 주소 : mingi2007@gmail.com

한글화 강좌를 보시려면 아래 링크를 클릭하십시오.
한글화 강좌 메인 페이지
//

[한글화 강좌]중급 1장 - 하드웨어 구조를 이해하자![한글화 강좌]중급 1장 - 하드웨어 구조를 이해하자!

Posted at 2011. 9. 1. 00:07 | Posted in 이전 카테고리/한글화 강좌 시즌 2
한글화 강좌 중급편 제 1장 하드웨어 구조를 이해하자 편입니다!

사실 하드웨어 구조를 이해하는 것은 한글화 외에 시스템의 동작 원리 등을 이해하는 데에도 많은 도움이 됩니다.
중급 강좌는 주로 이런 쪽으로 강좌를 할 예정이며 우선 다양한 기기의 하드웨어 구조를 문서를 보면서 차근차근 알아보는 쪽으로 가겠습니다. ^^

게임기의 하드웨어는 사용자 입력 인식(버튼, 터치 등), 게임에서 필요한 연산 처리, 그래픽 출력, 외부 장치와의 통신(Wi-Fi 등), 사운드의 재생, 메모리 관리 등등.. 다양한 일을 수행합니다.

따라서 게임 제작시에는 게임기의 특성에 맞춰서 게임 개발을 하게 되는데, 하드웨어 구조를 이해하면 게임의 내부 루틴이나 구조를 쉽게 이해할 수 있습니다.

이런 하드웨어 구조의 전체적인 설명을 스펙(Specifications) 이라고 하며 컴퓨터를 살 때에도 흔히 스펙을 보고 컴퓨터를 사지요.(다만 컴퓨터의 스펙은 성능 차이만 있을 뿐 대부분 호환이 가능하며, 게임기에서의 스펙은 거의 게임기마다 고유합니다.)
 
그렇다면 이 스펙에는 무엇이 있는지 우선 몇가지 알아보겠습니다.
우선 가장 중요한 CPU에 대한 설명이 있습니다.
CPU에는 아키텍처(architecture)라고 하는 것이 있는데 이 아키텍처라는 것에는 명령어의 집합, 처리 방법, 번지 부여 방식 등이 포함됩니다.
아키텍처는 크게 PC에서 사용하는 X86또는 X64,  MIPS, ARM, Z80 등이 있습니다.
이 중에서 현재 가장 많이 사용되는 아키텍처는 x86과 ARM인데 x86은 위에서 말한 것 처럼 PC에서 사용되며 흔히 PC에서 32비트라고 부르는 것은 x86을 뜻합니다. 그리고 ARM은 휴대용 기기에서 주로 사용되는데 아이폰이나 갤럭시 등의 스마트폰에서도 arm 기반 아키텍처를 사용합니다.

아키텍처는 명령어의 집합을 포함하고 있으므로 아키텍처가 다르면 당연히 게임의 내부 코드 또한 달라집니다. 이런 게임의 내부 코드를 수정할때는 기계어를 알아야 수정이 가능한데, 이 기계어를 사람이 볼 수 있게 일종의 언어 코드로 바꾼 것이 바로 어셈블리 언어입니다.

물론 아키텍처가 같다고 해서 언어 구조가 완전히 같지는 않습니다.
이유는 CPU 아키텍처를 커스터마이즈하는 경우가 있어서, 특정 명령어를 없에기도 하고 자체적으로 추가하기도 하기 떄문입니다.
하지만 기본적인 구성은 거의 비슷합니다.

다음으로 스펙에는 I/O에 대한 구조가 포함됩니다.
I/O는 입출력(Input/Output)의 약자인데 데이터를 다른 하드웨어로 옮기거나 다른 하드웨어에서 정보를 받아올떄 쓰입니다.
사용자 입력도 이 I/O 시스템에 의해 처리되고 그래픽/사운드나 다른 출력도 마찬가지입니다.
I/O에 대한 구조에는 어떤 장치가 있는지, 장치와의 통신 방법은 무엇인지 에 대해서 적혀있습니다.

그 다음으로는 메모리 맵이라는 것이 있습니다.
메모리 맵은 메모리를 어떤 식으로 배치 해뒀는지를 기록해놓은 문서입니다.
포인터 강좌에서 보신 분들은 아시겠지만 GBA에서는 포인터를 찾을때 0x8000000 이라는 값을 더합니다.
이 정보도 메모리 맵에서 찾을 수 있는데 GBA의 메모리 맵에는 0x8000000부터 0xA000000 까지에는 카트리지 데이터가 위치한다고 적혀 있습니다.
이렇게 매모리 맵을 참고하면 데이터를 찾거나 코드 추가시에도 아주 유용합니다.

이상 중급 강좌 첫 편인 하드웨어 구조를 이해하자 편을 마칩니다.
이해가 안되시는 부분이 있으시면 문의 주시면 답변해드리겠습니다.
//

[한글화 강좌] 제 5장 - 포인터의 개념[한글화 강좌] 제 5장 - 포인터의 개념

Posted at 2011. 8. 29. 16:30 | Posted in 이전 카테고리/한글화 강좌 시즌 2
안녕하세요.
Hangeru 한글화 강좌 Season 2의 첫번째 강좌 게시물이군요 ^^;

이번 강좌에서는 포인터(pointer) 에 대해서 알아보겠습니다.








목차

포인터의 개념
게임 한글화에서의 포인터
포인터 찾기
    GBA(게임보이 어드밴스)
    PSP(플레이스테이션 포터블)
    GB(게임보이)

포인터의 개념

포인터는 사전적 의미로 무엇인가를 가리키는 것을 뜻하며 컴퓨터에서 사용하는 마우스 포인터, 프레젠테이션에서 사용하는 레이저 포인터도 화면의 무엇인가를 가리킬때 사용합니다.

이 포인터는 프로그램이나 게임에서도 같은 의미로 사용되는데 바로 데이터를 가리키는 주소값(번지)이라고 할 수 있습니다.
여기에서의 데이터는 대사, 그래픽, 프로그램 코드, 사운드 등 여러가지가 될 수 있겠지요.

포인터의 개념은 C언어 등에서도 필수적으로 배우는 부분이며 포인터에 대해 알면 게임 한글화에도 많은 도움이 됩니다.

그럼 포인터 값이 어떻게 저장되는가 알아보면...
컴퓨터나 게임기 등에서는 메모리나 저장장치에 주소를 부여하고 그 주소를 통해서 데이터를 불러옵니다.


위 그림을 보시면 안녕하세요 라는 대사는 0x100 번지에 저장되어 있습니다.(앞에 0x가 붙으면 16진수 라는 의미) 따라서 안녕하세요 라는 대사의 포인터 값은 0x100이 됩니다.(게임에 따라 포인터를 저장하는 방식이 다릅니다. 게임 별 포인터 구조는 하단에서 다룹니다.)

게임 한글화에서의 포인터

그럼 게임 한글화에서는 포인터가 어떻게 사용될까요?
게임 한글화를 도전해보신 분들이라면 대사 공간이 부족해서 대사 줄이기가 필요한 경우가 있으셨을 겁니다.
이는 포인터에 있는 번지의 저장 공간이 제한되어 있거나 뒤쪽에 데이터가 있어서 넘어가면 안되기 때문인데 이럴 때 포인터를 변경하면 쉽게 한글화를 할 수 있습니다.

100평짜리 창고가 있다고 예를 들어봅시다.
이 100평 짜리 창고에는 17인치 모니터가 50개, 21인치 모니터가 50개 들어있습니다.
그리고 이번에 17인치 모니터를 모두 빼내고 27인치 모니터를 50개 넣으려고 합니다.
하지만 이 창고에는 17인치 모니터가 50개 들어갈 공간밖에는 남아있지 않습니다.
이럴 때는 다른 창고에 모니터를 넣어야겠지요?

한글화에서도 마찬가지입니다.
히라가나/가타카나를 1바이트로 사용하는 게임에서  "ありがとう"라는 대사가 있다면 한글로 "고마워"라고 입력해야하는데 일본어는 총 5바이트이고 한글은 각각2바이트 총 6바이트가 되어 1바이트 공간이 부족하군요. 이럴 때에 대사 위치를 다른 곳으로 옮기고 포인터 값을 수정해주면 대사를 줄일 필요 없이 한글화가 가능하게 됩니다.

포인터 찾기

게임에서 실제로 대사, 폰트, 포인터를 찾는 건 구조가 게임마다 다르므로 강좌만 보고는 알 수 없는 부분입니다. 하지만 하드웨어 특성에 따라 게임기 별로 자주 사용되는 포인터 방식이 있습니다.
이번 강좌에서는 이 자주 사용되는 포인터 방식 몇가지를 소개해드리겠습니다.

GBA(게임보이 어드밴스)
게임보이 어드밴스는 포인터 찾기 쉬운 게임 기기 중 하나입니다.
게임보이 어드밴스에서는 카트리지에서 데이터를 불러올때 카트리지 주소값에 [0x8000000]을 더해서 불러옵니다.
즉 롬파일의 0x100 번지의 값을 불러올때 실제로는 0x8000100 의 값을 불러오는 것이지요.
따라서 GBA의 포인터 값에는 실제 주소값에 [0x8000000]이 더해져 있습니다.
그리고 데이터는 모두 바이트 플립되어 있으므로 [0x100]의 포인터 값을 찾으려면 [0x00010008] 으로 검색하면 됩니다.

그럼 실제 게임에서 찾아 보겠습니다.
예제는 포켓몬스터 에메랄드 일본어판 입니다.
(모든 GBA 게임이 아래와 같은 포인터 구조를 사용하는 것은 아니며 게임 내에서도 여러가지 포인터 구조를 사용하기도 합니다.)



대사 いや- おまたせ おまたせ!를 롬 파일을 열어 찾습니다.
 

대사의 주소값은 0x277095 이군요.
그렇다면 이 값에 0x8000000 을 더하고 바이트 플립시키면 포인터 값은 0x95702708 이 됩니다.

95702708으로 검색하면 포인터가 나옵니다.

대사 공간이 부족해서 다른 곳으로 옮기려면 새로운 공간에 대사를 입력하고..

새로운 주소값인 0x08915900을 바이트 플립해서 입력한 뒤..

게임을 시작하면 짜잔! 대사가 바뀐 것을 보실 수 있습니다.

PSP(플레이스테이션 포터블)
강좌 준비중입니다...

GB(게임보이)
강좌 준비중입니다...
//