전체 글 31

Unity : tag 확인 시 == 가 아니라 CompareTag 를 사용하라

유니티 게임 오브젝트의 tag를 체크하여, tag에 따라 다른 동작을 해주려고 할 때 tag를 체크하는 코드를 다음과 같이 작성했더니 경고 메세지가 떴다. // 1. equality operator 로 비교 if (gameObject.tag == "MyTag") { // do something... } 경고 메세지는 다음과 같았다. info UNT0002: Comparing tags using == is inefficient. equality operator 로 비교하는 것은 비효율적이라고 한다. 대안이 있을 것 같아서 조금 찾아보니, 다음과 같이 CompareTag() 로 비교하는 것이 조금 더 효율적이라고 한다. // 2. CompareTag 메소드로 비교 if (gameObject.CompareTa..

Unity 2020.12.14

Unity : 상속받은 User-defined 클래스에 중단점이 안걸릴 때

내가 만든 클래스(AttackState)에 중단점을 걸어보았더니, 다음과 같은 노티 메세지를 띄우며 중단점이 비활성화 되었다. 메세지 : 중단점이 현재 적중되지 않습니다. 해당 위치를 찾을 수 없음. 왜 이런 현상이 발생할까? 혹시 UDT 라면 모두 발생하는 이슈인가 싶어서, 부모 클래스인 State 클래스의 메소드에도 중단점을 걸어보았다. 그랬더니, State 클래스에는 중단점이 잘 걸리는 걸 확인할 수 있었다. 즉, 다음과 같은 상황이었다. 유니티는 아예 "상속받지 않은 클래스" 에 대해서는 중단점이 정상 동작하지만, UnrealEngine.Object 가 아닌 UDT 를 상속받은 자식 클래스에 대해서는 중단점을 지원하지 않는 것으로 보인다. 해결법은, 최상위 클래스인 State 가 UnrealEng..

Unity 2020.12.14

Unity : 충돌 후 이동방향이 삐딱할 때

취미 겸 유니티 프로젝트를 시작했는데 너무도 친절한 엔진이 낯설기만 하다. 충돌 후 목적지까지 이동 시에는 게걸음으로 이동하고, 목적지까지 도달한 후에는 캐릭터가 계속 뱅글뱅글 도는 문제가 있었다. 확인해보니 오브젝트가 충돌한 뒤, rigidbody 의 Angular Velocity 가 초기화되지 않고 계속 슬라이딩 벡터 계산 시의 값으로 남아있는 것을 발견했다. 충돌이 끝났을 때, 위 값을 다시 초기화 해줘야 했다. 충돌이 끝나는 시점은 void OnCollisionExit(Collision collision) 위 콜백함수로 알 수 있었다. 다음과 같이 OnCollisionExit() 콜백함수를 구현하니 정상적으로 동작하는것을 확인할 수 있었다. private void OnCollisionExit(Co..

Unity 2020.12.13

C++ : shrink_to_fit()

c++11에서 새로 도입된 함수 shrink_to_fit()은 기존에 swap()밖에 없었던 연속된 메모리를 가진 컨테이너의 capacity를 줄여주는 함수다. vector v; 로 현재 size에 맞게 capacity를 줄이는데 다음 한 줄이면 된다. v.shrink_to_fit(); 함수의 내부적인 동작은 기존의 swap을 통한 메모리 재할당과 동일하다. 이 함수는 non-binding 함수인데, 이것이 의미하는 것은 "컴파일러 회사한테 구현하라고 만들어놨지만, 꼭 구현해야 하는건 아냐" 라고 한다. 이 함수가 non-binding 인 이유에 대해서는 stack overflow에서도 말이 많은 것 같지만 대표적인 이유는 이거다. 너무 비싸서 만드는 데 돈이 많이 드는 것이 아니라, 원소를 복사하는데 ..

C++ 2020.12.13

L1 캐시는 왜 Data와 Inst로 나뉘어 있나요? (번역)

원문 : softwareengineering.stackexchange.com/questions/44731/why-are-there-separate-l1-caches-for-data-and-instructions ​여기에는 몇가지 이유가 있습니다. 첫번째이자 가장 중요한 이유는, inst(명령어) 캐시에 저장되는 정보(data)는 일반적으로 data 캐시에 저장되는 것과 다릅니다. - inst 캐시에 저장되는 정보는 디코더를 돕기 위해 명령어 자체와 함께, 다음에 실행될 명령어가 어디 있는지를 저장하고 있습니다. 어떤 프로세서는 (Netburst나 SPARCs, 인텔 펜티엄 4 ) "trace cache"란 기법을 사용하는데, 이것은 암호화된 상태의 명령어를 저장하기보다는 명령어를 디코딩 결과를 저장하는 ..

C++ 2020.12.13

TBB - 병렬 컨테이너 사용 (concurrent_hash_map) : GameServer에서 유저의 <id, index> 정보 관리

서론 : 게임서버에서 유저 정보를 포인터로 관리하면 안되는 이유 졸업작품 게임 서버를 만들고 있는 지금, 안그래도 시간이 부족한데 포스트까지 작성할 시간이 있을지 고민이 많이 되었다. 하지만 경험 상 내가 겪었던 문제를 기록하지 않으면 같은 문제에 똑같이 시간을 낭비할 수 있으므로.. 지난 NDC 2014에서 정내훈 교수님께서 발표하셨던 "멀티스레딩 왜이리 힘드나요 시즌 2" 시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요? Lock-free 멀티쓰레드 프로그래밍 기법과 Transactional Memory를 실제 사용예제를 통해 설명하고, 성능을 보여줌. www.slideshare.net 에서 concurrent_hash_map을 이용한 쌍으로 유저 관리! 라는 부분을 보고 '아차' 싶은 생각이 들었..

C++ 2020.12.13

cocos2d-x 3.0 draw line (선 그리기)

디버깅용으로 선을 그려야 할 때가 있다. 이 때 스프라이트를 상속받아 draw함수를 오버라이딩해서 openGL 코드를 사용해야 하는데, 이 걸 cocos2d-x 커뮤니티에서 dualface라는 분이 클래스화 시켜 놓으셨다. 그런데 이게 2.0 기준으로 작성되어서 경고가 좀 뜨길래, 3.0버전에 맞게 수정했다. 원본 링크 : http://www.cocos2d-x.org/forums/6/topics/3831?r=44760 DebugDraw - draw lines, points easy DebugDraw.h #include "cocos2d.h" typedef struct { CCPoint pt1; CCPoint pt2; float r; float g; float b; } DebugLine; typedef st..

C++ 2020.12.13

cocos2d-x사용 시 rc.exe이(가) 종료되었습니다 해결법

cocos2d-x로 프로젝트를 진행하다가 독립적으로 프로젝트를 분리할 필요가 있어서 다른 곳에 프로젝트를 새로 생성하여 cocos2d 폴더와 cocosDenshion 폴더를 옮기고 dll과 lib파일까지 다 옮겼는데 실행이 안될 때가 있다. " rc.exe이(가) 종료되었습니다 " 라며 코드 1을 리턴한다. 프로젝트 이름이 한글이기 때문이었다. 프로젝트 이름과 경로에 한글이 없도록 변경하면 해결된다.

C++ 2020.12.13

SKY BOX 제작 툴 : CubeMapGen

최근 Dx9 으로 진행하는 개인프로젝트에 Skybox 가 필요해서 여기저기 찾아본 결과, 분리된 6개의 이미지를 vertical cross 형태로 만들어주는 툴이 필요했다. 찾아보니 다음의 툴이 내가 원하는 역할을 하고있는 것을 발견했다. https://gpuopen.com/archive/gamescgi/cubemapgen/ CubeMapGen - GPUOpen AMD CubeMapGen has reached end of life. AMD no longer supports CubeMapGen, but makes it available for download without warranty. Overview CubeMapGen is a tool for importing, filtering, visualizi..

C++ 2020.12.12

Volatile : 멀티쓰레드 프로그래밍 시 거의 쓸모 없는 그 것

Volatile : 멀티쓰레드 프로그래밍 시 거의 쓸모 없는 그 것 원본 : http://software.intel.com/en-us/blogs/2007/11/30/volatile-almost-useless-for-multi-threaded-programming/ 의역, 오역 주의.한 줄 요약 : volatile은 컴파일러 최적화를 꺼주는 역할이다. 메모리 일관성을 유지하려면 mfence를 사용하자. volatile 키워드가 멀티쓰레드 프로그래밍에 유용하다는 소문이 널리 퍼졌다. 내가 처음 volatile 수식어를 봤을 때, 당연히 "멀티 쓰레드 프로그래밍 할 때 유용하겠는데?"라고 생각했다. 몇 주 전까지는 유용하다고 생각했다. 몇 주 전, volatile이 멀티쓰레드 프로그래밍에 거의 쓸모가 없다는 ..

C++ 2020.12.12