블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2795)
Unity3D (852)
Programming (478)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

컬링(Culling)

  • 최종 화면에 영향을 미치지 않는 물체를 파악하고 이를 렌더링 대상에서 제외시켜 필요한 물체만 그리는 기법
  • 프러스텀 컬림(Frustum Culling)
    • 가장 기본적이면서도 효과가 좋은 방법
    • 카메라 영역내의 공간 정보만 살려두고 영역 외부에 설정된 정보는 모두 버림
    • 카메라에 프로젝트에 설정된 레이어별로 차단 거리(Per-Layer Cull Distances)를 지정하면 이 값을 사용해 레이어에 속한 게임 오브젝트들을 컬링함
  • 오클루젼 컬링(Occlusion Culling)
    • 기존의 절두체를 이용한 컬링 기법의 한계를 보완하고 효율적으로 공간 정보를 관리해 빠르게 렌더링을 수행할 수 있게 도와주는 기법
    • Unity의 Windows => Occlusion Culling 메뉴를 통해 설정
    • 오클루젼 컬링 제작방법
      1. 오클루젼 영역 설정
      2. 오클루젼 컬링 데이터 제작
      3. 최종 결과 시뮬레이션
    • 오클루젼 포털(Occlusion Portal)
      • 오클루젼 영역을 스크립트로 조절하는 기능

드로우 콜 배칭(Draw Call Batching)

  • 텍스쳐 아틀라스(Texture Atlas)를 사용하여 콜수를 줄임
  • 성질이 동일한 물체들을 하나의 메시와 재질을 사용하게 통합
    • 여러 게임 오브젝트의 메시를 하나의 메시로 통합해주는 CombineChildren 컴포넌트를 제공
    • 최상위 게임 오브젝트에 이 컴포넌트를 사용하면 자식 오브젝트들이 갖는 메시들을 분석한 후 재질별로 메시를 통합해 재가공함
    • 컴바인 메시(Combined Mesh)를 통한 작업시 주의할 점
      • 게임 오브젝트들을 통합하면 게임 오브젝트별로 움직일 수 없게 됨
      • 관련된 빛의 계산이 통합된 모든 메시를 대상으로 수행됨
    • 메터리얼(Materials)
      • 다른 텍스쳐에 있는 두개의 독립적인 메터리얼을 하나의 큰 텍스쳐로 결합 할 수 있음(텍스처 아틀라스)
      • 일단 텍스처를 동일한 아틀라스로 묶으면 단일 메터리얼로 사용할 수 있게 됨
    • 배칭(Batching)
      • 현재 씬의 상황을 판단해 자동으로 드로우 콜을 줄이게 최적화하는 기능

      • 정적 배칭 Static Batching (Pro required)

        • Static 옵션이 설정된 게임 오브젝트에서 동일한 재질을 사용하는 물체가 있는 경우 유니티는 이들을 자동으로 하나의 메시로 통합 관리함
        • 움직이지 않는 물체에 대해 지정만 하면 자동으로 수행
      • 동적 배칭 Dynamic Batching

        • 움직이는 물체를 대상으로 동일한 재질을 사용하는 경우 이를 판단해 자동으로 메시를 통합해 드로우 콜을 줄여주는 기능
        • 총 정점의 데이터 수가 900개 미만인 메시를 지닌 게임 오브젝트만을 대상으로 수행됨
        • 메시 데이터가 위치 외에도 노멀, UV, 라이트맵 UV 등 총 3개의 속성을 갖고 있는 경우 정점의 수가 225개를 넘으면 동적 배칭이 적용되지 않음

최적의 퍼포먼스를 위한 캐릭터 모델링(Modeling Characters for Optimal Performance)

  • 싱글 스킨 메쉬 렌더러 사용

    • 각 캐릭터에 스킨 메쉬 렌더러(class-SkinnedMeshRenderer)는 하나여야 합니다.
    • Unity는 시야 컬링 및 경계 볼륨의 업데이트를 사용하여 애니메이션을 최적화하고, 이러한 최적화는 하나의 애니메이션 컴포넌트 및 하나의 스킨 메쉬 렌더러를 사용하는 경우에만 활성화됩니다.
    • 모델의 렌더링 시간은 두개의 스킨 메쉬를 사용할때 하나의 스킨 메쉬를 사용 할 때보다 대략 2배 정도 이며, 여러개의 메쉬를 사용하여 실질적인 메리트가 있는 일은 드뭅니다.
  • 가능한 메터리얼을 적게 사용

    • 각 메쉬의 메테리얼의 수를 최대한 적게 해야 합니다.
    • 여러 메테리얼을 캐릭터에서 사용하는 이유는, 다른 부분에서 다른 쉐이더가 필요한 경우 뿐 입니다(예를 들면 눈 부분은 특수 쉐이더).
    • 그러나 캐릭터에서 두 개 또는 세 개의 메테리얼로 거의 모든 케이스에 충분 합니다.
  • 가능한 한 본(Bones)를 적게 사용

    • 전형적인 데스크톱 게임의 본 계층은 15개에서 60개 사이의 본을 사용합니다.
    • 본의 수가 적을수록 퍼포먼스가 좋아집니다.
    • 30개 정도의 본으로 데스크톱 플랫폼에서는 아주 좋은 품질을 얻을 수 있고, 모바일 플랫폼에서도 비교적 좋은 품질을 얻을 수 있습니다.
    • 이상적으로는 모바일 장치에서는 30개보다 적게 하고, 데스크톱 게임에서도 30개를 크게 초과하지 않도록 합니다.
  • 폴리곤 갯수를 적게 사용

    • 폴리곤 수는 필요한 품질 및 대상 플랫폼에 의존합니다.
    • 모바일 장치는 메쉬 당 300에서 1500 폴리곤으로 좋은 결과를 얻을 수 있으며, 데스크톱 플랫폼에서의 이상적인 범위는 1500에서 4000 정도입니다.
    • 반면, 게임에 많은 캐릭터가 있을 때 메쉬 당 폴리곤의 수를 줄일 필요가 있을 것 입니다.
    • 예를 들어, Half Life 2는 캐릭터에 2500 - 5000 삼각형 수였습니다.
    • 현재 PS3와 XBox 360의 최고 랭크 게임은 보통 캐릭터에 5000에서 7000 삼각형 수입니다.
  • 포워드 및 역운동학을 분리

    • 애니메이션이 임포트 될 때, 모델의 역운동학(IK) 노드는 포워드 운동학(FK)에 베이크(baked)된 결과로 Unity는 IK 노드가 전혀 필요 없습니다.
    • 그러나 모델에 남아있으면 애니메이션에 영향을 미치지 않음에도 불구하고 CPU 오버 헤드가 발생합니다.
    • 선호에 따라 Unity 또는 모델링 도구, 어느 것이든 중복 IK 노드를 제거할 수 있습니다.
    • 이상적으로는 IK 및 FK 계층을 모델링 시에 별도로 보관하여 필요할 때 IK 노드를 쉽게 제거할 수 있도록 해야 합니다.

렌더링 통계 창(Rendering Statistics Window) 확인

  • Time per frame and FPS
    • 하나의 게임 프레임을 처리 및 렌더링하는데 걸린 시간(프레임/초)
    • 이 숫자는 프레임 업데이트 및 게임 뷰의 렌더링에 걸린 시간만 포함되는 것에 유의
    • 에디터가 씬 뷰 인스펙터의 그리기 및 에디터 전용 작업을 수행하는데 걸린 시간은 포함되지 않음
  • Batches
    • “Batching” is where the engine attempts to combine the rendering of multiple objects into a chunk of memory in order to reduce CPU overhead due to resources switching.
  • Saved by batching
    • Number of batches that was combined. To ensure good batching, you should share materials between different objects as often as possible.
    • Changing rendering states will break up batches into groups with the same states.
  • Tris and Verts 그려진 삼각형과 정점의 수. 이것은 optimizing for low-end hardware에서 중요합니다.
  • Screen 화면 크기, 안티 앨리어싱 레벨 및 메모리 사용량.
  • SetPass 렌더링 패스의 수. 각 패스에 대해서 유니티 런타임은 CPU 오버헤드를 가져올 수 있는 새로운 쉐이더를 바인딩한다.
  • Visible Skinned Meshes 렌더링된 스킨 메쉬 수
  • Animations 재생 에니메이션 수

프레임 디버거(Frame Debugger)

  • 메뉴: Window > Frame Debugger
  • 매 프레임마다 그리는 오브젝트 정보를 보여줌

쉐이더 로딩타임 최적화(Optimizing Shader Load Time)

항상 포함하는 쉐이더와 미리 로딩해야 하는 쉐이더 집합을 설정하여 쉐이더 로딩시간을 효율적으로 관리해 줌

  • 항상 포함하는 쉐이더(Always Included Shaders)

    • Project Settings > Graphics > Always Included Shaders
  • 미리 로딩하는 여러가지 쉐이더 집합(Preloaded Shader Variant Collection)

    • 쉐이더 집합 생성

    • Assets > Create > Shader Variant Collection

    • 쉐이더 집합 미리 로딩 목록에 추가

    • Project Settings > Graphics > Preloaded Shaders

텍스처 캐시(Texture Cache)

  • 모바일의 경우 GPU 제조사에서 권장하는 텍스처 포멧을 사용하면 캐시 적중률이 높아져 속도의 향상을 얻게 되며, 특히 GPU의 성능이 약한 스마트폰 기기에서는 이러한 부분의차이가 큼
  • 플랫폼별 권장 텍스처 포멧
  • 안드로이드 텍스처 압축 지원
    • http://stackoverflow.com/questions/9148795/android-opengl-texture-compression/9514396#9514396
    • ETC1 (Ericsson texture compression)
      • This format is supported by all? Android phones.
      • But, It doesn't support an alpha channel, so can only be used for opaque textures.
    • PVRTC (PowerVR texture compression)
      • Supported by devices with PowerVR GPUs (Nexus S, Kindle fire ...)
    • ATITC (ATI texture compression)
      • Used in devices with Adreno GPU from Qaulcomm (Nexus One ...)
    • S3TC (S3 texture compression)
      • This texture compression is used in the NVIDIA chipset integrated devices (Motorola Xoom ...)
  • 안드로이드 Developer에 정의된 내용
    • https://developer.android.com/guide/topics/graphics/opengl.html#textures
    • ATITC (ATC) - ATI texture compression
      • GL_AMD_compressed_ATC_texture
      • GL_ATI_texture_compression_atitc
    • PVRTC - PowerVR texture compression
      • GL_IMG_texture_compression_pvrtc
    • S3TC (DXTn/DXTC) - S3 texture compression
      • GL_OES_texture_compression_S3TC
      • GL_EXT_texture_compression_s3tc
      • GL_EXT_texture_compression_dxt1
      • GL_EXT_texture_compression_dxt3
      • GL_EXT_texture_compression_dxt5
    • 3DC - 3DC texture compression
      • GL_AMD_compressed_3DC_texture
// Texture compression supported on Android
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  Strings = gl.glGetString(GL10.GL_EXTENSIONS);
 
  if (s.contains("GL_IMG_texture_compression_pvrtc")) {
    // Use PVRTC compressed textures
  } else if (s.contains("GL_AMD_compressed_ATC_texture") ||
             s.contains("GL_ATI_texture_compression_atitc")) {
    // Use ATITC compressed textures
  } else if (s.contains("GL_OES_texture_compression_S3TC") ||
             s.contains("GL_EXT_texture_compression_s3tc")) {
    // Use DTX Textures
  } else {
    // Handle no texture compression founded
  }
}

텍스처 설정

  • Texture
  • Normal map
  • Editor GUI and Legacy GUI
  • Sprite (2D and UI)
  • Cursor
  • Reflection
  • Cookie
  • Lightmap
  • Advanced

텍스처 포멧지원 확인

텍스처 생성팁

오버드로우(Overdraw)

  • 물체가 겹쳐서 뒤에 있는 물체를 그린후에 앞에 있는 물체를 다시 그리면 겹치는 부분만큼 픽셀을 계산해서 그려야 함
  • 이렇게 특정 영역의 픽셀을 다시 그리는 것을 오버드로우라고 함
  • 불투명한 물체의 오버드로우를 줄이는 좋은 방법은 가장 큰 영역을 차지하는 물체를 먼저 그리게 설정하는 것

유용한 에셋





[출처] https://github.com/zzragida/UnityDocs/wiki/Graphics-Optimization

반응형
Posted by blueasa
, |