분류 전체보기

Programming/C# & Unity

C# Enum Flag

Item에 대한 속성(버리기 가능, 사용 가능, 장착 가능, 강화 가능)을 하나의 변수에다가 담고 싶다. 그럴땐 Enum을 사용하여 Flag 연산을 통해 작업을 하는 것이 편하고 싸다. 이렇게 Enum을 정의하여 나는 포션이라는 타입에다가 Deletable과 Usable 속성을 합쳐서 하나의 변수에 담을 수 있게 되었다. 플래그를 꺼내서 사용할 때에는 위와 같은 방식으로 사용하는게 예쁘다. 여기서 궁금한 내용이 ~0가 뭔가? 싶었는데, 물결표 연산자는 이진수 값을 모두 뒤집은 것. 즉 0의 이진수 값은 00000000..인데 이를 뒤집은 뒤집은 11111111... 이며 값은 -1이다. 그래서 모든 Flag 연산에 or을 걸어도 True를 내뱉을 수 있는 All로써 제격인 값. 다른 방법으로는 Int.M..

Programming/C# & Unity

C# DateTime.Now 속도

개요 개발 중 퍼포먼스 측정을 위하여 소요 시간을 아주 잦게 해야하는 로직이 있었다. 이때 제일 익숙하게 사용하는 DateTime.Now를 사용하면 느리지 않을까 싶어서 알아 보았다. 요약 DateTime.Now > StopWatch > DateTime.UtcNow 순으로 무거우니 빠른 계산은 UtcNow를 사용하고, 정밀 계산이 필요하면 StopWatch를 사용하자. 내용 1. DateTime.UtcNow UtcNow쪽을 살펴보면 단순히 SystemTime을 가져오는 것이 전부 인것으로 보인다. 2. StopWatch StopWatch는 HighResoulution이 켜져있다면 좀 더 무겁고 정밀한 계산을 하고, 그게 아니라면 위의 UtcNow를 사용한다. 하지만 대부분의 경우 QPC가 깔려있어서 QP..

Programming/C# & Unity

C# discards (안쓰는 out var , 안쓰는 tuple 숨기기)

C#에서 Parameter를 Out으로 받지만 호출자는 사용할 필요 없는 경우가 존재한다. public void Main() { string str = "abc"; if (int.TryParse(str, out var intResult) == false) // intResult는 쓸모가 없음. { Console.WriteLine("이것은 int 다."); return; } if (float.TryParse(str, out var floatResult) == false) // floatResult는 쓸모가 없음. { Console.WriteLine("이것은 float 이다."); return; } Console.WriteLine("Parse가 가능하다."); } 위와 같은 경우 intResult나 floa..

Programming/C# & Unity

C# 가비지 컬렉션 루트 오브젝트 (GC root object)

기본적으로 C++ 스마트 포인터는 그냥 ref count를 통해서 간단한 원리로 관리가 된다. 그리고 C#의 GC(Garbage Collection)은 루트 오브젝트에서 끊긴 포인터들을 해제시키고 살아있는 친구들은 세대를 넘겨 자주 체크 하지 않도록 한다고 알려져있다. 여기서 루트 오브젝트가 대체 뭐고 언제 연결되고 끊기는 지 궁금해져서 확인해보았다. (https://www.red-gate.com/simple-talk/development/dotnet-development/understanding-garbage-collection-in-net/) 루트 (rooted reference 라고 부르는 듯) 1. 현재 실행 중인 스레드의 지역 변수는 루트 오브젝트로 간주된다. 2. 정적 변수는 루트 오브젝트로 ..

Day Life

게임 서버프로그래머 경력 이직 면접 정리 (주니어)

최근에 이직 준비를 하면서 코테를 여럿 보았는데 성적이 되게 나쁘지 않았다. 그래서 그런지 면접도 회사에서 쓰던 지식으로 보면 되겠지?라는 안일한 마음으로 갔다가 처참하게 머리가 터졌다. 신입 면접 때 다 대답했던 내용인데, 거의 절반 이상의 내용을 제대로 말하지 못하였고, 서버 프로그래머로써 나의 단점을 말할 때 서버 경험이 부족하다고 말하는 대참사가 벌어졌다. 그래서 어느 정도 정리를 하고 이직을 성공할 때까지 이 포스트를 최신화하도록 할 것이다. 이직 완료해서 더 이상 최신화는 없음. 대충 느낀건 경력 면접에 두 가지 타입이 있는 것 같다. 1. 스피드 퀴즈 쇼 타입 : 실제 재직 중에 전혀 사용하지 않고, 직전에 외우지 않으면 절대 기억 날 수 없는 그런 면접용 지식들까지도 왕창 물어보고 모르면 ..

Programming/C# & Unity

C# Tuple, ValueTuple

1. Tuple private Tuple CompleteQuest(Int32 iID_) { return Tuple.Create(EErrorCode.INVALID_ID, null, null); } public void Main() { var tuResult = CompleteQuest(5); if(tuResult.Item1 != EErrorCode.OK) { Logging($"Error : {tuResult.Item1}."); return; } UpdateQuest(tuResult.Item2); ReceiveReward(tuResult.Item3); } Tuple은 C++의 그것과 동일하다. 여러 가지를 한 번에 전달해야 하는데 구조체 같은 것으로 감쌀 만큼 재사용성이나 스펙이 크지 않을 때 사용한다. 2..

Programming/C++ & Unreal

C++ RTTI 구현

개요 RTTI는 Run Time Type Information의 약자로 프로그램이 실행된 시점에 Type을 알 수 있는 기능이다. 기본 #include using namespace std; class A { }; class B { }; int main() { A a; B b; cout

Programming

Redis 랭킹 동점 처리

알고 있는 레디스 랭킹 동점 처리 관련 기법(?)을 몇 개 정리해보았다. (JS) 1. 기본 redisClient.ZREVRANGE("ranking:myRank", 0, -1, 'WITHSCORES', PrintRedisRank); 0) E : 100 1) D : 100 2) A : 100 3) B : 95 4) C : 70 기본적으로 Redis Rank(ZSet)은 score를 기준으로 정렬한 다음에 동점자가 있으면 key를 기준으로 다시 정렬해서 준다. 이외의 동점자 기준은 Redis에서 지원해주지 않아서 서버 애플리케이션 단에서 처리해줘야 한다. 2. 동점자는 같은 등수로 async function PrintRank( name ){ // 먼저 랭킹을 가져올 유저의 score를 가져온다. var sc..

Programming/C# & Unity

C# 게임 서버 (.net core) 장단점

C# 콘솔 서버를 실무에서 사용해보면서 느껴진 신입의 입장에서 주관적인 장점과 단점을 정리해보았다. 장점 1. 메모리 관리 수월 : C++은 잘못된 메모리를 접근하고 쓰는 순간 망한다. 심지어 스마트 포인터를 사용하거나 new-delete 관리를 잘해줘도 파편화 때문에 터져버린다. 하지만 C#의 GC는 단순 소멸 생성 외에도 파편화, 순환 참조 까지 다 해결해줘서 코드를 쉽게 깔끔하고 문제없이 동작하도록 짤 수 있다. 2. 유니티 프로젝트와 찰떡 : 클라이언트에서 사용하는 기획 데이터 코드나 패킷 구조체등을 그냥 그대로 가져다 쓸 수가 있다. 똑같은 일을 두 번 하는 뻘짓을 줄여주는 것 외에도, 클라-서버 간에 공통 작업이 누락되어 생기는 문제 같은 것들을 원천 차단할 수 있어서 편리하다. 3. 치명적 ..

Programming/Network

레디스 랭킹 (zrank, sorted set) 최대값 최소값

Key(Member) : String 이므로 제한 딱히 없음. Value(Score) : Double, -9007199254740992 ~ 9007199254740992 ( -2^52 ~ 2^53 ) 갯수 : 2^32 -1 실제로 저 영역이 벗어나면 값이 이상해지더라... (Test5, Test11과 Test 9, Test10은 서로 다른 값으로 설정함) 문서 출처 : redis.io/topics/data-types Data types – Redis *Data types *Strings Strings are the most basic kind of Redis value. Redis Strings are binary safe, this means that a Redis string can contain a..

장형이
'분류 전체보기' 카테고리의 글 목록 (3 Page)