MANAGE YOUR WORLD
Testing & Optimization

최적화 가이드

14min

메모리

  • ZEPETO는 월드에서 사용되는 리소스를 메모리에 미리 로드하도록 구조화되어 있습니다.
  • 월드 버전 1.7.0을 기준으로 할 때, 최소 사양 장치는 iPhone 8 (2GB RAM)과 Galaxy S8 (4GB RAM)입니다.
  • 따라서 2GB를 초과하지 않도록 해야 합니다.
    • 최소 사양 장비는 나중에 변경될 수 있습니다.
  • 멀티플레이어 월드의 경우, 각 캐릭터가 메모리를 가지고 있기 때문에 최대 인원을 고려하여 메모리를 관리해야 합니다.



성능 지표 확인 방법

모바일 환경에서 성능 지표 확인 방법

  • ZEPETO에서 공식적으로 제공하는 공식 런타임 프로파일러를 사용해 주세요.

📘 다음 가이드를 참조해 주세요. [Runtime Profiler]



로컬 개발 환경에서 월드 멀티플레이어 서버의 성능 지표를 확인하는 방법

VS Code를 스크립트 편집기로 사용하는 경우, 플러그인을 통해 로컬 개발 환경 서버의 CPU 사용량, 메모리 사용량 등 다양한 성능 지표를 확인할 수 있습니다.

📘 Unity에서 VS Code를 스크립트 편집기로 설정하는 방법에 대한 가이드를 참조하십시오.



1) VSCode 화면 왼쪽의 [확장] 패널에서 JavaScript 프로파일을 위한 Flame Chart Visualizer를 검색하여 설치합니다.

Document image




  • 플러그인에 의해 확인된 로컬 개발 환경의 성능 지표는 실제 서비스 환경과 다를 수 있습니다. 이를 사용하여 월드 멀티플레이 서버 로직의 대략적인 성능 추세와 잠재적인 성능 문제를 이해하시기 바랍니다.
  • VS Code의 작업 디렉토리가 월드 프로젝트로 설정되지 않은 경우, 플러그인이 올바르게 작동하지 않습니다. [탐색기] 패널에서 올바른 프로젝트 폴더를 선택해야 합니다.



2) VS Code의 [실행 및 디버그] 패널로 이동하여 디버깅 유형을 Zepeto 멀티플레이 스크립트로 변경합니다.

Document image




3) 유니티 화면에서 재생 버튼을 눌러 월드를 실행하고, VS 코드에서 [디버깅 시작] 버튼을 눌러 런타임 디버깅을 시작합니다.

멀티플레이어 서버의 성능 지표를 [실행 및 디버그] 패널에서 실시간으로 확인할 수 있습니다.

Document image




👍 팁

  • [실행 및 디버그] 패널에서 성능 차트 표시 전환 버튼을 클릭하여 다음 성능 지표를 추가할 수 있습니다.
    • CPU 사용량
    • 사용된 힙
    • 총 힙
    • 상주 집합 크기
    • 외부 메모리
    • ArrayBuffer 메모리
Document image




추천 최적화 가이드라인

최소 사양으로 작동하는 월드가 출시되도록 다음 기준에 따라 최적화해 주십시오.

  • 최소 사양 장치(2GB RAM 포함)는 다음과 같은 경우 충돌합니다:
    • 런타임 프로파일러 > 할당된 메모리가 초과됨 550MB 평균적으로.
      • Document image
        
    • 월드가 실제로 실행될 때, 월드 자원뿐만 아니라 다양한 프로세스가 메모리에서 실행되므로 할당된 메모리에 여유 공간을 두는 것이 좋습니다.
  • 멀티플레이어 월드의 경우, 캐릭터당 메모리 할당이 있으므로 최대 플레이어 수에 따라 메모리를 관리해야 합니다.
    • ZEPETO 캐릭터당 평균 메모리: 35MB
      • ZEPETO 캐릭터 유형의 마네킹을 사용하면, 한 ZEPETO 캐릭터가 들어올 때와 동일한 메모리를 차지합니다.
      • 최적화를 위해 가능하면 간단한 유형의 마네킹을 사용하는 것이 좋습니다.
    • 최대 280MB 8명이 들어올 때 평균
      • 이것은 평균 수치입니다; 가능하다면 출시 전에 최대 인원이 들어오는 실제 테스트를 통해 할당된 메모리를 확인해 주십시오.

FPS (초당 프레임 수)

  • 최대 FPS 제한은 30FPS입니다.



용량

  • 패키지 용량은 최대 1GByte로 제한됩니다.
  • World 1.8.0에서 제공하는 크로스 월드 이동 기능을 통해 용량 문제를 간접적으로 해결할 수 있습니다.



최적화 방법



자원에 대해 개선할 수 있는 점

  • 사용하지 않는 패키지 폴더와 파일을 삭제해 주세요.
  • 프로젝트의 객체 수와 지형의 나무/풀 수를 조정해 주세요.



코드에 대해 개선할 수 있는 점

  • 코루틴 사용: yield는 쓰레기를 생성하지 않지만, 새로운 waitForSeconds를 만들면 쓰레기가 생성됩니다. 따라서 객체를 생성하고 사용하세요.
  • Update( )에서 매 프레임마다 호출할 필요가 없는 부분을 n 프레임마다 호출할 수 있도록 교체합니다.
  • Awake( ), OnEnable( ), Start( )에서 무거운 로직 함수를 호출하지 않도록 하세요.
  • 빈 함수라도 Update( )와 LateUpdate( )를 남겨두지 않도록 하세요.
  • 런타임에 컴포넌트를 추가하지 않도록 하세요. 필요하다면 프리팹을 인스턴스화하는 것이 더 효율적입니다.
  • GameObject.Find, GameObject.GetComponent, Camera.main은 비용이 많이 들므로 Update()에서 호출하지 말고 필요하다면 Start()에서 호출하세요.
  • Instantiate와 destroy는 쓰레기를 생성하고 쓰레기 수집으로 프로세스를 느리게 합니다. 대신 풀을 사용하여 재사용해 보세요.
  • Renderer.material은 가능한 한 Renderer.sharedMaterial을 사용하여 바인딩된 객체의 머티리얼에 접근하세요. 새로운 복사본을 만드는 것은 너무 비쌉니다.



UI에서 개선할 수 있는 점

  • 목적에 따라 캔버스를 나누고 사용하지 않는 캔버스는 보이지 않게 설정합니다.
  • GraphicRaycasters를 제한하고 Raycast Target을 지웁니다. 캔버스에서 GraphicRaycaster를 지우고 버튼과 같은 개별 요소에 Graphic Raycaster를 별도로 삽입합니다.
  • 텍스트나 이미지에서 Raycast Target이 필요하지 않다면 삭제합니다.
  • 동적 UI가 아닌 경우 Layout Groups 사용을 피합니다. 앵커를 사용하여 정리합니다.
  • 대형 목록 및 그리드 뷰는 비용이 많이 들므로 사용을 피합니다.
  • 전체 화면 UI를 사용할 때는 이 캔버스를 제외한 모든 것을 숨깁니다. 이는 카메라가 3D 장면을 렌더링할 필요를 없애줍니다. 또한 불필요한 캔버스를 숨깁니다.
  • 전체 화면 UI를 사용할 때는 Application.targetFrameRate를 낮춥니다. 60fps로 매번 업데이트할 필요가 없습니다.
  • World Space를 사용하는 캔버스의 렌더 카메라에 빈 공간을 남기지 말고, 사용하는 카메라로 채웁니다.
    • 빈 공간을 남기면 Unity가 자동으로 camera.main으로 채웁니다.



오디오에 대해 개선할 수 있는 점

  • 사운드 클립을 모노로 변경하십시오.
  • WAV 파일 사용을 가능하게 합니다. 모든 압축된 음악 파일은 빌드 시간 동안 압축 해제되고 다시 압축됩니다. 이 과정에서 음악 파일의 품질이 저하됩니다.
  • 클립을 압축하고 압축 비트 전송률을 낮추십시오.
  • 대부분의 파일을 Vorbis로 사용하고 짧은 사운드를 ADPCM으로 변경하십시오.
  • 22,050 Hz를 초과하지 마십시오.
  • 적절한 로드 유형을 선택하십시오.
    • 크기가 200 kb 이하인 음악 파일의 경우, 로드 시 압축 해제하십시오.
    • 크기가 200 kb 이상인 음악 파일의 경우, 메모리에서 압축된 상태로 유지하십시오.
  • 대용량 파일과 배경 음악을 스트리밍으로 설정하십시오.
  • 음소거된 음악 파일은 단순히 볼륨을 0으로 변경하는 것으로 끝나지 않으므로, 반드시 삭제되도록 하십시오.



업데이트됨 11 Oct 2024
Doc contributor
이 페이지가 도움이 되었습니까?