분류 전체보기 504

[C#서버][개념] 임계영역(크리티컬섹션)상호배제 - Moniter, lock

Moniter, lock중 lock사용 추천 Moniter(잘사용안함) static int number = 0; static object _obj = new object(); static void Thread_1() { for (int i = 0; i < 100000; i++) { try { Monitor.Enter(_obj); number++; } finally // 데드락 예방 { Monitor.Exit(_obj); } } } static void Thread_2() { for (int i = 0; i < 100000; i++) { try { Monitor.Enter(_obj); number--; } finally // 데드락 예방 { Monitor.Exit(_obj); } } } static voi..

VisualStudio/C# 2022.10.26

[C#서버][개념] 임계영역(크리티컬섹션)원자성 - 레이스컨디션(Race Condition)과 Interlocked

Rock처리와 함께사용 레이스컨디션 아래와 같은 소스코드를 실행할 경우 결과값은 0이아닌 다른 다양한 수로 출력된다. 이를 레이스 컨디션이라고 한다. number ++를 할경우 보여지기에는 한 단계로 진행될 것 같지만 사실 어셈블리상으로는 아래 소스와 같이 3단계로 나뉘어 지기 때문에 0이아닌 결과가 나타나게된다. static int number =0; static void Thread_1() { for (int i = 0; i < 100000; i++) { //number++;를 어셈블리어로 풀어서 본다면 아래 소스와 같다. int temp = number; temp += 1; number = temp; } } static void Thread_2() { for (int i = 0; i < 100000..

[C#서버][개념] 메모리 베리어( Memory Barrier)

※개념만 알아둘것 메모리 베리어 (Rock처리안할 경우) 멀티스레드 환경에서 메모리순서가 강제로 변경된다. 이때 메모리 순서 변경을 막기위한 방법 1. 코드 재배치 억제 1) Full Memory Barrier(어셈블리 MFENCE, C# Thread.MemoryBarrier) - Store/Load 둘다 막는다. 2) Store Memory Barrier(어셈블리 SFENCE - Store 막는다) 3) Load Memory Barrier(어셈블리 LFENCE - Load 막는다) 2. 가시성 static int x = 0; static int y = 0; static int r1 = 0; static int r2 = 0; static void Thread_1() { y = 1; //Thread.Mem..

[C#서버][기초] Thread & ThreadPool & Task

Thread※아래와 같은 방법으로 Thread를 직접 만들어 사용할 경우 만든 개발자가 끝까지 책임져야하는 스레드이다. (어떤 일을 할 때 마다 정직원을 고용하는 개념) 성능에 많은 부하가 갈 수 있다. IsBackground - True를 선택할 경우 메인스레드가 종료되면 함께 종료된다. (선택해줘야함)Join - 현재 새로 만든 스레드가 종료될 때까지 아래 메인스레드는 실행 할 수 없다. static void MainThread() { for (int i = 0; i ThreadPool※이미 만들어진 스레드를 잠깐 사용하는 용도로 부하가 적다.(새롭게 고용하는 직원이아닌 고용된 직원을 유동적으로 사용하는 개념, Unity의 오브젝트 풀과 같은 개념이다.)  ※스레드 ..

[C#서버][기초] Thread 테스트 방법

스레드 검색 방법 일시정지 - 스레드 창에서 스레드 선택 Thread ※아래와 같은 방법으로 Thread를 직접 만들어 사용할 경우 만든 개발자가 끝까지 책임져야하는 스레드이다. (어떤 일을 할 때 마다 정직원을 고용하는 개념) 성능에 많은 부하가 갈 수 있다. IsBackground - True를 선택할 경우 메인스레드가 종료되면 함께 종료된다. (선택해줘야함) Join - 현재 새로 만든 스레드가 종료될 때까지 아래 메인스레드는 실행 할 수 없다. ThreadPool ※이미 만들어진 스레드를 잠깐 사용하는 용도로 부하가 적다.(새롭게 고용하는 직원이아닌 고용된 직원을 유동적으로 사용하는 개념, Unity의 오브젝트 풀과 같은 개념이다.) ※스레드 풀을 사용할 때는 짧게 사용하는 곳에서 사용해야 용의하..

[Unity][방법][팁] Conditional사용하여 로그(LOG)사용하기

Debug Log 구문 제거하기 Log 구문, 특히 Update, LateUpdate 또는 FixedUpdate에 있는 Log 구문은 성능을 낮출 수 있습니다. 빌드를 만들기 전에 Log 구문을 비활성화하세요. 이 작업을 보다 쉽게 하려면 프리 프로세서 지시문과 함께 조건부 속성을 만드는 것이 좋습니다. 예를 들어 다음과 같은 커스텀 클래스를 만듭니다. public static class Logging { [System.Diagnostics.Conditional("ENABLE_LOG")] static public void Log(object message) { UnityEngine.Debug.Log(message); } } Player Settings -> Player -> Other Settings 커..

Unity 2022.10.20

[Unity][팁, 방법] 애니메이션 파라미터 사용하지 않고 소스 제어

아래와 같이 파라미터가를 사용하지 않고 소스 제어 방법 1. Play사용하기 public PlayerState State { get { return _state; } set { _state = value; Animator anim = GetComponent(); switch (_state) { case PlayerState.Die: anim.Play("WAIT"); break; case PlayerState.Idle: anim.Play("WAIT"); break; case PlayerState.Moving: anim.Play("RUN"); break; case PlayerState.Skill: anim.Play("ATTACK"); break; } } } 2. CrossFad사용하기 CrossFad인자값 ..

Unity 2022.10.13