SlideShare una empresa de Scribd logo
1 de 61
내 손에 픽셀을 쥐어다오

   청강문화산업대학 콘텐츠스쿨 교수
      별바람 스튜디오 대표
     별바람(김광삼)
내 손에 픽셀을 쥐어다오
iOS에서 OpenGL ES를 이용한 8비트 픽셀 처리와 포팅

         청강문화산업대학 콘텐츠스쿨 교수
            별바람 스튜디오 대표
           별바람(김광삼)
게임을 이식하기로 했다.
  난 이제 뭘 해야 하는 거지?
뭘 이식할 생각이었냐면
뭘 이식할 생각이었냐면
뭘 이식할 생각이었냐면




 혈십자, 이 저주받은 게임이었죠.
처음엔 쉽게 생각했었다.
어차피 게임이 돌아갈 구조란 뻔하니까.
오브젝티브 씨? 이건 또 뭐야?
 어차피 개념은 비슷할테니 어찌 되겠지만..
그냥 귀찮은데 엔진 있지 않나?
제자들을 보니 Cocus2D, Unity3D, UDK등 많이 쓰던데?
..하지만 문제가 있었다
 일단 메모리 부터가 문제다
미칠듯한 스프라이트의 압박
          캐릭터 하나마다
          이런 방식으로
          30-40장을 사용

          옆의 캐릭터가
          그나마 가장 적은데
          8비트(!) BMP 파일로
          9.45M 의 용량.

          적 캐릭터는? 배경은?
          음악은? 동작 데이터
          는? 캐릭터 보이스는?
          그런데 2P, 3P, 4P, 5P, 6P
          컬러도 바꿔야..
WTF!!! 용량이 문제잖아!!
   8비트.. 8비트가 필요해..
하지만 ‘요즘’ 엔진들에게 8-bit는..
       누가 그런 걸 쓰냐고?
그래, 나는 노땅이다
   그리고 픽셀을 만지지 못하는 코딩이 싫다
메인 루프를 만지작 거리지 않는 구조는 취향이 아냐
..하지만 어찌 될거야
  쿼츠 2D가 있잖아
어차피 픽셀만 제어하면 어찌 되거든..
뭐??? 안된다고??!!????!!!
그게 무슨 소리요!! 내가..
어어.. 이거 곤란한데?
좀 더 하부 제어로 내려가지 않으면..
결국 최후의 보루는 OpenGL인가
  내 주변에 이거 쓰는 사람은 아무도 없지만..
좌절의 나락에 빠질때 쯤
어느 책의 예제를 보다 깨달았다.
 호오.. 텍스춰.. 텍스춰라고? 결국 Array란거잖아?
화면 가득 텍스춰로 잡아놓으면
원하는 좌표에 점을 찍을 수가 있다!!!
즉, OPEN GL의 텍스춰로
백버퍼를 만들어버리는거다!
이 화면을 처음 보았을때 얼마나 기뻤는지 모른다.
 (눈에 캐릭터가 보이는 것 같지만 착각입니다.)
이 화면을 처음 보았을때 얼마나 기뻤는지 모른다.
 (눈에 캐릭터가 보이는 것 같지만 착각입니다.)
“점 하나 그렇게 힘들게 찍는 놈은 처음 본다”
..하지만 문제는 속도야 바보야.
   텍스쳐에 일일히 점을 찍는다고?
    그게 속도가 나올리가..
..나오더군요.
    의외로 빨라서 놀랐습니다.
전체 화면을 2겹으로 계속 갱신해대는데도
 100프레임을 훨씬 넘어서는 스피드..
내 손에 픽셀 하나만 쥐어다오.
   달인에게 연필을 쥐어주면
    사람을 죽일 수 있듯이,
  개발자에게 픽셀을 쥐어주면 ..

 90년대에는 다들 그렇게 만들었으니까요.
게다가 C++코딩이 가능하다!!
만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!!
게다가 C++코딩이 가능하다!!
만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!!
게다가 C++코딩이 가능하다!!
만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!!




    OpenGL 에게 축복을!!
간단히 말하면,
 텍스춰를 화면보다 크게(512x512) 잡아서
백버퍼를 만들고 여기에 직접 이미지를 그린다.

  이로써 8-bit indexed 컬러의 이미지도
백버퍼(실은 24 혹은 32비트)에 올릴수 있고,
  삐~하고 삐~한 장난질이 가능하다!!
잠깐만!! 갑자기 왜 8비트???
 지금이 어느 시대인데 8-Bit 컬러를?
다시 이걸 봅시다.

        이 그림의 용량은?
        8-bit = 640*480+256*3
        16-bit = 640*480*2
        24-bit = 640*480*3
        32-bit = 640*480*4

        이런 그림이 캐릭터당
        30-40장이 쓰인다면..

        쉬운 답은 8-bit 뿐이다
하지만 256컬러는 너무..
 아무리 복고풍이 유행이라지만요.
8-BIT INDEXED COLOR?
 R,G,B 정보를 8비트에 담는 것은 무리.
(3-3-2로 나눈다고 생각하면 끔찍하죠)
 즉, 256개의 프리셋(팔레트)을 만들고,
픽셀은 이 팔렛(프리셋)값을 저장한다.

이미지 하나당 최대 256가지 색만 쓴다면
 팔렛에는 자유롭게 R,G,B를 세팅한다.
    즉, 이미지가 크지 않다면
  무시하기 못할 퀄리티가 나온다.
지금 8BIT를 무시하나여?
소스 데이터로써 8비트
 어차피 백버퍼는 24 혹은 32비트라고 가정하면,
스프라이트, 혹은 텍스춰 등의 게임 소스 비트맵을
  8비트 데이터로써 메모리에 올릴 수 있다.

   이로써 생기는 장점은 메모리 사용의 감소.
 그리고, 팔렛변환의 특징인 손쉬운 색상 변환이다.
(격투게임등의 2P, 3P 컬러 같은 것을 구현하기 위해)

스프라이트마다 개별적인 팔렛을 가질 수 있으므로,
  최종적인 결과 화면은 256컬러가 아니다!
여기에 RLE 를 사용한다면?
RLE(Realtime Length Encoding)을 기억하시나요?
     더 적은 메모리 점유와 빠른 블리팅
RLE 의 원리




근본적으로 반복되는 숫자를 횟수로 줄임
그리고 그 결과는?



        302KB 가 77KB로!!!
      하지만 기억해야 할 것.
최종적인 zip압축률은 비슷하나 약간 손해.
즉, 메모리에 압축상태로 올려야 의미 있음.
이보다 더 효율을 높이려면?
         Bit-Flag Compression
  BRP(Byulbram-Rupaus Package)..형식
      등등 각자 개량하기 나름
그래서 실제로 어떻게 짜는데?
  일단 기본적인 코드의 예제를 봅시다.
기본적인 원리
1. OpenGL ES 1.1템플릿의 어플리케이션 생성
2. 화면사이즈보다 크게 GLubyte* 로 백버퍼 선언
3. 백버퍼에 직접 픽셀 쓰기
   (백버퍼의 데이터 순서는 좌표 기준으로,
    (0,0) R, (0,0) G, (0,0) B, (0,0) A, (1,0) R...의 순서
    즉 (X + (Y * Max_X))*BitRate)+color 로 접근.
4. 백버퍼를 glTexImage2D 로 텍스쳐로 만든다.
5. 사각형 폴리곤을 생성하여 화면가득 렌더링

참 쉽죠?
백버퍼 생성 예제 코드
CK2D_Texture CreateBackBuffer()
{
!   int i, x, y, ix, iy;
!
!   CK2D_Texture tTxr;
!
!   tTxr.Width = TEX_SIZE_X;
!   tTxr.Height = TEX_SIZE_Y;
!
!
!   backbuffer = (GLubyte *) malloc(tTxr.Width * tTxr.Height * BIT_RATE);
!   memset(backbuffer, 0, TEX_SIZE_X * TEX_SIZE_Y * BIT_RATE);!
!   ix = 0;
!   iy = 0;
!
!
!   glGenTextures(1, &tTxr.ID);
!   glBindTexture(GL_TEXTURE_2D, tTxr.ID);
!
!   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tTxr.Width, tTxr.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, backbuffer);

!
!   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
!   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
!
!   glEnable(GL_TEXTURE_2D);
!
!
!   return tTxr;
}
비트맵 출력 예제
void BITMAPDraw ( int iX, int iY, stcRECT area, int iFlip, int isColorkey, stcBMPDATA bmp)
{
!   int iWidth, iHeight;

!   if (bmp.isCompressed)
!   !      RLEDraw(iX, iY, area, iFlip, isColorkey, bmp);
!
!   iWidth = bmp.iWidth;
!   iHeight = bmp.iHeight;

       <------- 스크롤의 압박으로 클리핑 파트 생략 ----------->

!   int iShit, iCrap;
!   BYTE bColor;
!   int iCal;
!   int iCalY;
    int iCalY2;

!   for ( iShit = 0; area.iHeight > iShit; iShit++ )
!   {
!   !      iCalY = ((iShit-iY+(MAX_Y-area.iHeight) ) * TEX_SIZE_X );
!   !      iCalY2 =( (iShit+area.iY) * (bmp.iWidth + bmp.iSpan) )
!   !
!   !      for ( iCrap = 0; area.iWidth > iCrap; iCrap++ )
!   !      {
!   !      !    bColor = bmp.ImageData [ iCrap+area.iX + iCalY2];
!   !      !    iCal = (((iCrap+iX) + iCalY) * BIT_RATE);
!   !      !
!   !      !    if (( bmp.iColorkey != bColor ) || (isColorkey == 0))
!   !      !    {
!   !      !    !     backbuffer[iCal] = bmp.color [ bColor ].ir;
!   !      !    !     backbuffer[iCal+1] = bmp.color [ bColor ].ig;
!   !      !    !     backbuffer[iCal+2] = bmp.color [ bColor ].ib;!  !     !    !    !      !
!   !      !    }
!   !      }
!   }
}
그럼 정말 쉽게 만들수 있나?
    항상 말은 쉽습니다만..
개고생하게 되는 것들
1. 그래픽 리소스 파일 읽어오기.
2. 좌표계가 좀 달라서 헷갈린다.
3. 다양한 압축 포맷의 효율 최적화
4. 한글 구현은 지옥.

간단히 말하면 DOS 시절, 맨땅에 헤딩하던 것은
모조리 다시 한다고 생각하면 된다.
그래서 결과는 어떤가?
Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓
그래서 결과는 어떤가?
Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓
그래서 결과는 어떤가?
Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓




      첫 3주일간 CK2D 엔진을 구축
   이후 1주일 만에 첫 메인 게임 구동 성공
    다시 1주일만에 대부분의 기능 구현
CK2D 엔진?
OpenGL ES 1.1 기반
백버퍼/픽셀제어 기반의 2D 그래픽 제어
비압축, RLE8압축 8비트 BMP형식 지원
BRP, BBR(BRP2.0) 압축 스프라이트 지원
반투명, 모션블러 이펙트 지원
3D스프라이트 지원
비트맵 한글 출력 지원
CK2D 엔진?
OpenGL ES 1.1 기반
백버퍼/픽셀제어 기반의 2D 그래픽 제어
비압축, RLE8압축 8비트 BMP형식 지원
BRP, BBR(BRP2.0) 압축 스프라이트 지원
반투명, 모션블러 이펙트 지원
3D스프라이트 지원
비트맵 한글 출력 지원

포맷 변환툴, 소스코드   공개 예정
이식 작업을 위한 간단한 팁
1. 먼저 그래픽 출력 기능부터 래핑 코드를 짜자.

2. 모든 그래픽 명령이 래핑되면 컨트롤 파트를.

3. 사운드는 일단 전부 주석처리를 해놓은채로
   소스코드를 그래픽/컨트롤 위에 쌓아올린다.

4. 리소스 파일의 경로를 꼭 주의할 것.
작업 하며 느낀 점들
1. iPhone의 성능이 생각보다 강력하다.

2. 웬만한 백버퍼 방식의 90년대 게임은 이식 가능
   (제 그녀의 기사단 원작도 이식 가능할 듯)

3. PC와 Mac을 오가며 작업하다 보면 헷갈린다.
   (가급적 Visual Studio와 Xcode의 단축키를 통일)

4. 오브젝티브-C 와 단순화된 구조가 싫은 노땅은
   OpenGL ES 를 하자.
감사합니다.
blog.naver.com/byulbram
   byulbram@ck.ac.kr

Más contenido relacionado

La actualidad más candente

게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013영욱 오
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011devCAT Studio, NEXON
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법Chris Ohk
 
[GDC] Perry_POCBasedDesign_KOR
[GDC] Perry_POCBasedDesign_KOR[GDC] Perry_POCBasedDesign_KOR
[GDC] Perry_POCBasedDesign_KORJisang Yoon
 
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study강 민우
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템강 민우
 
[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머포프 김
 
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사 NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사 Imseong Kang
 
Tgb 김다찬 소년이여개발자가되어라(igc2017)
Tgb 김다찬 소년이여개발자가되어라(igc2017)Tgb 김다찬 소년이여개발자가되어라(igc2017)
Tgb 김다찬 소년이여개발자가되어라(igc2017)다찬 김
 
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?강 민우
 
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발Eunseok Yi
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들영욱 오
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템Chaeone Son
 
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로SeongkukYun
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기Jiho Choi
 
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지Minjung Ko
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성noerror
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012devCAT Studio, NEXON
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 

La actualidad más candente (20)

게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
 
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
오승준, 사회적 기술이 프로그래머 인생을 바꿔주는 이유, NDC2011
 
게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법게임 프로그래밍 기초 공부법
게임 프로그래밍 기초 공부법
 
[GDC] Perry_POCBasedDesign_KOR
[GDC] Perry_POCBasedDesign_KOR[GDC] Perry_POCBasedDesign_KOR
[GDC] Perry_POCBasedDesign_KOR
 
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study
[IGC 2016] 띵소프트 이득규 - 삼국지조조전 Online L10N 개발 Case Study
 
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
[IGC 2017] 넥스트플로어 김영수 - Protocol:hyperspace Diver 개발 포스트모템
 
[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머[2012 대학특강] 아티스트 + 프로그래머
[2012 대학특강] 아티스트 + 프로그래머
 
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사 NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사
NDC 2018 '야생의 땅: 듀랑고' 초반 플레이 변천사
 
Tgb 김다찬 소년이여개발자가되어라(igc2017)
Tgb 김다찬 소년이여개발자가되어라(igc2017)Tgb 김다찬 소년이여개발자가되어라(igc2017)
Tgb 김다찬 소년이여개발자가되어라(igc2017)
 
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
[IGC 2016] 컴투스 김동준 - 기획 지망생은 무엇을 준비하나요?
 
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
NDC 2017 키노트: 이은석 - 다가오는 4차 산업혁명 시대의 게임개발
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
ndc 2017 어쩌다 신입 - 초보 게임 개발자 2년 간의 포스트모템
 
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
 
취미로 엔진 만들기
취미로 엔진 만들기취미로 엔진 만들기
취미로 엔진 만들기
 
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
[NDC2017] 뛰는 프로그래머 나는 언리얼 엔진 - 언알못에서 커미터까지
 
06_게임엔진구성
06_게임엔진구성06_게임엔진구성
06_게임엔진구성
 
게임 디렉팅 튜토리얼
게임 디렉팅 튜토리얼게임 디렉팅 튜토리얼
게임 디렉팅 튜토리얼
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 

Destacado

Oauth 이해 (소셜로그인)
Oauth 이해 (소셜로그인)Oauth 이해 (소셜로그인)
Oauth 이해 (소셜로그인)Eunsung Lim
 
Mobile Augmented Reality (KT경제연구소 세미나)
Mobile Augmented Reality (KT경제연구소 세미나)Mobile Augmented Reality (KT경제연구소 세미나)
Mobile Augmented Reality (KT경제연구소 세미나)DoubleMe, Inc.
 
[H3 2012] 키노트 - Backend platform의 미래, baas.io
[H3 2012] 키노트 - Backend platform의 미래, baas.io[H3 2012] 키노트 - Backend platform의 미래, baas.io
[H3 2012] 키노트 - Backend platform의 미래, baas.ioKTH, 케이티하이텔
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기changehee lee
 

Destacado (6)

Oauth 이해 (소셜로그인)
Oauth 이해 (소셜로그인)Oauth 이해 (소셜로그인)
Oauth 이해 (소셜로그인)
 
AR tool - Vuforia
AR tool - VuforiaAR tool - Vuforia
AR tool - Vuforia
 
WebGL
WebGLWebGL
WebGL
 
Mobile Augmented Reality (KT경제연구소 세미나)
Mobile Augmented Reality (KT경제연구소 세미나)Mobile Augmented Reality (KT경제연구소 세미나)
Mobile Augmented Reality (KT경제연구소 세미나)
 
[H3 2012] 키노트 - Backend platform의 미래, baas.io
[H3 2012] 키노트 - Backend platform의 미래, baas.io[H3 2012] 키노트 - Backend platform의 미래, baas.io
[H3 2012] 키노트 - Backend platform의 미래, baas.io
 
모바일 엔진 개발기
모바일 엔진 개발기모바일 엔진 개발기
모바일 엔진 개발기
 

Similar a 내 손에 픽셀을 쥐어다오

[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)대영 노
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기JP Jung
 
MGS 툴세미나
MGS 툴세미나MGS 툴세미나
MGS 툴세미나Bonex Gu
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑MinGeun Park
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shadingMinGeun Park
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Minsu Park
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템Young Soo Kim
 
[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기changehee lee
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기진현 조
 
gv005_1 ver0.1
gv005_1 ver0.1gv005_1 ver0.1
gv005_1 ver0.1Glenn Chae
 
Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해SangYun Yi
 
2강 텍스쳐 포맷과 기초 / 오타수정
2강 텍스쳐 포맷과 기초 / 오타수정2강 텍스쳐 포맷과 기초 / 오타수정
2강 텍스쳐 포맷과 기초 / 오타수정JP Jung
 
1.c term project report
1.c term project report1.c term project report
1.c term project report호상 장
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shadingMinGeun Park
 
아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기changehee lee
 
2강 텍스쳐 포맷과 기초
2강 텍스쳐 포맷과 기초2강 텍스쳐 포맷과 기초
2강 텍스쳐 포맷과 기초JP Jung
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)Dong Chan Shin
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)포프 김
 

Similar a 내 손에 픽셀을 쥐어다오 (20)

[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
[데브루키]노대영_프린이를 위하여(프로그래밍 어린이)
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기
 
MGS 툴세미나
MGS 툴세미나MGS 툴세미나
MGS 툴세미나
 
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
[0107 박민근] 쉽게 배우는 hdr과 톤맵핑
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
 
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
[IGC2017] Protocol:hyperspace Diver 개발 포스트모템
 
[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기[Kgc2013] 모바일 엔진 개발기
[Kgc2013] 모바일 엔진 개발기
 
[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기[조진현] [Kgc2011]direct x11 이야기
[조진현] [Kgc2011]direct x11 이야기
 
gv005_1 ver0.1
gv005_1 ver0.1gv005_1 ver0.1
gv005_1 ver0.1
 
Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해
 
Devtree illu
Devtree illuDevtree illu
Devtree illu
 
2강 텍스쳐 포맷과 기초 / 오타수정
2강 텍스쳐 포맷과 기초 / 오타수정2강 텍스쳐 포맷과 기초 / 오타수정
2강 텍스쳐 포맷과 기초 / 오타수정
 
1.c term project report
1.c term project report1.c term project report
1.c term project report
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
[0326 박민근] deferred shading
[0326 박민근] deferred shading[0326 박민근] deferred shading
[0326 박민근] deferred shading
 
아이폰에 포팅해보기
아이폰에 포팅해보기아이폰에 포팅해보기
아이폰에 포팅해보기
 
2강 텍스쳐 포맷과 기초
2강 텍스쳐 포맷과 기초2강 텍스쳐 포맷과 기초
2강 텍스쳐 포맷과 기초
 
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
C# / .NET Framework로 미래 밥그릇을 챙겨보자 (Basic)
 
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
스크린 스페이스 데칼에 대해 자세히 알아보자(워햄머 40,000: 스페이스 마린)
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Wonjun Hwang
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Wonjun Hwang
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 

Último (6)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)Merge (Kitworks Team Study 이성수 발표자료 240426)
Merge (Kitworks Team Study 이성수 발표자료 240426)
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 
Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)Console API (Kitworks Team Study 백혜인 발표자료)
Console API (Kitworks Team Study 백혜인 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 

내 손에 픽셀을 쥐어다오

  • 1. 내 손에 픽셀을 쥐어다오 청강문화산업대학 콘텐츠스쿨 교수 별바람 스튜디오 대표 별바람(김광삼)
  • 2. 내 손에 픽셀을 쥐어다오 iOS에서 OpenGL ES를 이용한 8비트 픽셀 처리와 포팅 청강문화산업대학 콘텐츠스쿨 교수 별바람 스튜디오 대표 별바람(김광삼)
  • 3. 게임을 이식하기로 했다. 난 이제 뭘 해야 하는 거지?
  • 6. 뭘 이식할 생각이었냐면 혈십자, 이 저주받은 게임이었죠.
  • 7. 처음엔 쉽게 생각했었다. 어차피 게임이 돌아갈 구조란 뻔하니까.
  • 8. 오브젝티브 씨? 이건 또 뭐야? 어차피 개념은 비슷할테니 어찌 되겠지만..
  • 9. 그냥 귀찮은데 엔진 있지 않나? 제자들을 보니 Cocus2D, Unity3D, UDK등 많이 쓰던데?
  • 10. ..하지만 문제가 있었다 일단 메모리 부터가 문제다
  • 11. 미칠듯한 스프라이트의 압박 캐릭터 하나마다 이런 방식으로 30-40장을 사용 옆의 캐릭터가 그나마 가장 적은데 8비트(!) BMP 파일로 9.45M 의 용량. 적 캐릭터는? 배경은? 음악은? 동작 데이터 는? 캐릭터 보이스는? 그런데 2P, 3P, 4P, 5P, 6P 컬러도 바꿔야..
  • 12. WTF!!! 용량이 문제잖아!! 8비트.. 8비트가 필요해..
  • 13. 하지만 ‘요즘’ 엔진들에게 8-bit는.. 누가 그런 걸 쓰냐고?
  • 14. 그래, 나는 노땅이다 그리고 픽셀을 만지지 못하는 코딩이 싫다 메인 루프를 만지작 거리지 않는 구조는 취향이 아냐
  • 15. ..하지만 어찌 될거야 쿼츠 2D가 있잖아 어차피 픽셀만 제어하면 어찌 되거든..
  • 16.
  • 17.
  • 19.
  • 20.
  • 22. 어어.. 이거 곤란한데? 좀 더 하부 제어로 내려가지 않으면..
  • 23. 결국 최후의 보루는 OpenGL인가 내 주변에 이거 쓰는 사람은 아무도 없지만..
  • 24. 좌절의 나락에 빠질때 쯤 어느 책의 예제를 보다 깨달았다. 호오.. 텍스춰.. 텍스춰라고? 결국 Array란거잖아?
  • 25. 화면 가득 텍스춰로 잡아놓으면 원하는 좌표에 점을 찍을 수가 있다!!!
  • 26.
  • 27. 즉, OPEN GL의 텍스춰로 백버퍼를 만들어버리는거다!
  • 28. 이 화면을 처음 보았을때 얼마나 기뻤는지 모른다. (눈에 캐릭터가 보이는 것 같지만 착각입니다.)
  • 29. 이 화면을 처음 보았을때 얼마나 기뻤는지 모른다. (눈에 캐릭터가 보이는 것 같지만 착각입니다.)
  • 30. “점 하나 그렇게 힘들게 찍는 놈은 처음 본다”
  • 31. ..하지만 문제는 속도야 바보야. 텍스쳐에 일일히 점을 찍는다고? 그게 속도가 나올리가..
  • 32. ..나오더군요. 의외로 빨라서 놀랐습니다. 전체 화면을 2겹으로 계속 갱신해대는데도 100프레임을 훨씬 넘어서는 스피드..
  • 33. 내 손에 픽셀 하나만 쥐어다오. 달인에게 연필을 쥐어주면 사람을 죽일 수 있듯이, 개발자에게 픽셀을 쥐어주면 .. 90년대에는 다들 그렇게 만들었으니까요.
  • 34. 게다가 C++코딩이 가능하다!! 만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!!
  • 35. 게다가 C++코딩이 가능하다!! 만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!!
  • 36. 게다가 C++코딩이 가능하다!! 만세!! 기존의 메인 코드는 그대로 옮겨올 수 있어!! OpenGL 에게 축복을!!
  • 37. 간단히 말하면, 텍스춰를 화면보다 크게(512x512) 잡아서 백버퍼를 만들고 여기에 직접 이미지를 그린다. 이로써 8-bit indexed 컬러의 이미지도 백버퍼(실은 24 혹은 32비트)에 올릴수 있고, 삐~하고 삐~한 장난질이 가능하다!!
  • 38. 잠깐만!! 갑자기 왜 8비트??? 지금이 어느 시대인데 8-Bit 컬러를?
  • 39. 다시 이걸 봅시다. 이 그림의 용량은? 8-bit = 640*480+256*3 16-bit = 640*480*2 24-bit = 640*480*3 32-bit = 640*480*4 이런 그림이 캐릭터당 30-40장이 쓰인다면.. 쉬운 답은 8-bit 뿐이다
  • 40. 하지만 256컬러는 너무.. 아무리 복고풍이 유행이라지만요.
  • 41. 8-BIT INDEXED COLOR? R,G,B 정보를 8비트에 담는 것은 무리. (3-3-2로 나눈다고 생각하면 끔찍하죠) 즉, 256개의 프리셋(팔레트)을 만들고, 픽셀은 이 팔렛(프리셋)값을 저장한다. 이미지 하나당 최대 256가지 색만 쓴다면 팔렛에는 자유롭게 R,G,B를 세팅한다. 즉, 이미지가 크지 않다면 무시하기 못할 퀄리티가 나온다.
  • 43. 소스 데이터로써 8비트 어차피 백버퍼는 24 혹은 32비트라고 가정하면, 스프라이트, 혹은 텍스춰 등의 게임 소스 비트맵을 8비트 데이터로써 메모리에 올릴 수 있다. 이로써 생기는 장점은 메모리 사용의 감소. 그리고, 팔렛변환의 특징인 손쉬운 색상 변환이다. (격투게임등의 2P, 3P 컬러 같은 것을 구현하기 위해) 스프라이트마다 개별적인 팔렛을 가질 수 있으므로, 최종적인 결과 화면은 256컬러가 아니다!
  • 44. 여기에 RLE 를 사용한다면? RLE(Realtime Length Encoding)을 기억하시나요? 더 적은 메모리 점유와 빠른 블리팅
  • 45. RLE 의 원리 근본적으로 반복되는 숫자를 횟수로 줄임
  • 46. 그리고 그 결과는? 302KB 가 77KB로!!! 하지만 기억해야 할 것. 최종적인 zip압축률은 비슷하나 약간 손해. 즉, 메모리에 압축상태로 올려야 의미 있음.
  • 47. 이보다 더 효율을 높이려면? Bit-Flag Compression BRP(Byulbram-Rupaus Package)..형식 등등 각자 개량하기 나름
  • 48. 그래서 실제로 어떻게 짜는데? 일단 기본적인 코드의 예제를 봅시다.
  • 49. 기본적인 원리 1. OpenGL ES 1.1템플릿의 어플리케이션 생성 2. 화면사이즈보다 크게 GLubyte* 로 백버퍼 선언 3. 백버퍼에 직접 픽셀 쓰기 (백버퍼의 데이터 순서는 좌표 기준으로, (0,0) R, (0,0) G, (0,0) B, (0,0) A, (1,0) R...의 순서 즉 (X + (Y * Max_X))*BitRate)+color 로 접근. 4. 백버퍼를 glTexImage2D 로 텍스쳐로 만든다. 5. 사각형 폴리곤을 생성하여 화면가득 렌더링 참 쉽죠?
  • 50. 백버퍼 생성 예제 코드 CK2D_Texture CreateBackBuffer() { ! int i, x, y, ix, iy; ! ! CK2D_Texture tTxr; ! ! tTxr.Width = TEX_SIZE_X; ! tTxr.Height = TEX_SIZE_Y; ! ! ! backbuffer = (GLubyte *) malloc(tTxr.Width * tTxr.Height * BIT_RATE); ! memset(backbuffer, 0, TEX_SIZE_X * TEX_SIZE_Y * BIT_RATE);! ! ix = 0; ! iy = 0; ! ! ! glGenTextures(1, &tTxr.ID); ! glBindTexture(GL_TEXTURE_2D, tTxr.ID); ! ! glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tTxr.Width, tTxr.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, backbuffer); ! ! glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); ! glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); ! ! glEnable(GL_TEXTURE_2D); ! ! ! return tTxr; }
  • 51. 비트맵 출력 예제 void BITMAPDraw ( int iX, int iY, stcRECT area, int iFlip, int isColorkey, stcBMPDATA bmp) { ! int iWidth, iHeight; ! if (bmp.isCompressed) ! ! RLEDraw(iX, iY, area, iFlip, isColorkey, bmp); ! ! iWidth = bmp.iWidth; ! iHeight = bmp.iHeight; <------- 스크롤의 압박으로 클리핑 파트 생략 -----------> ! int iShit, iCrap; ! BYTE bColor; ! int iCal; ! int iCalY; int iCalY2; ! for ( iShit = 0; area.iHeight > iShit; iShit++ ) ! { ! ! iCalY = ((iShit-iY+(MAX_Y-area.iHeight) ) * TEX_SIZE_X ); ! ! iCalY2 =( (iShit+area.iY) * (bmp.iWidth + bmp.iSpan) ) ! ! ! ! for ( iCrap = 0; area.iWidth > iCrap; iCrap++ ) ! ! { ! ! ! bColor = bmp.ImageData [ iCrap+area.iX + iCalY2]; ! ! ! iCal = (((iCrap+iX) + iCalY) * BIT_RATE); ! ! ! ! ! ! if (( bmp.iColorkey != bColor ) || (isColorkey == 0)) ! ! ! { ! ! ! ! backbuffer[iCal] = bmp.color [ bColor ].ir; ! ! ! ! backbuffer[iCal+1] = bmp.color [ bColor ].ig; ! ! ! ! backbuffer[iCal+2] = bmp.color [ bColor ].ib;! ! ! ! ! ! ! ! ! } ! ! } ! } }
  • 52. 그럼 정말 쉽게 만들수 있나? 항상 말은 쉽습니다만..
  • 53. 개고생하게 되는 것들 1. 그래픽 리소스 파일 읽어오기. 2. 좌표계가 좀 달라서 헷갈린다. 3. 다양한 압축 포맷의 효율 최적화 4. 한글 구현은 지옥. 간단히 말하면 DOS 시절, 맨땅에 헤딩하던 것은 모조리 다시 한다고 생각하면 된다.
  • 54. 그래서 결과는 어떤가? Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓
  • 55. 그래서 결과는 어떤가? Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓
  • 56. 그래서 결과는 어떤가? Xcode에 처음 손댄게 9월 27일.. 그리고 1달 남짓 첫 3주일간 CK2D 엔진을 구축 이후 1주일 만에 첫 메인 게임 구동 성공 다시 1주일만에 대부분의 기능 구현
  • 57. CK2D 엔진? OpenGL ES 1.1 기반 백버퍼/픽셀제어 기반의 2D 그래픽 제어 비압축, RLE8압축 8비트 BMP형식 지원 BRP, BBR(BRP2.0) 압축 스프라이트 지원 반투명, 모션블러 이펙트 지원 3D스프라이트 지원 비트맵 한글 출력 지원
  • 58. CK2D 엔진? OpenGL ES 1.1 기반 백버퍼/픽셀제어 기반의 2D 그래픽 제어 비압축, RLE8압축 8비트 BMP형식 지원 BRP, BBR(BRP2.0) 압축 스프라이트 지원 반투명, 모션블러 이펙트 지원 3D스프라이트 지원 비트맵 한글 출력 지원 포맷 변환툴, 소스코드 공개 예정
  • 59. 이식 작업을 위한 간단한 팁 1. 먼저 그래픽 출력 기능부터 래핑 코드를 짜자. 2. 모든 그래픽 명령이 래핑되면 컨트롤 파트를. 3. 사운드는 일단 전부 주석처리를 해놓은채로 소스코드를 그래픽/컨트롤 위에 쌓아올린다. 4. 리소스 파일의 경로를 꼭 주의할 것.
  • 60. 작업 하며 느낀 점들 1. iPhone의 성능이 생각보다 강력하다. 2. 웬만한 백버퍼 방식의 90년대 게임은 이식 가능 (제 그녀의 기사단 원작도 이식 가능할 듯) 3. PC와 Mac을 오가며 작업하다 보면 헷갈린다. (가급적 Visual Studio와 Xcode의 단축키를 통일) 4. 오브젝티브-C 와 단순화된 구조가 싫은 노땅은 OpenGL ES 를 하자.

Notas del editor

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n