목록전체 글 (162)
Coding Memo
Visual Studio에는 실행을 하기위한 Application이 아닌 Class Library로 프로젝트를 빌드를 했을 때 유용한 기능이 있다. (C# 뿐만 아니라 다른 언어에 대해서도 지원한다.) 라이브러리 프로젝트에 담긴 형식에 맞는 주석(xml 형식)을 빌드한 라이브러리 파일을 가져다 사용하는 프로젝트에서도 동일하게 확인할 수 있다. 위 이미지는 라이브러리 프로젝트에서의 코드이다. summary를 작성하고 마우스를 클래스에 올려다 두면 해당 설명이 표시가 된다! (흔히 코드를 작성할 때, 미리 컴파일되어 있는 파일에 있는 프로퍼티나 함수에 대한 설명이 나오는 것이 바로 이런 것이다.) 위와 같은 기능을 컴파일된 라이브러리를 사용하는 다른 프로젝트에서도 동일하게 사용할 수 있다! 먼저 간단하게 주..
- Unity에서의 비동기 작업은 주로 Unity의 메인스레드에 처리 Addressable에서 여러개의 비동기 작업을 실행 후, 완료를 확인하고 싶을 때 Interlocked등의 atomic하게 연산을 할 필요가 없다. Thread-safe 이다. - 외부 라이브러리의 스레드에서는 UnityObject를 컨트롤 할 수 없을 뿐더러, Coroutine도 실행 시킬 수 없음 예를 들어 Socket에서 데이터를 받고 이를 바로 해당 스레드에서 처리하려고 하여, UnityObject를 건드린다면 어떠한 동작도 실행하지 않거나 오류가 날 것이다. 또한 Coroutine도 마찬가지이다. - Addressables.LoadResourceLocationsAsync() 의 첫번째 인자로, Addressable에 등록되어..
Entity Framework에서 데이터 모델 클래스를 작성할 때, Navigation Property (네비게이션 속성)에 virtual 키워드를 붙일 수 있다. virtual 키워드는 Entity Framework가 이 속성(property)를 Lazy Loading 하도록 한다. Lazy Loading은 해당 클래스나 객체를 로드시에 같이 바로 로드되는 것이 아니라, 관련된 데이터가 실제로 필요한 시점에만 데이터베이스로부터 로드하도록 한다. 아래와 같은 모델이 있다고 사정하자. [Table("User")] public class UserDb { [Key] public ulong UserId { get; set; } public string UserName { get; set; } } [Table("..
Summary Coroutine은 반드시 Unity 메인 스레드에서만 실행되어야 한다. (다른 스레드에서 StartCoroutine을 호출해도 소용없다!) 외부 스레드에서 Unity 오브젝트 접근을 막아 놓은 것과 동일한 맥락으로 생각하면 될 것 같다. 내가 겪었던 문제는 다음과 같다. Situation Client가 Server에 연결이 되고 연결이 되었을 때의 callback으로 서버에 ping 패킷을 보내는 Coroutine을 호출하고 있었다. tcp 연결은 내가 간단하게 만든 라이브러리에서 실행이 된다. 코드를 간단하게 나타내면 다음과 같다. StartCoroutineEx는 static이고 MonoBehaviour를 상속하고 있는 CoroutineManager에 있는 static함수로, IEnum..
서버와 클라이언트 사이에 패킷을 암호화 하여 전송을 하려고 계획했다. 생각한 2가지 방법은 일단 모두 대칭키 방식이다. 첫 번째는 단순히 바이트 배열에 대한 비트연산을 활용하는 방법, 두 번째는 AES 암호화를 사용하는 방법. 간단한 비트 연산 xor 연산을 이용하여 암호화 및 복호화하는 방법이다. public byte[] Encrypt(byte[] data, byte[] key) { byte[] encrypted = new byte[data.Length]; for (int i = 0; i < data.Length; i++) { encrypted[i] = (byte)(data[i] ^ key[i % key.Length]); } return encrypted; } public byte[] Decrypt(b..
BitConverter는 .NET에서 제공하는 API로 기본 primitive 타입들의 데이터를 바이트 배열(byte[])로 직렬화하거나 바이트 배열을 역직렬화하는 기능을 제공한다. 제공되는 Primitive Types - Boolean - Char - Double - Int16 (short) - Int32 (int) - int64 (long) - Single (float) - UInt16 (ushort) - UInt32 (uint) - UInt64 (ulong) Note: float형이 Single로 된다는 것을 유의하자. 아래 문서에 자세히 나와 있다. https://learn.microsoft.com/ko-kr/dotnet/api/system.bitconverter?view=net-8.0 BitCo..
C#에서 어떤 타이머를 구현하거나 실행 예약 등을 할 때 Environment.TickCount를 이용할 수 있다. (물론 타이머는 기본적으로 제공하기는 한다. (System.Timers.Timer 등)) https://learn.microsoft.com/en-us/dotnet/api/system.environment.tickcount?view=net-8.0 Environment.TickCount Property (System) Gets the number of milliseconds elapsed since the system started. learn.microsoft.com 기계어로 번역되어 있는 부분이 많이 보이는데 항상 이해을 하지 못할 정도로 제대로 번역이 되어 있지 않은 경우가 많은 것 같다..
"멀티 스레드 환경에서 싱글턴 클래스의 생성자도 동시에 여러 스레드가 접근 할 수 있다는 것을 기억하자." 싱글턴 패턴 사용시에 스레드에 주의해야 한다. 당연하고 또 당연한 말이고 쉽게 찾을 수 있는 에러이기도 하지만 여기에 간단하게 작성해본다. Singleton이란 싱글턴 클래스가 있다고 가정하자. 먼저 내가 겪었던 상황은 다음과 같다. - 싱글턴 클래스가 Only-Read로만 사용되기 때문에 멀티스레드 환경에서의 다른 lock 처리를 해주지 않았다. - 어떤 스레드 하나가 데이터를 받으면 Singleton .Instance.method()를 호출한다. - 바로 위 상황이 아니면 다른 코드에서 이 싱글턴 클래스를 사용하지 않았다. - 이 싱글턴 클래스는 생성자에서 처음이자 마지막으로 콜랙션에 데이터를 ..