728x90

여기에 정리하는 글들은 모든것이 정확한것은 아니다.

나중에 참고할 것을 대비해서 정리하는 글이다..


1. for vs foreach vs enumerator

foreach와 enumerator 이 두개간의 성능은 거의 차이가 없는듯하다 굳이 따지자면

enumerator가 미세한 차이로 좀 더 속도가 빠른것 같다.


for 같은 경우엔 foreach와 enumerator 보다 약 1.7~1.8배 정도 속도가 더 빠른것으로 보인다.


예전엔 foreach를 쓰게되면 gc남게 되어 속도도 for 보다 느리고, gc까지 생기니 사용하는데 있어서 좀 그랬다하면.. 최근에는 그래도 gc는 안생기는거 같아, 부분적으로 필요할때 사용해도 문제는 되지 않을 것 같다.


좀 더 자세히 보니, unity 5.5이전 버전까지는 foreach 루프에서 발생하던 박싱 작업이 가비지를 만드는 원인이였다고 하는데, 5.5 이후 버전부터는 c# 컴파일러가 업그레이드 되면서 박싱 작업이 제거되어 가비지는 발생하지 않는다고 한다. 하지만 속도면에선 여전히 제일 느리다.. 


2. int -> string, string -> int

int -> string은 별 차이가 없는거 같다. 흔히 사용하는 toString(), System.Convert.ToString() 등 아무거나 사용해도 될듯 하다.


string -> int은 

주로 쓰는 parse와 tryparse를 놓고 볼떄 속도만 놓고보면 parse가 빠르다는거 같은데 그 차이는 진짜 미미한 정도라고 하는거 같다. 차이라면, parse 같은 경우에는 올바르지 않은 파라미터값이 들어가면 예외를 던져서 프로그램이 죽는다는 것이다.


굳이 이런 미미만 속도에 미련이 없다면, tryparse를 사용해서 자체적으로 예외처리를 할수 있게끔 하는것도 좋은것 같다.


3. delegate

c#을 하다보면 delegate를 사용하여 익명 함수를 파라미터로 넘겨주는 그런 코드를 자주 작성하게 된다.


파라미터로 받은 delegate 함수를 실행할경우 delegate가 null이거나 빈내용일 경우, 함수를 실행을 안하도록 하는것이 성능과, 속도면에서 좋은것 같았다. ( 쓰고보니 당연한 얘기 같음.. )


딱히 실행할 내용이 없다면 빈 delegate를 넘겨주지 않도록 하고, 받는 쪽에선 null체크를 하고 null일시 실행을 안하도록 하는 식으로 하는것이 좋을것 같다.


4. transform

속도만 놓고 봤을땐 transform에 대한 접근을 그때마다 하느냐, 아니면 캐싱을 해서 가지고 있는것으로 사용하느냐는 캐싱을 하고 사용하는것이 훨씬 빠르다고 한다.


하지만 사용법에 따라 늘 접근 방법은 다를수 있으므로, 필요할 시엔 그때마다 접근을 하되 자주 transform을 접근하는 상황이라면 캐싱을 해야될 것 같다.


5. Log

코딩을 하면서 수많은 Debug.Log, warning 등등 많은 로그들을 남겨둔다.

로그는 많은 비용을 차지하기 때문에 반드시 개발이 완료된 후나, 개발 도중이라도 사용되지 않을 로그들은 제거해주는것이 좋을 것 같다.


6.Equals vs == 

여러 블로그를 보고 정리한 결론에 따르면

결론은 둘다 Equals 메소드에 의해 수행 된다는 것이고 경우에 따라 ==가 빠를수도, Equals가 빠를수도

있다고 하니, 사실상 둘의 성능 차이는 미미하다고 봐야될 것 같고 차이가 없다( .Net언어에서 ) 라고 정리 해야 될 것 같다.


굳이 차이라면 == 은 서로 타입이 다르면 컴파일에서 오류가 나고,

equals는 객체를 받아들일수 있다는 건데, equals는 내부적으로 보면 결국엔 object를 string 형으로 as 해서 변경하고 있고, string이 아니라면 null값을 넣어 버린다.

즉 ==은 형이 다르면 곧바로 오류지만, equals는 일단 객체에 대한 비교까지는 한다는 것이다.

그리고 equals도 결국엔 형이 같은 경우 값을 비교해서 결과를 낸다는 것뿐

결론은 같다는 것이다..


--------------------------------------------------------------------------------------


위 얘기는 string(문자열) 비교일 경우에 해당하는 정리 글일 뿐

== 연산자를 다른 object 형에서 사용하게 되면 value 값 비교가 아닌 reference 비교를 한다는 점이다.

문자열이라면 == 을 사용할 경우 equals를 부르고 값을 비교하는 거지만, 다른 형들은 아닐 수도 있다라는 것을 기억하고 있어야 한다.


7.string 연결

+ == string.concat()  둘다 string.concat으로 컴파일 된다. +연산자는 오버로드되서 concat을 수행한다. 즉 이 둘의 차이는 없다는 것.


stringbuilder은 많은 수의 문자열이 연결될 때만 적합하다는것 같다.

string.format은 실제로 stringbuilder을 사용하여 구현되므로 느리다.


a + b + c 를 하는 경우에

a,b,c,ab, abc 다섯개가 문자열이 메모리에 생성되고 

필요없는 문자열들은 하나씩 지워나간다 즉 쓸때없는 gc를 만들어 낸다


stringbuilder을 사용하면 ab를 얻지 않고 abc만 얻으므로 gc 효율면에선 더 좋다


속도면에선 +, tostring() 이 stringbuilder보다 빠르다고 한다.


적절히 문자열 길이에 따라 알아서 쓰면 될듯..하다

728x90
Posted by 정망스
,
728x90

A 아틀라스 (a1, a2 스프라이트) 
B 아틀라스 (b1 스프라이트)
위와 같이 아틀라스 및 스프라이트가 있을때, 

!! 하나의 Panel 안에서 a1 - b1 - a2와 같은 식으로 출력하는 것은 불가능 하다고 한다. !!

 

z값은 동일 아틀라스내에서 스프라이트 간 출력 우선순위를 결정하는데 영향을 끼치지만, 
서로 다른 아틀라스사이에서 스프라이트 간 출력 우선순위 결정에는 영향을 끼치지 못한다고 한다. 

서로 다른 아틀라스간 출력은 각 아틀라스내에서 z값이 가장 작은 것 부터 출력 된다고 한다.

(아틀라스 간에 우선 순위는 해당 아틀라스 아래 스프라이트가 갖는 가장 작은 z값이 기준이고, 동일 아틀라스 내에서는 스프라이트 우선순위는 z값)


즉, a1(positoin.z=-10) -> b1(position.z=0) -> a2(position.z=10) 이란 가정하에 보면

실제로는 a1 -> a2 -> b1 순으로 출력이 된다는 것이다.

 

a1 스프라이트가 제일 작은 z값을 가지고 있으므로 아틀라스 우선 순위는 A 아틀라스 이고 z값이 제일 작기 때문에 첫번째.

 

a2 는 A 아틀라스 소속이자,  a1 다음으로 작은 z값을 가지고 있기 때문에 두번째.

 

b1 는 그다음 우선 순위인 B 아틀라스 소속이고 z값이 제일 작기 때문에 세번째.


정리하면 그래서 b1이 두번째에 출력되게 하고 싶어도 a1,a2에 가려지거나 혹은 depth나 z값을 이리저리 조정하다보면 b1이 제일 앞에 있다거나 이상한 현상이 발생 된다는 것이다. 

 

그래서 해결책이 새로운 panel을 만드는것이다. 여러가지 경우가 잇겠지만 예를 들어보면,

1) Panel1(a1 - b1) + Panel2(a2) 
2) Panel1(a1) + Panel2(b1 - a2) 

 

이런식으로 하면 본래 의도되로 될 수 있다는 것이다.

 

폰트를 사용하는 UIlabel 같은 경우에도 다이나믹 폰트나 이런것들로 인해 기능과 관리면에선 편하지만 폰트 또한 리소스들 아틀라스와 다른 아틀라스이기 때문에 위와 같은 현상이 발생 할 수 있다는 점에서 유의 하면서 사용 해야 할 듯 하다.

 

그리고 패널을 추가하게되면 드로우콜이 늘어나는데, 그렇다고 무작정 패널을 나뉘어 분류 안하는것 보단 해주는게 좋은거 같고, 또 과하게 패널을 또 분류하면 그만큼 드로우콜이 늘어나니 적절한 선에서 패널도 추가하여 사용해야 할 것 같다.


728x90
Posted by 정망스
,
728x90

음 소켓 통신을 필요로 했기 때문에 ..

우선 node.js socket.io 를 설치 해줍니다..

 

npm install -g socket.io

 

저는 node.js를 작업할 툴로 이클립스를 사용하고 있기 때문에 이클립스가

D경로에 있습니다 .

 

그래서 그런지 간단한 서버를 작동해도 socket.io를 설치했음에도 모듈을 못찾는다는 에러가 나오더군요 (아마 설치된 경로나 이런걸 못찾고 있는듯..) 이럴때는

 

인터넷에 검색해보시면 또 많은 방법이 나오는데 저 같은 경우는

 

작업하는 폴더에서 쉬프트 + 오른쪽 클릭 하셔서 여기서 명령창 열기를 한후 npm install socket.io@0.9.6 명령어를 사용하여 작업 폴더에 모듈이 바로 설치되게 했습니다.

 

이러니 오류없이 잘 되더군요 근데 명령어 뒤에 보시면 0.9.6 버전을 설치했는데

음 무슨 이유인지는 모르겠으나 최신버전으로 하니 작동이 안되더군요 아무 반응이 없음..

그래서 다른 버전으로 했더니 잘 반응하고 작동을 했읍니다..

 

우선 유니티에서 셋팅을 해줘야 할것이 있습니다.

socket.io 플러그인을 설치해줘야 하는데

https://github.com/NetEase/UnitySocketIO 이 링크로 가시면 다운 받으실수 있습니다.

(다른 소켓 라이브러리들도 많음... 더 좋은게 있을수도)

 

귀찮으시면 바로 받으세요 ..

UnitySocketIO-master.zip

받으시면 SocketIO\Bin\Debug\ 폴더 안에 있는 모든 파일들을 유니티 프로젝트에 복사해줍니다.

 

 

그럼 셋팅은 완료됫고 이제 유니티에서 소켓을 생성하고 서버에 연결후 데이터를 받아오는거 까지 해보겠습니다.

 

 

우선 위에 SocketIOClient 네임 스페이스를 추가해주셔야 됩니다. using SocketIOClient;

 

url은 이제 서버의 ip주소 와 포트번호를 입력해주시고..  127.0.0.1은 자기 컴퓨터 주소입니다..

정말 되게 테스트만 해본거라 딱히 뭐 코드도 별로 없습니다.

 

유니티 플레이를 하게되면 소켓을 생성한후 해당 url로 소켓을 연결하고

람다식을 이용했는데.. 람다식은 그냥.. 코드 내용을 간결하게 하면서 사용할수 있는.. 익명 함수라고.. 설명하면 될듯하고... 굳이 안해도 되는데 그냥 한번 써보고 싶었음...

 

아무튼 socket.on 함수는 서버쪽에서 MsgRes 라는 이벤트가 발생하면 보내오는 데이터를 받아서 간단하게 출력하는 부분입니다.

 

test() 함수는 버튼을 누르면 반응하게 만들었고 버튼을 클릭했을시 socket.emit 함수를 발생시키는데 emit는 Msg라는 이벤트를 작동해라 라고 서버에게 넘겨주면서 동시에 데이터로 문자열을 보내고 있습니다.

 

유니티는 이정도로 셋팅을 했고.. 이제는 nodejs 서버쪽을 해보겠습니다..

 

socket.io 모듈을 불러오고.. 포트번호 999로 설정해 줍니다.

 

connection 이벤트가 발생할시 .. 즉 클라이언트에서 연결 요청이 올시 연결됫다라는 connected! 문자 출력한번 해주고요..

 

그후 연결된 소켓으로 Msg 이벤트가 요청이 오면 받은데이터를 콘솔로 출력후 emit 함수로 다시 클라이언트에게 MsgRes 이벤트를 발생시키게 함과 동시에 데이터를 보내주는 역할을 하는 서버입니다..

 

이제 node.js 를 통해서 server 를 실행시켜 주시고

 

유니티를 플레이한후 버튼을 눌러주시면..

 

유니티 콘솔창에는 제가 서버로 보냇던 데이터 문자열이 다시 저에게로 돌아와서 출력이 되었고

node.js 에선 음.. 한글 인코딩이 좀 이상하게 깨지긴 햇는데 아무튼 서버에서도 재대로 데이터를 받았고 뭐 자기 할일을 잘했다는걸 볼수 있습니다.

 

우선 연동 확인 테스트 까진 됬고 이제 좀 더 공부해보면서 본격적으로 더 해봐야 겠습니다~

 

 

 

 

 

 

728x90
Posted by 정망스
,
728x90

출처 : http://mentum.tistory.com/55

 

1. 외국 시장의 용량과 메모리 문제


- WIFI가 원활하게 사용 가능한 나라는 생각보다 많지 않다. 게임의 용량이 진입장벽이 될 수 있다.

- 일부 중국 퍼블리셔는 200MB 초과게임은 심사거부

- 저가 안드로이드 폰의 저장용량 160MB~4GB에 불과함. (2015년 기준 안드로이드 ONE)

- 실제 가용 메모리는 256MB~400MB 정도라고 보면 된다.


결론 : 중국시장을 노린다면 200MB이내, 메모리 400MB 이내로 해결하자.



2. 최적화 요소 점검


- 유니티로 빌드할때 생성된 로그파일에서 용량별 퍼센트를 볼 수 있다. (콘솔 화면에서 open Editor Log)

- 용량이 큰 파일부터 최적화요소를 점검하자



3. 폴더 필더링


- 유니티는 Assets 폴더 내의 폴더명으로 빌드에 반드시 포함할 것을 구분한다. 폴더의 네이밍이 특히 중요하다.


폴더명

 기능

 Resources

 - 여기에 들어있는 파일은 사용 여부와 무관하게 모두 빌드에 포함된다.

 Assets\

 Editor Default Resources

 - Resources와 유사하지만, 에디터에서만 접근 가능.

 - 편집엔 필요해도 빌드에 불필요한 아틀라스 원본텍스쳐나 에디터 리소스를 보관

 Gizmos

 - Gizmos.DrawIcon을 위한 아이콘과 텍스쳐 모음 폴더. 에디터 전용 폴더로 빌드 제외.

 .으로 시작하는 폴더

 - .으로 시작하는 폴더는 무시

 Editor

 - Unity Editor Scription API만 접근할 수 있는 폴더. 

 - UnityEditor 네임 스페이스를 사용하는 스크립트는 이 폴더에 있어야 함.

 - 빌드에 포함되지 않고 에디터 상에서만 동작

 - 동명의 폴더가 여기저기 있어도 모두 동일하게 동작

 Standard Assets

 - 이 폴더 하위의 스크립트는 최우선 컴파일 

 Plugins

 - Native 플러그인은 이 폴더에 있어야 함

 - 이 폴더의 파일은 모두 빌드에 포함

 - 이 폴더 내의 스크립트는 먼저 컴파일

 




4. 텍스쳐 최적화


[ size ]

- 모바일에서 최대 사이즈는 4K를 지원하지만, 저가 안드로이드는 2K 까지 지원한다. 언제나 2K를 유지하자!

- 축소 시 원본 훼손이 안되도록 항상 2배 수로 축소

- 소스 자체는 언제나 크게만들고 유니티 자체로 크기를 축소하면 된다! 이 방법이면 고사양 버전 제작시 재작업 불필요


[ Alpha ]

- 알파를 쓰느니 폴리곤 갯수를 늘리는게 훨씬 좋다.

- ETC1 등을 사용할 경우 아티펙트로 경계 노이즈가 발생


[ Atlas ] 

- 호출 빈도 등에 따라서 쓸모없는 메모리를 들고 있어야 하는 경우가 있다.


#. 유니티 Quality Setting에서 메모리상 텍스쳐 해상도를 전체 1/2로 하는 기능도 있다. 이를 기기 성능에 맞춰서 원활한 플레이를 하는 방법!



5. 소스 최적화


[ POT ]

- 가능한 모든 텍스쳐를 POT 규격으로 제작. POT가 불가능한 리소스는 텍스쳐 아틀라스로 패킹.

- NPOT 리소스는 압축 텍스쳐가 불가능하다 = 용량 증가


[ Alpha ]

- ETC1은 alpha가 없는 텍스쳐 포멧이다. 알파가 존재할경우 유니티는 RGBA16으로 변환한다.

- ETC1을 두 장 사용해서 alpha문제를 해결 (로딩빠르고, 용량적고, 메모리도 적게먹는다!)

- 하지만 쉐이더/로딩 코드를 수정해야 된다. 드로우 콜 증가. (직접 쉐이더 코드를 수정하지 못하면 사용 못함!)



6. 텍스쳐 포멧(유형)


[ 어떤 포멧으로 import 할까? ]

- 유니티 엔진은 어떤 텍스쳐라도 넣을 수 있고, 어떤 텍스쳐포멧을 넣던 유니티에서 한번 더 변환한다.

- PNG 압축사이트에서 압축해서 쓰세요! 이러는건 PNG를 유니티 변환하지않고 우회해서 사용할 때의 얘기다.

- 어차피 압축을 다시 하기때문에 무조건 가장 품질 좋은 것을 넣으면 된다! (프로젝트파일 용량걱정만 없다면!)


[ Format 설정 ]

- Format 쪽에 가보면 Compressed, 16 bits, Truecolor 3가지가 있다. 이 외의 것을 하면 안돌아가는 기기가 있다!

- 만약 사용자 앱이지원되지않는 텍스쳐압축을 사용할 경우 그 텍스쳐는 RGBA32무압축(엄청난용량!)으로 메모리손실


설정 값 

설명 

 Compressed 

 기본 설정 값. 압축효과 가성비 높음. 알파가 있을 때는 차라리 알파없는 텍스쳐 한장을 더 쓴다.

 16Bit

 압축하지 않고 색상만 줄어든다. TA가 없다면 사용하지 말 것.

 TrueColor

 압축을 전혀 하지않음. UI에만 사용해야한다. 알파가 있다면 어쩔 수 없는 선택.

 


[ 세부 Format 설정]

- 알파 필요없는데 PNG등으로 들여오면 RGBA로 임포트가 되버린다.

- 아 물론 알파채널을 스펙큘러등으로 쓰는경우 (Toony Pro의 스펙큘러 등)은 그냥 RGBA로 써야된다!

- Texture가 아니라 Advanced를 선택하면 세부 설정을 지정할 수 있다.


종류

 사용해야하는 포멧

 POT전용 - 직사각형O 

 RGB Compressed ETC 4 bits

 POT전용 - 직사각형O

 RGB Compressed PVRTC 2 bits 

 RGBA Compressed PVRTC 2 bits 

 RGB Compressed PVRTC 4 bits 

 RGBA Compressed PVRTC 4 bits 

 NPOT

 RGB 16 bit

 RGB 24 bit

 RGBA 16 bit

 RGBA 32 bit 

 


 

- Texture가 아니라 Advanced로 선택한 뒤, RGB Compressed ETC 4 bits를 선택하자. ( 무려 2배차이 ! )

- Quality는 100으로 하면 약간의 딜레이가 발생하지만 더 품질이 손상없어짐!


[ 결론 ]

- 알파가 없다면 일단 Compressed를 사용하자!

- 알파가 존재하는 UI라면 TrueColor를, 그 외의 것이라면 차라리 알파 없는 것을 하나 더 써서 마스킹을 하시길.



7. UGUI 최적화


[ Draw Call ]

- 유니티 UI의 드로우 콜은 캔버스 단위로 이루어진다. 

- 하나의 캔버스 하위에 쓰이는 이미지들이 Sprite Packing이 되어있다면, 모두 하나의 드로우콜로 처리가 가능하다.

- 동적으로 반응하는 버튼이나 Fill Image를 처리할 때 매번 갱신비용이 발생하기 때문에, UI요소들을 하나의 Canvas에 몰아넣는 것만이 좋은 것이 아니다.


[ Text ]

- 텍스트는 Font 종류당 하나씩 드로우 콜이 발생한다.




8. FBX 최적화


[ Model ]


 

- Mesh Compression은 기본적으로 꺼져있는 상태지만, 모양이 뭉개지지 않는 범위내에서 최대값을 선택한다.

  (왼쪽이 OFF, 오른쪽이 High 상태인데... 사실 뭔가 인지못할정도로! 바뀐다)

- Materials의 Import Material은 체크해제한다.


[ Animations ]

- 애니메이션이 포함되어 있지 않다면 체크해제한다.




9. 사운드 최적화


- 사운드는 디폴드 값으로 3D 스테레오 사운드로 설정되는데, 사실 모바일 게임에서는 스테레오는 의미없음.

- Force to Mono를 체크함

- Load Type은 메모리에 영향을 주는데 사운드 유형에 따라서 설정한다.


 유형

사용처 

 Decompress on load

 짧은 효과음

 Compressed in memory

 성우 대사 정도의 음성 

 Stream

 계속 플레이되는 긴 배경음악 

 



 

728x90
Posted by 정망스
,
728x90

출처 : http://mentum.tistory.com/53

 

1. 드로우콜(Draw Call)

 - CPU가 GPU에게 어떠한 물체를 그리라고 요청하는 것

 - 그 값이 적을수록 가벼운 게임이라고 할 수 있으며, 기기의 성능에 따라서 특정 갯수를 넘어가면 프레임 저하가 나타남.

 - 모바일의 경우 100개정도를 상한선으로 잡는다고 보면 된다.

 - 일반적으로 오브젝트를 그릴 때, 오브젝트단위로 한 개씩 증가, 그 외에도 쉐이더에 따라서 추가로 증가할 수 있음.


2. 배치 (Batches)

 - 많은 사람들이 Draw call과 많이 혼용해서 사용하지만 사실 드로우콜을 포함하는 상위 개념 

 - Draw Call + Set VB/IB + Set Transform + Set Pass Call (Set Shader + Set Texture 0~7 + Set Blending + Set Z enable..)


 ※ 배치 갯수는 어떻게 결정되는가 ? 직접 실험해봤다.


1. 메쉬의 갯수 x 라이트의 갯수 + 재질의 갯수 - 동적배칭으로 절약된 갯수


2. 파티클은 머테리얼이나 메쉬에 관계없이 개당 1개로 계산된다. (하위로 더 달려있으면 그것 하나당 1개씩)



3. Set Pass Call

 - Material과 Shader와 관련된 것에 대한 Batch를 말함.


※ 배칭이 따로 일어나지 않을 때, Set Pass Call과 Material의 관계


예시1 : Material을 공유하는 오브젝트가 10개

  - Batch는 10개, Set Pass Call을 1개로, 총 Batch는 11개다. 


예시2 : Material이나 Shader가 다른 오브젝트가 10개

  - Batch는 10개, Set Pass Call이 10개로, 총 Batch는 20개다.


 - 때문에, 아틀라스를 활용하여 여러 오브젝트들을 한개의 Material로 묶어서 Set Pass Call을 줄이는 것이 중요하다. 



4. 배칭(Batching)

 - 복수의 드로우 콜을 하나의 드로우 콜로 묶어서 처리하는 작업


 4-1) 다이나믹(동적) 배칭 (Dynamic Batching)

   - 동일한 Material을 공유하고, 특정 조건들을 만족했을 때, 유니티에서 자동적으로 일어나는 배칭을 말한다.

   - 정적 배칭에 비해서 조건도 까다롭고 눈에띄는 효율이 아니므로 사실 크게 신경쓰지 않아도 되는 부분이다.

   - 동일한 모델의 모양일 필요가없다. 부스러기들을 한번에 모아서 렌더링한다고 생각하면 된다.


조건 1 : 버텍스 갯수가 총 900 이하의 메쉬만 적용가능하다.

           하지만 쉐이더가 정점 위치와 법선이나 다른 UV 정보를 사용하면 300 이하.

           정점위치, 법선, UV0, UV1, 탄젠트까지 사용한다면 180 이하.

           (해당 제한값을 넘으면 정보가 너무 많아져서 오히려 배칭을 안하는 편이 더 이득이라고 한다.)


조건 2 : 오브젝트가 Mirror의 Transform 값을 가지고 있으면 함께 배칭 되지 않는다. 예를들어 +1 스케일과 -1 스케일.


조건 3 : Material의 인스턴스가 다를 경우(동일한 Material이더라도) 배칭이 이루어 지지 않는다.


조건 4 : 동적으로 라이트매핑된 오브젝트가 동일한 라이트 맵의 위치가 아닌 한 배칭이 이루어 지지 않는다.


조건 5 : 멀티 패스 쉐이더는 배칭이 이루어지지 않는다. ( 대표적으로 카툰 쉐이더의 아웃라인 )


조건 6 : Skinned Mesh 사용 불가


조건 7 : 리얼타임 쉐도우의 영향을 받는 오브젝트는 배칭이 이루어지지 않는다. 

 - 받아도 이루어지는 것으로 실험상 나타나서 사실 잘 모르겠음.



 ※ 동적 배치 갯수는 어떻게 결정되는가 ? 직접 실험해봤다.


   - 메쉬의 정점은 98개로 동적배치가 일어날 수 있는 조건에 맞는다.


 메쉬수

스케일

쉐이더

라이트

배칭수

 해석

 1

1

OutLine

1

3

메쉬 1 x 라이트 1 x 멀티패스 2 + setPass 1 = 3

 1

1

Standard

1

2

 메쉬 1 x 라이트 1 + setPass 1 = 2

 2

1

OutLine

1

5

메쉬 2 x 라이트 1 x 멀티패스 2 + setPass 1 = 5 

 2

1

 Standard

1

2

메쉬 2 x 라이트 1 + setPass 1 - 동적배칭 1 = 2 

 6

1

Standard

1

2

메쉬 1 x 라이트 1 + setPass 1 - 동적배칭 5 = 2 

 6

1

Standard

1

13

 메쉬 6 x 라이트 1 x 멀티패스 2 + setPass 1  = 13

 6

한개만 -1

Standard

1

4

? 원래는 3이 될 것 같지만..

 


 - 스케일의 경우 양의 값이기만 하면 각자 다른 스케일을 가지고 있어도 동적 배칭이 일어났다.

 - 모델링 자체에 있는 Scale Factor는 영향을 주지 않는 듯 하다. 

 - 스케일이 한개만 -값이 될경우 Set Pass Call이 2개가 증가하면서 드로우콜이 2가 증가한다.



 - 고찰

 많은 메쉬를 가진 캐릭터가 복사 형태로 많이 존재한다고 할 때, 그 캐릭터에 본 스킨이 붙을 필요가 없는 오브젝트가 있다고 해서 그것을 분리할 필요는 없다.


 배치는 '드로우콜'을 줄이기 위한 것이니까.


 합쳐서 하든, 나눠서 배칭되서 1개가 되든 드로우콜이 한 개니까.





 4-2) 스태틱(정적) 배칭 (Static Batching)

   - 동일한 Material을 공유하고, 움직이지 않는 오브젝트가 Inspector에서 Static을 체크해줄 경우 일어나는 배칭을 말한다.

   - 메쉬를 강제적으로 합쳐서 넘겨주는 식이라서 메모리에 부담을 준다. 때문에 너무 규모가 크다면 오히려 렌더링 쪽을 희생시키는게 나을지도.

   - 눈에 띄는 효과가 나오기 때문에, CPU 파워를 줄일 필요가 있을 경우 꼭 정적 배칭을 사용해야한다.

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침