메타 파일로 프로젝트가 관리되는 유니티는 외부적인 SVN으로 관리하기가 매우 힘든 편인데, 그 점을 보완하기 위해서 Unity Collaborate가 나왔다.

5.4, 5.5 Version을 기준으로 이 서비스는 아직 베타이다. 그래서 아직 문제점이 많은데 이번에 겪은 문제는 2가지 정도이다.

 

프로젝트 탭에서 새로운 폴더를 생성하고 파일을 옮긴 이후에 클라우드 서버에 Publish한 경우, 다른 사람이 이 변경사항을 Update 받으면 새로운 폴더에 옮긴 파일이 있는데 이전의 위치에도 그대로 파일이 존재하는 문제점이 있다. 그 때문에 같은 파일이 2개가 되어서 충돌하는 문제가 있었다. 이 문제는 간단하게 이전 파일을 지워주기만 하면 해결되었다.

 

두 번째 문제는, 버전 컨트롤로서의 Collaborate의 존재를 유명무실하게 만드는 문제인데, 이 부분이 약간 골치가 아프다. 물론 이 문제의 해결책도 간단하기는 하다. 앞서 말한대로 Collaborate의 신뢰도를 많이 떨어뜨리는 문제일 뿐. 그게 무슨 문제냐면, 유니티 상에서 .cs 파일의 이름을 변경하고 내용의 클래스 이름도 변경하는 경우가 있는데, 이러한 수정을 한 이후에 클라우드 서버에 Publish 할 경우, 파일 이름이 변경된 것만 서버로 올라가고 파일의 내용은 전혀 바뀌지 않은 채로 올라간다는 것이다. 그리고 이 문제는 Collaborate 자체로는 전혀 해결할 수가 없다. 이전 버전으로 롤백하고 다시 Update를 받든, 뭘하든 전혀 해결이 안된다. 이걸 해결하려면 수정된 파일을 수정자에게서 수동으로 받아서(메일으로든, 메신저로든 아니면 SVN을 통해서 받든 ... ) 유니티 프로젝트 폴더의 해당 경로 안에 다시 붙여넣기하는 수 밖에는 없다. 이러면 도대체가 Collaborate를 쓰는 이유가 뭔지...

 

이걸 애초에 방지하려면 지금 작업하던 클래스의 이름을 변경하려면 아예 cs 파일을 바뀐 이름의 클래스로 새로 만들고 내용을 붙여넣기한 다음에 이전 파일을 지워야 하는 것 같다.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

sitemap.xml
다운로드

 

네이버 웹마스터 도구에 RSS를 등록했는데 사이트맵이 등록되지 않아서 최적화가 덜 되어있다고 해서 사이트맵을 만드는 법을 검색해서 등록한다.

 

사이트맵 등록법 :: http://rgy0409.tistory.com/1407

 

다른 좋은 분이 사이트 맵을 등록하는 법에 대해서 포스팅을 해주셨는데 내가 다시 쓸 필요는 없겠지.

사이트 맵 등록법이 알고 싶다면 위 사이트에 들어가서 직접 보도록 하자.

 

파이어폭스가 몇몇 사이트에선 제대로 작동을 안한다. 이런 망할... 크롬으로 갈아타야 되는건가.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

마우스나 터치 같은 화면으로 입력하는 처리를 해야하는 경우가 많은데 유니티에서는 EventTrigger라는 것을 지원한다. 일반적인 방법인 Input.mousePosition나 Input.GetTouch()를 이용해서 직접 처리하는 대신에 화면 전체나 혹은 원하는 부분을 덮는  Panel Object에 EventTrigger Component를 추가해서 각종 화면 입력을 처리할 수 있게 된다.

 

간단한 예시 (Pointer Enter : 포인터가 Panel 위에 올라왔을때, Drag : 드래그 중일때, Move : 포인터가 Panel 위에서 움직이는 중일때)

 

당연하게도 이 모든 것들이 스크립트에서도 처리가 가능한데 그 방법은 panel에 들어갈 스크립트의 클래스에 원하는 EventTrigger 인터페이스를 상속하고 필요로 하는 함수를 구현해주면 된다.

 

이번에 발생한 문제는 나는 마우스 클릭 후 놓을때, 혹은 터치 후 손을 뗄 때 반응하기를 원했기 때문에 클래스에 IPointerUpHandler를 상속시키고 구현해야하는 함수 public void OnPointerUp(PointerEventData eventData)를 구현했다.

 

하지만 기능은 원하는대로 동작하지 않았다. 무슨 문제인지 살펴보니 IPointerUpHandler와 IPointerDownHandler는 항상 짝지어서 사용해야 하는 것 같다. 실제로 해당 클래스에 두 인터페이스를 모두 상속시킨 이후에는 기능이 원하는대로 작동한다.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

Unity3D로 게임 클라이언트를 제작하고 Nettention사의 ProudNet을 이용하여 게임 네트워크를 담당하여 게임을 제작하는 과정에서 안드로이드 빌드로 포팅해서 모바일에서 실행시켰을 때 클라이언트가 서버에 제대로 접속하지 못하는 문제점을 발견했다. 똑같은 클라이언트에 대해서 PC로 포팅 했을때에는 서버에 제대로 접속이 되는데에 반해서 모바일 버전은 접속이 안되는 바람에 하루 가까이 시간을 쏟아서 해결책을 찾았는데 문제의 해결법은 매우 간단했다.

 

해결책

  1. File 메뉴에서 Build Setting을 연다.(혹은 Ctrl + Shift + B 단축키로 열 수 있다.)
  2. Platform 리스트 중에서 Android를 선택하고 그 아래에 있는 Player Setting ... 버튼을 누른다.
  3. 그러면 Inspector 창에 Player Setting이 열리는데 아래쪽에 안드로이드 모양 탭중에서 Other Setting이라는 메뉴를 찾는다.
  4. 그 중에 굵은 글씨로 Configuration 메뉴 중에 Internet Access 라는 항목이 있다.
  5. 이 항목의 기본 값은 Auto로 되어 있는데 이것을 Require로 변경한다.

 

 

위의 그림처럼 Internet Access 항목을 Require로 변경해주면된다.

 

이상의 과정을 모두 끝내고 난 이후에 다시 안드로이드 버전으로 빌드하여 모바일에 설치하고 실행하면 서버 접속이 원활하게 이루어지는 것을 알 수 있다.

 

이러한 문제가 ProudNet API를 사용할 때만 나타나는 것인지 아니면 다른 네트워크 API를 사용했을때도 나타나는 문제인지는 모르겠지만 인터넷 상에서 이와 관련된 정보를 찾아보기가 쉽지 않아서 개인적으로 참고도 할 겸, 다른 사람이 찾아봐서 도움도 될 겸해서 포스팅을 남겨둔다.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

팀 단위의 프로젝트 혹은 소스의 버전 컨트롤을 위한 유니티에서 지원하는 유니티 전용의 버전 컨트롤러이다.

 

이게 왜 5.4버전에 와서야 베타로 지원되는지, 왜 이전에 더 빠르게 지원하지 않았는지 의심스러운 기능인데 그 이유는 유니티는 각 종 프로젝트의 정보를 메타 데이터라는 것에 모조리 쑤셔박아 넣기 때문에 일반적인 SVN을 사용하면 메타 데이터가 깨져서 프로젝트가 맛이 가버린다던가 하는 상황이 발생할 확률이 매우 높기 때문에 데이터를 텍스트로 뽑아서 저장하고 SVN을 쓴다던지 아니면 메인 프로젝트 폴더를 두고 다른 작업자들은 Package 파일로 저장해서 합친다던지 하는 원시적인 방법을 써야했었다.그러다가 실수로라도 잘못 덮어쓴다던지 하는 일이 발생하면 대참사가 일어나는 것이고 ...

 

하지만 이 Unity Collaborate 하나면 그런 걱정들은 싹 사라진다. 잘못된 수정 사항이 있으면 간단하게 롤백할 수 있는 기능을 제공하고 있으며, 그리고 더욱 좋은 점은 SVN을 위해서 따로 컴퓨터를 세팅할 필요가 없이 프로젝트의 모든 파일과 데이터는 유니티가 지원해주는 클라우드 서버에 저장된다는 것이다!

 

사용법 :: https://developer.cloud.unity3d.com/collaborate/

 

아무래도 아직 베타 버전이라 그런지 따로 기능 신청을 해야만 사용이 가능한것 같다. 물론 한 사람이 신청을 해서 다른 사람들을 자신의 프로젝트에 초대하면 함께 작업할 수 있다.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

효과적으로 Debug를 하기 위해서는 Debug 빌드를 유지해야한다.

 

하지만 사람들은 Debug 빌드를 잘 사용하지 않는데 그것은 Debug 빌드의 속도가 Release 빌드에 비해서 컴파일 시간도 실행 시간도 느리기 때문이다.

 

Debug 빌드는 기본적으로 최적화 기능이 꺼져있기도 하고, 프로그래머가 에러를 찾기위해 온갖 assert를 넣고 하다보면 프로그램이 더욱 느려지기 마련이다.

 

하지만 Release 빌드는 속도가 빠른 반면에 에러를 잡기위한 디버깅이 힘들어진다. 최적화 단계에 들어선 이후에는 성능이 매우 중요하겠지만 그 이전 단계에서는 프로그램이 얼마나 올바르게 동작하는 가가 제일 중요하다. 그렇기 때문에 버그를 빠르게 찾아내고 수정하기 위해서는 반드시 Debug 빌드를 언제나 컴파일되고 실행되게 유지해야한다.

 

만약 Debug 빌드가 컴파일되지 않게 망가뜨린 프로그래머가 있다면 그는 반드시 다른 프로그래머가 언제든지 Debug 빌드를 실행시킬 수 있도록 복구시켜 두어야 한다.

 

Debug 빌드를 사람들이 잘 쓰지 않는 이유는 속도가 느리기 때문인데 속도를 빠르게 하기 위해 무조건 Release 빌드는 쓰는 것이 아니라 어떻게 해서든 Debug 빌드를 빠르게 만들어야 한다.

 

Debug 기능을 쓸 수 있지만 어느 정도 최적화 기능을 켠 Fast Debug 빌드를 만든다던가. 각 부서별로 자기 부서에 필요한 부분만 Debug로 돌리고 나머지는 Release로 돌릴 수 있게 자동화를 한다던가. 여기저기 있는 assert를 효과적으로 제거한다던가하는 방식으로 말이다.

 

참고 ::

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

 

 

반응형

버그로 인한 메모리 오염, 즉 예상되지 않은 메모리 값 변경, 참조 등에 의해서 발생한다.

 

원인을 다양한데 대부분 안전하지 않은 함수의 사용, 잘못된 함수 사용, 잘못된 포인터 사용 등 프로그래밍 실수로 인해서 발생한다.

 

실수로 사용중인 메모리를 다른 엉뚱한 곳에서 메모리를 덮어쓴다거나 들어가지 말아야할 메모리 주소에 데이터가 들어가는 것을 의미한다.

 

 Memory corruption이 발생했을때 이 메모리에 잘못된 값이 쓰여졌다는 것은 바로 알 수 있지만 이 잘못된 값이 어디서 온 것인지 알기가 쉽지 않다.

 

왜냐하면 사용중인 메모리에 다른 값이 쓰여졌을 당시에는 문제가 발생하지 않고 이후에 덮어씌워진 메모리를 다시 사용할 때가 되어서야 에러가 발생하기 때문이다.

 

만약에 운이 나쁘다면 디버그 중에는 그 잘못 쓰여진 메모리를 다시 사용하는 일이 발생하지 않다가 프로그램을 릴리즈하고 출시한 이후에 실제 버그가 발생하는 경우가 있을 수 있다.

 

그렇게 되면 구매자는 언제 터질지 모르는 시한폭탄같은 프로그램을 구매하게 된 것이고 곧바로 화를 내며 환불을 요구하게 될 것이다.

 

출시한 이 후에야 버그 리포트를 받은 프로그래머 역시 멘탈이 무너질 것이 분명하고... 이 문제를 해결하는 것은 매우 힘들 것이다.

 

그리고 멀티 쓰레딩을 하면서 여러 쓰레드에 한 메모리에 접근하는 상황이면 더욱 복잡하다.

 

포인터를 잘못 다뤄서 이런 문제가 발생하는 경우가 많기 때문에 항상 포인터를 다룰 때는 조심해야 한다.

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

요즘 칩에는 벡터 레지스터라는 개념으로 메모리를 배치하는데, 이 벡터 레지스터 하나에 정수형이나 실수형 4개를 한꺼번에 담아둘 수 있다고 한다.

 

loop 작업시 float이나 int 형식의 4바이트 변수의 배열에 대해 하나씩 훑으며 작업할 때 굳이 하나씩 작업하지 않고 4개를 묶어서 16바이트를 벡터 형식으로 한 번에 처리할 수 있고 이것은 물론 스칼라 형식으로 하나씩 작업하는 것보다 빠르다(이론 상 최대 4배까지 빠를 수 있다).

 

이런 것을 Vectorization이라고 한다. 일반적으로 최신 컴파일러는 이런 Vectorization을 자동으로 수행해준다.

 

어떤 조건하에선 수행하지 못하는 경우가 있다. 수백만줄의 코드를 모두 체크하지는 못하기 때문에 이 체크에 실패하면 Auto Vectorization에 실패한다.

 

Auto Vectorization에 실패했을때 알아내는 방법은 프로그래머는 어셈블리어 코드를 확인하는 방법 밖에 없는데 이것은 어려운 일이다

그리고 Debug 빌드에서는 최종 코드를 내는 것이 아니기 때문에 최적화 기능의 상당부분이 꺼져있어서 Vectorization 또한 수행되지 않는다.

 

10000개 짜리 float 배열 두 개에 대한 loop 작업을 10000회를 수행했을 때의 결과물이다.

 

Release : x64

역으로 성능이 감소하는 케이스가 발생하기는 하지만 대부분 1%이하의 확률이다.

평균적으로 40~50%의 성능 향상을 기대할 수 있다.

 

Release : x86

x64 버전과 거의 비슷한 수준의 결과물을 얻을 수 있다.

반복적으로 실험한 결과 평균 성능 향상 비율을 2~10% 가량 떨어진다.

 

Debug

Debug 빌드에서는 최적화 기능이 꺼져있기 때문에 성능 향상이 거의 없음을 알 수 있다.

 

 

Vectorization 성능 비교 코드

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;
#define ARRSIZE 100000
class Vectorization
{
private:
    int mWorkCount;
    __int64 mTotalVectorTime;
    __int64 mTotalNoVectorTime;
    __int64 mNowVectorTime;
    __int64 mNowNoVectorTime;
    float mMinImproveTime;
    float mMaxImproveTime;
    int mPerformDecreseCase;
    int mPerformIncreseCase;
    int mTotalWorkCount;
public:
    Vectorization() : mWorkCount(0), mTotalVectorTime(0), mTotalNoVectorTime(0),
        mNowVectorTime(0), mNowNoVectorTime(0), mMinImproveTime(0.f), mMaxImproveTime(0.f),
        mPerformDecreseCase(0), mPerformIncreseCase(0), mTotalWorkCount(0)
    {}
    void CalculateWorkTime(float* a, float* b, int arrsize, bool isVector)
    {
        __int64 t1;
        __int64 t2;
        for (int i = 0; i < arrsize; i++)
        {
            a[i] = b[i] = i;
        }
        QueryPerformanceCounter((LARGE_INTEGER*)&t1);
        if (isVector)
        {
            #pragma loop(vector)
            for (int i = 0; i < arrsize; i++)
            {
                a[i] += b[i];
            }
        }
        else
        {
            #pragma loop(no_vector)
            for (int i = 0; i < arrsize; i++)
            {
                a[i] += b[i];
            }
        }
        QueryPerformanceCounter((LARGE_INTEGER*)&t2);
        if (isVector)
        {
            mTotalVectorTime += mNowVectorTime = t2 - t1;
        }
        else
        {
            mTotalNoVectorTime += mNowNoVectorTime = t2 - t1;
        }
    }
    void CalcNowWorkImprovePerform()
    {
        float ImproveRate = 100.0f - (float)mNowVectorTime / (float)mNowNoVectorTime * 100.0f;
        if (ImproveRate < mMinImproveTime)
        {
            mMinImproveTime = ImproveRate;
        }
        else if (ImproveRate > mMaxImproveTime)
        {
            mMaxImproveTime = ImproveRate;
        }
        if (ImproveRate < 0)
        {
            mPerformDecreseCase++;
        }
        else
        {
            mPerformIncreseCase++;
        }
        cout << "현재 벡터화 작업시간 :: " << mNowVectorTime << endl;
        cout << "현재 비벡터화 작업시간 :: " << mNowNoVectorTime << endl;
        printf("현재 성능 향상 비율 :: %.2f %%\n\n", ImproveRate);
        mTotalWorkCount++;
    }
    void CalcTotalWorkImprovePerform()
    {
        float improveRate = 100.0f - (float)mTotalVectorTime / (float)mTotalNoVectorTime * 100.0f;
        cout << "총 벡터화 작업시간 :: " << mTotalVectorTime << endl;
        cout << "총 비벡터화 작업시간 :: " << mTotalNoVectorTime << endl << endl;;
        printf("최저 성능 향상 비율 :: %.2f %%\n", mMinImproveTime);
        printf("최고 성능 향상 비율 :: %.2f %%\n", mMaxImproveTime);
        printf("평균 성능 향상 비율 :: %.2f %%\n\n", improveRate);
        cout << "성능 감소 케이스 :: " << mPerformDecreseCase << "회" << endl;
        printf("성능 감소 케이스 비율 :: %.2f %%\n\n", (float)mPerformDecreseCase / (float)mTotalWorkCount * 100.f);
        cout << "성능 향상 케이스 :: " << mPerformIncreseCase << "회" << endl;
        printf("성능 향상 케이스 비율 :: %.2f %%\n\n", (float)mPerformIncreseCase / (float)mTotalWorkCount * 100.f);
        cout << "총 성능 비교 횟수 :: " << mTotalWorkCount << "회" << endl;
    }
};
 
int main()
{
    Vectorization v;
    float fArr1[ARRSIZE];
    float fArr2[ARRSIZE];
    for (int i = 0; i < 10000; i++)
    {
        v.CalculateWorkTime(fArr1, fArr2, ARRSIZE, true);
        v.CalculateWorkTime(fArr1, fArr2, ARRSIZE, false);
        v.CalcNowWorkImprovePerform();
    }
    v.CalcTotalWorkImprovePerform();
}

 

 

 

[유니티 어필리에이트 프로그램]

아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.

 

에셋스토어

여러분의 작업에 필요한 베스트 에셋을 찾아보세요. 유니티 에셋스토어가 2D, 3D 모델, SDK, 템플릿, 툴 등 여러분의 콘텐츠 제작에 날개를 달아줄 다양한 에셋을 제공합니다.

assetstore.unity.com

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Create 2D & 3D Experiences With Unity's Game Engine | Unity Pro - Unity Store

Unity Pro software is a real-time 3D platform for teams who want to design cross-platform, 2D, 3D, VR, AR & mobile experiences with a full suite of advanced tools.

store.unity.com

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

'C++' 카테고리의 다른 글

[C++11] enum class  (1) 2017.07.17
[C++ 11] static_assert  (0) 2017.05.23
[C++ 11] Range-Based For  (0) 2016.11.01
[C++ 11] Scoped Lock  (0) 2016.11.01

+ Recent posts