(모바일) 엔진 개발기
Kasastudy (2013.05.16)
이창희(cagetu79@gmail.com)
모바일
• 시장의 변화를 감지
• 처음에는 적극적으로 대응하지 않음
• 간단하게 OpenGL ES 를 지원하도록 해보자… 정도
• 엔진을 크게 수정하지 않고, OpenGL ES 만 추가적으로 적용
• 모바일이라도 특별하게 엔진을 줄이지 않음
• 포팅하면서 겪은 이야기 여기로!!!
모바일에 대한 이해
•하드웨어 성격
•OpenGL ES 성격
하드웨어 특징
• GPU 아키텍쳐 / 성능 / 메모리에 따라서,
고려해야 할 것이 다름
OpenGL ES 2.0 간단 리뷰
• 한 프레임의 구성
• http://cagetu.egloos.com/5737164
OpenGL ES 2.0 간단 리뷰
• Designing a High-Performance
• http://cagetu.egloos.com/5737210
• Summary
• Static Resource 사용하라
• Rendering 결과 얻기를 피하라
• glGetXXX
정리하면…
• Alpha Test 보다는 Alpha Blend!
• Alpha Blend 사용 영역을 최소화!!!!!!
• RenderTarget 전환을 줄여야 함
• 사용하지 않는 RenderTarget 내용은 제거하라
• Draw Call을 줄여라!
• Render State / Shader Switch 등을 줄여라
• Static Buffer / Texture을 사용하라
• 프레임 중간에 렌더링 상태를 얻어오지 말아라!
• 버텍스 사이즈를 줄여라!
• …
사례 발표
이슈 및 해결
사례 1. 폰트 텍스쳐 오류
• 입력이 들어오면 즉시 Dynamic Texture에 기록!!
• glTexSubImage2D
• 입력을 일괄적으로 기록하도록 변경으로 해결
사례 2. 배칭
• Draw Call을 줄이자!
• Sorting
• Distance (Front->Back, Back->Front)
• RenderState
• ShaderState
• Mesh ID
• Batching
• 전통적인 모아서 찍기!
• Static Mesh : 버텍스 64개 이하
• Skinned Mesh : 320개 정도의 작은 것들 모음
사례 3. Buffer Object
• OpenGL ES에서의 “버텍스/인덱스 버퍼”
• (일반적으로) 사용을 권장!
• But,
• iPhone4로 테스트 결과, 엄청나게 느려지는 문제 발생
• Cocos2D의 경우도 이런 문제가 있었음
• http://www.cocos2d-iphone.org/forum/topic/21829
• 증상> 대략 xcode 4 로 업데이트 했더니 느려졌다!!!
• 해결
• Static 버퍼 with VBO / IBO
• Dynamic 버퍼 without VBO / IBO
사례 4. 알파 블랜딩
• 화면에서 알파 블랜딩이 차지하는 비중에 높을수록 느려짐
• Present에서 지연 됨 (FillRate)
• CPU는 놀고, GPU는 죽고 있음
• 특히, iPhone4 / iPad1과 같이 FillRate가 낮은 기기에서는 최악!
• 해결책
• 알파를 사용하는 부분을 줄이는 것이 최선!
• 작은 렌더타겟에 그려서 늘여찍는 방법
• 파티클과 같이 동적인 알파객체들에게는 적합함
• http://blog.naver.com/sorkelf/40186066235
사례 5. 렌더타겟
• 렌더타겟 사이즈가 작으면 작을수록 비용 절감!
• 렌더타겟 전환은 굉장히 비용이 많이 들어감!
• 해결책
• 패스를 늘리지 않는다.
• 렌더타겟 전환을 최소화!
• 적당히 늘여찍기!
• 렌더타겟 재사용
• PowerVR에서는 같은 렌더타겟을 읽고 쓰기가 가능! (DirectX 불가능)
• 렌더타겟 전환을 하지 않고, Viewport만 변경해서 렌더링이 가능
• Post Processing에 사용하면 굿!!!
• http://blog.naver.com/sorkelf/40186066235
사례 6. 셰이더
• 복잡한 연산은 버텍스 셰이더에서 처리하자!
• 내부 함수은 너무 느리다!!!
• Pow(x, 4) 와 x*x*x*x 는 같은 결과지만 속도는 천지차이!
• Shader 컴파일 시간은 오래 걸린다.
• 셰이더 빌드 바이너리 캐쉬 기능이 있기는 하지만, 사용할 수 없음
• 일반적으로 로딩할 때, 미리 컴파일 하는 방식 (로딩 길다!)
• 동적 분기는 사용하기 어렵다고 봐야 함
사례 7. 디버깅
• Xcode OpenGL Driver 프로파일러 굿!
• HUD 측정장치 간단하게!
• Gpg에 소개된 정도면…
• 하지만,
• 모니터링을 위한 더 많은 장치가 필요!
• 아쉽다!!!
정리
정리
• 기본적으로 DirectX 기반에서 크게 벗어나지는 않는다.
• 하드웨어 특성이나 OpenGL 작동 방식을 잘 알아두면 최적화 방
향을 찾을 수 있다.
• 모바일 하드웨어의 성능은 생각보다 상당히 좋다.
• PC 기반 고퀄리티 그래픽은 기술적보다 “미학적”으로 어렵더라
• http://cagetu.egloos.com/5636186
아쉬운 점
• 2D를 이렇게 많이 사용하게 될 줄은 몰랐다.
• 3D에 관련된 내용을 중심으로 엔진을 구성했는데, 정작 게임은 2D 기반
이 상당히 많다!
•툴!!!!! 디버깅!!!!
• 성능/기능 등은 괜찮았으나, 게임 개발을 빠르게 해줄 수 있는 장치들이
얼마나 중요한지 절감함!
앞으로 어떻게?
• 현재 추세
• PC < Mobile
• 3D < 2D
• 대중적인 엔진
• Unity3D / Cocos2D
• 무엇이 강점인가?
•게임 엔진도 패러다임의 전환이 필요한 시점!!!!
• 고성능 / 다기능?
• 빠른 개발!!!!!
• (게임) 개발시간을 빠르게 할 수 있는 장치!!!!
많이 배웠다!
• 하지만, 잘하지는 못했다!

모바일 엔진 개발기

  • 1.
    (모바일) 엔진 개발기 Kasastudy(2013.05.16) 이창희(cagetu79@gmail.com)
  • 2.
    모바일 • 시장의 변화를감지 • 처음에는 적극적으로 대응하지 않음 • 간단하게 OpenGL ES 를 지원하도록 해보자… 정도 • 엔진을 크게 수정하지 않고, OpenGL ES 만 추가적으로 적용 • 모바일이라도 특별하게 엔진을 줄이지 않음 • 포팅하면서 겪은 이야기 여기로!!!
  • 3.
  • 4.
    하드웨어 특징 • GPU아키텍쳐 / 성능 / 메모리에 따라서, 고려해야 할 것이 다름
  • 14.
    OpenGL ES 2.0간단 리뷰 • 한 프레임의 구성 • http://cagetu.egloos.com/5737164
  • 15.
    OpenGL ES 2.0간단 리뷰 • Designing a High-Performance • http://cagetu.egloos.com/5737210 • Summary • Static Resource 사용하라 • Rendering 결과 얻기를 피하라 • glGetXXX
  • 16.
    정리하면… • Alpha Test보다는 Alpha Blend! • Alpha Blend 사용 영역을 최소화!!!!!! • RenderTarget 전환을 줄여야 함 • 사용하지 않는 RenderTarget 내용은 제거하라 • Draw Call을 줄여라! • Render State / Shader Switch 등을 줄여라 • Static Buffer / Texture을 사용하라 • 프레임 중간에 렌더링 상태를 얻어오지 말아라! • 버텍스 사이즈를 줄여라! • …
  • 17.
  • 18.
    사례 1. 폰트텍스쳐 오류 • 입력이 들어오면 즉시 Dynamic Texture에 기록!! • glTexSubImage2D • 입력을 일괄적으로 기록하도록 변경으로 해결
  • 19.
    사례 2. 배칭 •Draw Call을 줄이자! • Sorting • Distance (Front->Back, Back->Front) • RenderState • ShaderState • Mesh ID • Batching • 전통적인 모아서 찍기! • Static Mesh : 버텍스 64개 이하 • Skinned Mesh : 320개 정도의 작은 것들 모음
  • 20.
    사례 3. BufferObject • OpenGL ES에서의 “버텍스/인덱스 버퍼” • (일반적으로) 사용을 권장! • But, • iPhone4로 테스트 결과, 엄청나게 느려지는 문제 발생 • Cocos2D의 경우도 이런 문제가 있었음 • http://www.cocos2d-iphone.org/forum/topic/21829 • 증상> 대략 xcode 4 로 업데이트 했더니 느려졌다!!! • 해결 • Static 버퍼 with VBO / IBO • Dynamic 버퍼 without VBO / IBO
  • 21.
    사례 4. 알파블랜딩 • 화면에서 알파 블랜딩이 차지하는 비중에 높을수록 느려짐 • Present에서 지연 됨 (FillRate) • CPU는 놀고, GPU는 죽고 있음 • 특히, iPhone4 / iPad1과 같이 FillRate가 낮은 기기에서는 최악! • 해결책 • 알파를 사용하는 부분을 줄이는 것이 최선! • 작은 렌더타겟에 그려서 늘여찍는 방법 • 파티클과 같이 동적인 알파객체들에게는 적합함 • http://blog.naver.com/sorkelf/40186066235
  • 22.
    사례 5. 렌더타겟 •렌더타겟 사이즈가 작으면 작을수록 비용 절감! • 렌더타겟 전환은 굉장히 비용이 많이 들어감! • 해결책 • 패스를 늘리지 않는다. • 렌더타겟 전환을 최소화! • 적당히 늘여찍기! • 렌더타겟 재사용 • PowerVR에서는 같은 렌더타겟을 읽고 쓰기가 가능! (DirectX 불가능) • 렌더타겟 전환을 하지 않고, Viewport만 변경해서 렌더링이 가능 • Post Processing에 사용하면 굿!!! • http://blog.naver.com/sorkelf/40186066235
  • 23.
    사례 6. 셰이더 •복잡한 연산은 버텍스 셰이더에서 처리하자! • 내부 함수은 너무 느리다!!! • Pow(x, 4) 와 x*x*x*x 는 같은 결과지만 속도는 천지차이! • Shader 컴파일 시간은 오래 걸린다. • 셰이더 빌드 바이너리 캐쉬 기능이 있기는 하지만, 사용할 수 없음 • 일반적으로 로딩할 때, 미리 컴파일 하는 방식 (로딩 길다!) • 동적 분기는 사용하기 어렵다고 봐야 함
  • 24.
    사례 7. 디버깅 •Xcode OpenGL Driver 프로파일러 굿! • HUD 측정장치 간단하게! • Gpg에 소개된 정도면… • 하지만, • 모니터링을 위한 더 많은 장치가 필요! • 아쉽다!!!
  • 25.
  • 26.
    정리 • 기본적으로 DirectX기반에서 크게 벗어나지는 않는다. • 하드웨어 특성이나 OpenGL 작동 방식을 잘 알아두면 최적화 방 향을 찾을 수 있다. • 모바일 하드웨어의 성능은 생각보다 상당히 좋다. • PC 기반 고퀄리티 그래픽은 기술적보다 “미학적”으로 어렵더라 • http://cagetu.egloos.com/5636186
  • 27.
    아쉬운 점 • 2D를이렇게 많이 사용하게 될 줄은 몰랐다. • 3D에 관련된 내용을 중심으로 엔진을 구성했는데, 정작 게임은 2D 기반 이 상당히 많다! •툴!!!!! 디버깅!!!! • 성능/기능 등은 괜찮았으나, 게임 개발을 빠르게 해줄 수 있는 장치들이 얼마나 중요한지 절감함!
  • 28.
    앞으로 어떻게? • 현재추세 • PC < Mobile • 3D < 2D • 대중적인 엔진 • Unity3D / Cocos2D • 무엇이 강점인가? •게임 엔진도 패러다임의 전환이 필요한 시점!!!! • 고성능 / 다기능? • 빠른 개발!!!!! • (게임) 개발시간을 빠르게 할 수 있는 장치!!!!
  • 29.
    많이 배웠다! • 하지만,잘하지는 못했다!