유니티 성능 최적화 방법 (원본이 아님)

별도의 포장 및 적재 자원

  이 게임은 많은 장소가 동일한 자원을 사용하는 것입니다. 예를 들어, 일부 주지도 책,지도와 일부 공유 같은 장면 글꼴의 동일한 인터페이스는 일부 몬스터는 등 같은 애니메이터 등을 사용합니다. 다른 소스 설치 패키지 외부에서 고립 게임을 만드는이 공통 자원은 별도로 포장. 리소스 A 및 B는 리소스 C 참조 모두 예를 들어, C는 번들하게 석출한다. 당신은로드하려면 실행중인 게임에서, C가 처음로드, 당신은 예를 들어이 직접로드 B로 너무 오래, 메모리로되어있는 한 B, C를로드하려면 다음 경우, 점 C에 B는 확인합니다. 경우, 런타임에, C가 A와 B 중 패키지에서 분리되지 않는 경우, 다음 C 가방이있을 것이다하는 C B가됩니다 가방, C 중복 설치 패키지 기지개 A와 B가 메모리에로드되어, 상기 메모리는 두 인스턴스 C, 증가 된 메모리 공간을 가질 것이다.

  작업의 양을 줄이기위한 가장 효과적인 수단을 자원 분리 포장되어로드 할 때 설치의 패킷 메모리 풋 프린트. 일반적으로 미세한 입자 크기 패키지 덜 두 지표와 두 개의 동일한 텍스쳐를 이용하여 인접 DrawCall renderQueue 및 재료 쉐이더 인스턴스는 두 DrawCall 결합 될 수있는 경우. 포장은 잘하지만 또한 더 낫다. 당신이 작은 번들의 큰 숫자를로드하는 동안 실행하려는 경우, 속도가 부하에 매우 느려질 수 - 코 루틴 및 I의 소량 사이에 일정에 시간을 낭비 / O까지, 그리고 DrawCall 합병이 반드시 성능이 향상되지 않습니다, 때로는 성능이 저하됩니다, ​​나중에 언급 될 것이다. 전략적으로 팩 크기를 제어 할 필요가있다. 일반적으로 큰 글꼴이 볼륨 공공 자원의 텍스처.

  사용 AssetDatabase.GetDependencies 할 수있는 자원은 무엇 기타 리소스를 사용합니다.

2 투명 맵 채널 분리, ETC / PVRTC 압축 형식

  처음에 우리는 텍스처 메모리 풋 프린트를 줄이기 위해 희망, DXT5 압축 형식으로지도를 사용하지만, 곧 모바일 플랫폼의 그래픽 카드가 지원되지 않는 것을 발견했다. 그래서 1024 × 1024 크기의 RGBA32지도를 위해, DXT5하지만이 1메가바이트에 4메가바이트에서 압축 할 수 있습니다 전에 그러나이 그래픽 카드로 전송됩니다, CPU 먼저 RGBA32 형식 4MB의 (압축 해제 소프트웨어)로 포장을 풀고 메모리에 사용합니다, 이것은 다음 4MB의 메모리로 전송됩니다. 그래서이 시간에,이지도는 메모리 5MB의 비디오 메모리 4MB의 소요됩니다, 그리고 모바일 플랫폼 그래서 메모리 맵의 1메가바이트 실제로 9메가바이트를 차지 생각, 종종 비디오 메모리로 메모리에서 하나를 끌어 할 필요가 없습니다 독립 메모리입니다 !

압축 형식을 추출 지원하지 않는 모든 하드웨어는이 문제를 가지고있다. 몇 가지 조사 후, 우리는 안드로이드 하드웨어 지원이 가장 널리 사용되는 포맷 ETC 것을 발견, 애플은 PVRTC이다. 그러나 두 형식은 투명 (알파) 채널 수 없습니다. 따라서, 우리는 각각의 원래 질감 투명 채널은 밖으로 분리되어 다른 맵에서 빨강 채널에 기록되어 있습니다. 이 두지도는 사용 ETC / PVRTC 압축입니다. 렌더링 할 때,이지도는 메모리로 전송됩니다. 우리는 쉐이더 NGUI를 수정, 빨강 채널의 두 번째지도를 렌더링 할 때하는 첫 번째 채널에 투명 텍스처를 기록, 원래의 색상을 복원

(I v2f) fixed4의 파편 : COLOR  

    fixed4의 COL;  

    col.rgb = tex2D (_MainTex, i.texcoord) .rgb;  

    col.a = tex2D (_AlphaTex, i.texcoord) .R;  

    반환 COL * i.color;  

(I v2f) fixed4의 파편 : COLOR

{

    fixed4의 COL;

    col.rgb = tex2D (_MainTex, i.texcoord) .rgb;

    col.a = tex2D (_AlphaTex, i.texcoord) .R;

    반환 COL * i.color;

}

이와 같이, 원래 맵 4MB의 1024 × 1024의 크기 RGBA32 그것은 ETC 두 별도 0.5MB / PVRTC 맵 (우리는 ETC / PVRTC 4 비트를 사용)로 압축된다. 그들은 렌더링 메모리 사용 2x0.5 + 2x0.5 = 2메가바이트입니다.

3 개 닫기지도 읽기 및 쓰기 옵션

유니티 각 질감에 도입하는 것은 (읽기 / 쓰기 가능) 스위치가 활성화 읽기 - 쓰기를 가지고, 해당 매개 변수는 TextureImporter.isReadable이다. 당신이지도를 선택하면 당신은 가져 오기 설정 탭에서이 스위치를 볼 수 있습니다. 단 스위치를 열고, 픽셀 맵 리소스를 Texture2D.GetPixel지도를 읽거나 다시 쓰는 데 사용하지만, CPU 액세스를 위해 메모리에지도의 사본을 유지하기 위해 시스템을 요구하는 수 있습니다. 우리는 모든지도에이 스위치를 닫을 수 있도록 일반 게임, 이러한 요구가 실행이되지 않습니다,하지만지도는 수입 처리 후 편집에서 할과에 회전을 (예 : 원래 질감 투명 채널의 분리 등). 따라서, 1024 × 1024 텍스처의 크기는, 위의 2메가바이트 그 런타임 메모리 풋 프린트를 언급 절반 이하, 1메가바이트로 감소 될 수있다.

4 장면의 수를 줄이기 위해 게임 오브젝트

  한 시간에 우리는 거의 20,000의 게임 오브젝트 장면의 수를 줄일 수, 아이폰 3S에 게임 메모리 사용량은 20메가바이트의 감소를 날아 갔다. 이러한 기본적인 게임 오브젝트가 숨겨져 있지만 (activeInHierarchy은 false입니다)하지만, 여전히 많은 메모리를 차지합니다. 또한 스크립트를 많이 장착이 게임 오브젝트는, 각 스크립트는 각 인스턴스뿐만 아니라 메모리 공간보다 더 많은 돈을 게임 오브젝트해야합니다. 그래서 우리는 숫자 게임 오브젝트 장면 이하 10,000 및 표시 모니터링 성능의 주간 버전으로 게임 오브젝트의 수를 지정했습니다.

아틀라스 5

  마무리 아틀라스의 주요 목적은 (때로는 합병 DrawCall에 역할을 할 수 있지만) 런타임 메모리를 저장하는 것입니다. 의 합계가 포트폴리오의 인터페이스가 가능한 한 작게 크기 인 경우 이러한 관점에서, 디스플레이 메모리에 공급된다. 일반적으로 우리가 있음을 도울 수있는 방법이있다 :

  1) 인터페이스 디자인, 메이크업 사각형으로 디자인 된 아트 컨트롤을 만들기 위해 노력할 것은 UISprite 유형의 슬라이스를 스트레칭. 이러한 기술은 우리가 단결에 큰 뽑아, 작은지도를 잘라 수 있습니다. 물론, 컨트롤에서 4 적어도 16 정점의 수 (타일을 사용하여 그리드 사각형 타일 형의 중심이 때문에, 꼭지점의 수는 더 될 것입니다 않음)하는 제곱 수단, 빌드 오버 헤드 DrawCall이 더 큰 것을 (참조 점 6)하지만 일반적으로 긴 DrawCall으로 아무런 문제가 없을 것이다 (도 6 포인트 참조) 합리적인.

  2)의 계면에서 또한 당해 형태를 최대한 대칭 패턴의 디자인 설계된다. 도 따라서 예술의 일부가 절단 될 수있을 때, 우리는 전체 패턴 단결을 맞추는 것이다 잘라. 예를 들어, 원형 패턴은, 당해 분야의 1/4만이 절단 될 수 있으며,면에 대한 오직 기술의 절반을 절단 할 수있다. 그러나, 지점 1) 유사하게,이 방법은 또한 다른 특성을 희생 못한 - 정점의 수를 그 수 게임 오브젝트에 대응하는 패턴이 증가한다. 포인트 4는 이미, 때로는 게임 오브젝트의 수가 훨씬 많은 메모리의 증가를 언급했다. 따라서이 방법은 일반적으로 더 큰 크기의 패턴을 채용.

  메모리에지도 자료 보냈습니다을 무관 렌더링하지 않을 경우 불필요, 재료 메모리 상주지도에 3) 않도록주의하십시오. 이지도 책에 따라 별도의 인터페이스가 필요, 아틀라스 그냥 재료의 일반적인 인터페이스를 넣어하는 인터페이스 UISprite 아틀라스 다른 인터페이스를 사용하지 마십시오. 그렇지 않은 경우 인터페이스 A를 표시 것, 가정에 조금 인터페이스 A와 B 골드 아이콘 인터페이스 정확히 동일하지 때문에, B 물질 인터페이스 금의 UISprite 인터페이스를 직접 참조 할 수의 생산에 편의상이 있습니다 아틀라스 전체 인터페이스 B는 긴 메모리에, B 아틀라스는 또한 상주 등으로 아직 메모리에 메모리에 보냈지 만입니다 있습니다. 이 경우는, 동일한 아이콘을 넣고 동전 패널 (A)의 각각의 B에 집중되어야하며, 단지 UISprite 상기 아틀라스 상기 B UISprite의 포트폴리오 B 만한다.

  두 인터페이스와 동일한 재료가 많이 존재하는 경우, 두 개의 공유 같은 인터페이스는 아틀라스 수있다. 이 모든 인터페이스의 총 메모리 사용량을 줄일 수 있습니다. 그것은 예술 디자인의 특정 동작을 비교 검토 할 필요가있다. 물질 간의 일반적인 같은 공통 인터페이스 프로그램 메모리의 적은 부담. 그러나 같은 일 사이의 인터페이스를 너무 많이, 효과가 생생한 예술하지 않을 수 있습니다, 이것은 예술과 절차와 균형을 추구 할 필요 사이의 장소입니다.

  또한, 아이콘의 많은 리소스 (문서 아이콘)의지도 책에서 할, 그리고 UITexture을 사용해야 없습니다.

4) 빈 공간도 세트를 감소시킨다. 완전 투명 픽셀 및 픽셀 메모리 공간 액성 이름 점유도 농축액은 실제로 동일하다. 따라서, 동일한 양의 재료는,지도 책 공백을 최소화합니다. 때때로지도 책의 1024 × 1024, 소재 영역은 없습니다 우리는이 아틀라스 아틀라스는 512 × 512의 두 가지를 잘라 것입니다 고려할 수, 절반 이상에 의해 점령. 두 개의 서로 다른 아틀라스 DrawCall는 병합 할 수 없습니다, 물론 (요구되는 1024x512 아틀라스을하지 왜 아이폰 OS 플랫폼은 사각형이어야합니다 메모리 맵에 전송하는 것 때문에 어떤 사람들은. 요청할 수 있습니다)하지만이 아니다 문제가 무엇인지 (지점 6 참조).

  그것은 특정 작업에 아틀라스를 마무리했다되어야하고, 또 다른 성능 비용이있을 것이다 조치의 종류에 상관없이 무엇 때문에 더 열심히하고 빠른 기준은, 종종 구성하는 방법에 대한 최종 결정 비교 검토 할 필요가 없습니다.

8 저해상도 텍스쳐 재료

  트릭은 흰색 실제로 재료의 텍스처의 크기를 줄일된다. 예를 들어, 원래 그림 크기에 우리가 두 번 수입 유니티 감소 후이며, 50x40, 그것을 내려 놓고 것, 100x80입니다. 이 게임은 실제로 축소 후지도를 사용합니다. 그러나이 움직임은 크게 예술은 즉시 일반적으로 적은 거의 시간이 사용되지 않습니다 프로그램보다, 그림이 흐릿하게 찾을 예술의 품질이 떨어질 수밖에 없다.

9 인터페이스 게으른 로딩과 타이밍 전략을 언로드

  인터페이스의 일부 덜 중요하고 자주 사용하지 않는 경우,이 자원 번들로부터로드 할 때 인터페이스의 요구가 디스플레이에 켜 때까지 기다릴 수, 당신은 메모리가 부족 하역을 닫을 때, 또는 제거하기 전에 약간의 시간을 기다립니다. 그러나이 방법은 두 가지 비용이 : 플레이어가 열려 인터페이스, 디스플레이 인터페이스가 지연 될 물었을 때 첫째로, 그것은 경험에 영향을 미칠 것, 두 번째는 버그에 더 민감하다, 상단 비동기 쓰기 논리, 사건을 고려를 할 때 액세스 인터페이스 프로그래머 때,이 인터페이스는 메모리에있을 수 없다. 지금까지 우리는 프로그램을 구현하기 위해 아직있다. 현재, 단지 새로운 장면을 입력하면 장면은 새로운 장면을 제거하는 데 사용하지만 인터페이스를 사용하지 않습니다.

  9 개 이상의 방법은 4,5,6 예술의보기의 계획 점과 어느 정도 문제, 항상 새로운 인터페이스 디자인 요구 사항이나 변경이되기 때문에 (최적의 상태를 유지하기 위해 감시를 계속 유지해야 할 필요성에서 요구 ) 이전 인터페이스를 요구, 다른 안정의 구현 한, 영구적 인 해결책이다, 거기에 에너지를 낭비 할 필요가 없습니다. 그러나 두 방법 2 및 8은 예술의 품질, 특히 8을 줄일 수 있습니다. 당신이 견딜 수없는 정말 좋은 예술 정도의 품질이 저하 될 경우,이 두 방법의 사용을 허용하지 않을 수 있습니다.

10 않도록 자주 통화 GameObject.SetActive

우리의 게임의 일부가 자주 GameObject.SetActive가 표시하거나 일부 개체를 숨길 논리적 프레임에서 부를 것이다, 수만큼 백 번을했다. 이러한 큰 동작의 CPU 오버 헤드 (UIWidget 특히 NGUI 초기화 많은 작업을 수행 할 때 활성화) 및 GC 많이 유발한다. 그런 다음 우리는 디스플레이와 숨겨진 객체 접근 방식 변경 - (activeInHierarchy가 true) 개체가 활성 상태를 유지하게, 그리고 원래 SetActive (거짓)이 대신 객체 오프 스크린 이동 (참) SetActive는 개체 다시 변경 화면 내에서. 이러한 성능은 훨씬 더이었다.
----------------
면책 조항 :이 문서는 CSDN 블로거 "후스 다이애나 ZZ '원래 기사는 CC 4.0-SA 저작권 계약, 복제, 원본과 링크를 첨부하시기 바랍니다에 따라입니다 이 문장.
원본 링크 : HTTPS : //blog.csdn.net/qq_35037137/article/details/89851113

추천

출처www.cnblogs.com/-831/p/12098658.html