2016년 12월 22일 목요일

.NET에서 Exception 사용하기

출처: http://mattwarren.org/2016/12/20/Why-Exceptions-should-be-Exceptional/

위의 글에서 다음과 같은 결론을 내고 있다.

Conclusion

  1. Rare or Exceptional exceptions are not hugely expensive and they should always be the preferred way of error handling in .NET
  2. If you have code that is expected to fail often (such as parsing a string into an integer), use the TryXXX() pattern
  3. The deeper the stack trace, the more work that has to be done, so the more overhead there is when catching/handling exceptions
  4. This is even more true if you are also fetching the entire stack trace, via the StackTraceproperty. So if you don’t need it, don’t fetch it.
좀 더 요약하면
  1. 예외는 보통 그렇게 비싸지 않다
  2. 자주 일어나는 예외는 TryXXX() 패턴을 사용하라
  3. 깊은 스택 추적을 사용할 때, 오버헤드가 있다
  4. StrackTrace 프로퍼티를 사용하면 오버헤드가 크니 필요없으면 사용하지 마라

2016년 5월 25일 수요일

객체지향(OOP), 데이터 지향(DOD) 그리고 동시성

게임 프로그래밍을 하면서 가장 많이 듣는 용어들이지만, 제대로 정리해 본 적이 없다. 이번 기회에 좀 더 심도 깊게 알아본다.
  1. 객체 지향 프로그래밍(OOP)
  2. 데이터 지향 설계(DOD)
  3. 동시성
  먼저, OOP는 시스템에 대한 이해와 변경에 중심을 둔다. SOLID원칙과 UnitTest를 기반으로 하면, 이해하기 쉬우면서 변경에 안정적인 프로그래밍을 할 수 있다. 하지만, OOP를 할 수록 성능에 대한 두려움을 떨치기가 힘들다. 막연하게 Big-O 정도만 고려하면서 작업을 한다.
  DOD는 현재 컴퓨터의 성능 병목이 CPU와 메모리에서 발생하는 것에 주목한다. 그래서, 캐쉬 친화적인 설계에 중심을 둔다. 반복적으로 사용되는 메모리를 선형적인 배열에 두고 처리할 수 있도록 설계를 한다.
  Concurrency Data Design(CDD)는 데이터의 응답 속도에 중심을 둔다. 데이터에 대한 요청이 얼마나 빨리 이뤄져야 하는지를 기반으로 설계를 한다.

결론

제대로 돌아가게 만들고, 최적화는 나중에 한다는 실천법을 적용해보면, OOP를 통해서 시스템을 제대로 돌아가고 이해하기 쉽게 만들고, DOD를 적용하여 성능을 최적화 한다. 그리고 나서 CDD를 통해서 빠른 응답이 필요한 데이터를 추려내는 것이 합리적인 방법이다.
  물론, 어떤 설계는 초기에 결정하지 않으면 변경하기 어려울 수 있다. 그런 부분은 미리 DOD나 CDD를 반영하자. 하지만, 20/80처럼 모든 부분에 적용할 필요는 없다.

참고자료

2016년 1월 28일 목요일

C++에서 deprecated 설정하는 방법

게임을 오래 서비스 하다 보면, 기존 코드를 수정하거나 대체하게 되는데 컴파일러 차원에서 deprecated를 지원해주면 좋다.

방법
  1. #pragma deprecated(identifier, ...)
  2. __declspec(deprecated) void func()
  3. [[deprecated]]
    void func()

1번은 키워드를 지정할 수 있다. 2번은 함수에 지정할 수 있다. 3번은 C++14부터 지원된다.

참고자료
  1. https://msdn.microsoft.com/en-us/library/c8xdzzhh.aspx?f=255&MSPPError=-2147217396
  2. https://msdn.microsoft.com/en-us/library/044swk7y.aspx?f=255&MSPPError=-2147217396
  3. http://josephmansfield.uk/articles/marking-deprecated-c++14.html

2014년 12월 10일 수요일

컴파일 속도 최적화를 위한 윈도우 인덱싱 기능 끄기

윈도우 인덱싱을 검색해보니 성능을 높이려면 무조건 끄라고 한다. 그래서 뭐하는 놈이길래 사람들이 싫어하는지 더 찾아봤다.

윈도우 인덱싱은 윈도우 검색 기능을 위해서 파일들을 찾기 편하게 작은 데이터 베이스를 만들어서 관리하는 서비스다. 이상적으로는 사용자가 컴퓨터를 사용하지 않는 시간에 잠시 떠서 작업을 진행한다.  (http://superuser.com/questions/245540/what-does-windows-indexing-do)


이상적으로는 사용하는 중에 성능에 이상이 없어야 하지만 아닌 경우도 있는 것 같다. (http://www.auslogics.com/en/turbo-windows/turn-off-windows-indexing/ Disable Indexing)

윈도우의 검색 기능을 자주 사용한다면, 쓰지만, 아니라면, Window Search 기능을 끄고 사용하는 것도 좋을 것 같다.

2014년 11월 10일 월요일

인터넷 없이 NuGet으로 패키지 설치하기

인터넷 없이 NuGet을 사용하기 위해서는 다음 두 가지 과정이 필요하다

  1. NuGet 로컬 저장소 구성
  2. 패키지 파일 다운 받기
NuGet 로컬 저장소 구성
여기를 참고하여 설정하면 된다. 정리하면 다음과 같다.
  1. 하드에 저장소로 만들 폴더를 생성한다
    1. 예)c:\LocalNuGetFeed
  2. Visual Studio에 도구>NuGet 패키지 관리자>패키지 관리자 설정을 선택한다
  3. 옵션에서 패키지 소스를 선택한다
  4. 사용 가능한 패키지 소스의 오른쪽에 추가 버튼을 클릭한다
  5. 아래 이름에 My Local Feed, 소스에 c:\LocalNuGetFeed를 입력하고 업데이트 한다
  6. 새로 만든 My Local Feed를 가장 위로 올린다

패키지 파일 다운 받기
    
https://www.nuget.org/api/v2/package/{packageID}/{packageVersion}

packageID는 NuGet 패키지 관리자 콘솔에서 입력하는 패키지 이름이다. packageVersion은 NuGet 페이지에서 Vision History에 있는 버전 정보다.

예를들어, 다음은 SuperSocket 1.6.0 패키지 파일을 다운 받는 URL이다

    
https://www.nuget.org/api/v2/package/SuperSocket/1.6.0
이렇게 받은 파일을 위에서 만든 로컬 저장소에 복사하고, 패키지 설치를 하면 된다.

2014년 11월 2일 일요일

안드로이드 유니티 리모트 4 연동 문제 해결하기

안드로이드에서 유니티 리모트를 연동하기 법은 구글형이 잘 알려준다. 여기서는 자주 발생하는 문제에 대한 해결책을 정리한다.
  1. 폰이 인식되지 않는다
  2. 인증되지 않았다
  3. 유니티에서 Play를 해도 반응이 없다

폰이 인식되지 않는다

일단 USB를 꽂으면, 인식이 되고, 탐색기로 봤을 때, 폰이 보이고, 폴더에 접근하여 파일을 복사하거나 삭제할 수 있어야 한다.

확인방법

  1. 탐색기에서 보이는지 확인
  2. adb로 확인
  3. 폰의 개발자 모드에서 USB 디버깅 활성화 체크

해결방법

  1. USB 통합 드라이브를 설치한다. (구글형에게 문의)
  2. 콘솔명령창에서 adb devices를 실행한다.
  3. 폰 설정에 들어가서 USB 디버깅을 활성화 한다. (구글형에게 문의)

폰이 인증되지 않았다

폰이 인식되면, USB 디버깅을 활성화하면, 유니티에서 Play를 할 때, 개발 컴퓨터의 접속을 허가할 지, 폰에서 묻는다. 이 때, 잘 응답하면 문제가 없으나, 잘못하면 인증이 안된 상태가 된다.

확인방법

  1. adb devices를 했을 때, 폰은 나오나 Unauthorized라고 나온다.

해결방법

콘솔 창에서 다음 명령을 실행한다
  1. adb kill-server
  2. adb start-server
위의 명령을 하고 다시 유니티에서 Play를 하면 폰에서 인증창이 다시 나온다.

유니티에서 Play를 해도 반응이 없다

유니티가 실행된 후에 폰을 연결한 경우, 유니티가 인식을 못하는 경우가 있다

확인방법

  1. 위의 문제의 확인 방법을 통해서 문제가 없는데도 Play를 하면 안된다

해결방법

  1. 유니티 에디터를 재실행한다

Blogger와 SystaxHighlighter 연동하기, 코드 문법 하이라이트

코드 문법 하이라이트를 위해서 SyntaxHighlighter를 사용한다.

설치방법

  1. 구글 블로거의 디자인 -> 탬플릿 -> HTML 편집 을 선택한다
  2. HTML에서 </body> 바로 위에 아래 태그를 붙여넣는다
  3. 저장을 한다.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 


사용방법

<pre /> 메소드



<script /> 메소드