전체 글 483

[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

[Unity][방법] Status패턴 방법

1. enum으로 상태값 정의 2. 상태에 따른 함수 정의 3. 상태만 변경해서 사용 float wait_run_ratio; PlayerState _state = PlayerState.Idle; public enum PlayerState { Die, Moving, Idle, } void UpdateDie() { } void UpdateMoving() { Vector3 dir = _destPos - transform.position; if (dir.magnitude < 0.0001f) { _state = PlayerState.Idle; } else { float moveDist = Math.Clamp(_speed * Time.deltaTime, 0, dir.magnitude);//clamp는 시작 값 끝값..

Unity 2022.10.06

[Unity][방법] 에니매이션 합성하여 호출하는 방법

1. Animator 창에서 우클릭 2. motion 추가 3. 2개의 합성된 애니메이션 사용시 조절 파라미터 생성 4. 합성 애니메이션 소스에서 호출 (Mathf.Lerp는 부드러운 움직임을 위해) if (_moveToDest) { wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10.0f * Time.deltaTime); Animator anim = GetComponent(); anim.SetFloat("wait_run_ratio", wait_run_ratio); anim.Play("WAIT_RUN"); } else { wait_run_ratio = Mathf.Lerp(wait_run_ratio, 0, 10.0f * Time.deltaTime); Animator a..

Unity 2022.10.06

[Unity][방법] Object충돌(Collision)_3 Ray사용하여 마우스 클릭좌표 얻기

Local -> Word > ViewPort -> Screen(화면) Input.mousePosition; //스크린 좌표 픽셀좌표 Camera.main.ScreenToViewportPoint(Input.mousePosition); // 특정 픽셀의 비율좌표 Ray 사용권장 #region Ray 사용한방법 if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f); RaycastHit hit; if (Physics.Raycast(ray, o..

Unity 2022.10.05

[Unity][방법] Object충돌(Collision)_2 RaycastHit 레이저사용하기

RaycastHit[] hits; - 충돌된 오브젝트 변수 Physics.RaycastAll - 레이저 Debug.DrawRay(transform.position + Vector3.up, look * 10, Color.red); - debug를 통해 레이저 발사 방향 확인 void Update() { Vector3 look = transform.TransformDirection(Vector3.forward);//지역포지션 캐릭터 방향으로 레이저 발사를 위해. Debug.DrawRay(transform.position + Vector3.up, look * 10, Color.red);//debug를 통해 레이저 발사 방향 확인 #region 여러개 확인 RaycastHit[] hits; hits = Phys..

Unity 2022.10.05

[Unity][방법] Object충돌_1(Collision) OnCollisionEnter, OnTriggerEnter, OverlapSphere(설정반경오브젝트 확인) 방법

OnCollisionEnter OnCollisionEnter 보통 서든어택 같은 fps에서 사용할때 좋다. 총알이 맞은 후 행위 1) 나한테 혹은 상대에게 RigidBody가 있어야한다(IsKinematic : off) 2) 나한테 Collider가 있어야한다(IsTrigger : off) 3) 상대한테 Collider가 있어야한다(IsTrigger : off) IsKinematic - unity 물리엔진 사용유무 mass - 질량 public class TestCollision : MonoBehaviour { //1) 나한테 혹은 상대에게 RigidBody가 있어야한다(IsKinematic : off) //2) 나한테 Collider가 있어야한다(IsTrigger : off) //3) 상대한테 Coll..

Unity 2022.10.05