2024/04 20

Lock

Critical Section (임계 영역)Critical Section이란 두개 이상의 쓰레드가 동시에 공유 자원을 접근할 수 있는 코드의 부분을 말한다. 멀티쓰레드 프로그래밍에서는이 Critical Section에 한번에 하나의 쓰레드만 접근이 가능하도록 설계를 해야 한다.그래서 Lock 등의 방법을 사용하여 Critical Section에는 한번에 하나의 쓰레드만 접근하도록 할 수 있고, 이렇게 한번에 하나의 쓰레드만 접근하도록 하여 공유 자원의 동시 사용을 막는 것을 Mutual Exclusion(상호 배제)라고 한다. DeadLock (데드락, 교착상태)경우에 따라서 Lock 안에서 또 Lock을 잡아야 하는 경우가 있을 수 있다.1번 쓰레드에서 1번 Lock을 잡고 그 안에서 2번 Lock을 ..

C# 서버 2024.04.29

Race Condition(경합 조건), Atomic(원자성)

class Program{ static int number = 0; static void Thread_1() { for (int i = 0; i 위의 코드를 실행하면 어떤 결과가 나올까? 예상할 수 있는 결과는 0이다.하지만 상대는 멀티쓰레드... 항상 예상하지 못한 결과가 나온다. 역시나 예상했던 0이 나오지 않고 실행할때마다 다른 결과가 나온다.이것은 프로세서 2개가 동시에 공유 자원을 접근하기 때문에 예상하지 못한 결과가 나오는 것이고, 이것을 Race Condition(경합 조건)이라고 한다. 아니 그런데 number를 수정하는 코드는 단 한줄이고 한번에 일어나는 것인데 동시에 실행한다고 해도 상관없는 것 아닌가? 라는 의문이 들 수 있다.하지만 어셈블리어로 분석해보면..

C# 서버 2024.04.29

캐시

캐시 CPU의 코어에는 ALU라고 하는 연산을 하는 장치와 데이터를 기억하는 장치인 캐시가 있다.RAM과 CPU는 물리적으로 거리가 있기 때문에 매번 RAM에서 데이터를 가져와서 사용하는 것은 느리다.그래서 필요한 데이터들을 임시로 저장해놓고 사용하고, 이 임시 데이터들을 저장하는 장소를 캐시하고 한다. 데이터를 변경할때도 마찬가지이다.바로 메모리에 변경된 데이터를 올리는 것이 아니라, 일단 자신의 캐시에 저장해놓고 나중에 실제 메모리에 한번에 올린다. 캐시는 RAM에 비해서는 공간이 매~~~우 작은데 그럼 RAM에서 어떤 데이터를 임시로 가지고 있어야 할까?캐시에는 Temporal Locality(시간적 지역성), Spacial Locality(공간적 지역성)이라는 두가지 철학이 있다.Temporal ..

C# 서버 2024.04.28

멀티쓰레드 프로그래밍

멀티쓰레드란?쓰레드란 프로세스(프로그램)에서 실행되는 흐름의 단위이다.보통 알고리즘 문제를 풀거나 유니티 로직을 짤때 별도의 쓰레드를 생성하지 않았고, 그렇다면 기본적으로 하나의 쓰레드가 존재한다.이렇게 하나의 쓰레드가 하나의 프로세스에 있는 것을 싱글쓰레드 라고 하고, 여러개의 쓰레드가 하나의 프로세스에 있는 것을 멀티쓰레드라고 한다. 스레드는 그냥 실행되는것이 아니라 실행하는데 필요한 자원이 필요하다.즉, 프로세서(CPU코어)가 스레드를 실행해줘야 하고, 프로세서는 한번에 하나의 쓰레드만 실행시킬 수 있다.프로세스가 실행되는 과정은 프로세서가 엄청나게 빠른 시간 간격으로 쓰레드들에 할당되어 쓰레드를 실행해주는 것이다. 코어가 할당되는 속도가 매우 빠르다보니 동시에 실행되는것처럼 보이는 것이다. 프로세..

C# 서버 2024.04.28

UE5로 만드는 Team Fortress 2 닷지볼 - 사운드 추가, Aws에 올린 서버를 통해 멀티플레이

앞으로 해야하는 작업1. 로켓의 움직임을 보간작업을 통해 부드러운 움직임 구현2. 사람 여러명일때 반사하는 각도에 따라 타겟 설정 하는 공식 만들기 (내적을 이용하면 될거같음)3. 맵 적용4. 로켓 파티클이 맘에 안드는데 수정하기5. 어색한 애니메이션 해결6. 관전상태일때 다른 사람 시점으로 볼 수 있는 기능 추가7. 팀별 스폰장소 지정하고 게임 Ready상태일때 스폰장소에 스폰하기8. Ready상태일때는 못움직이게 하기 생각보다 할게많네

UE5로 만드는 Team Fortress 2 닷지볼 - 채팅 시스템

채팅 시스템 구현을 위해 3개의 Widget을 제작하였다.  1. ChatUI : 엔터를 누르면 나오는 채팅 UI로, 채팅 로그들이 기록되고 스크롤박스를 통해 스크롤하여 지금까지의 채팅 내용을 확인할 수 있다.2. ChatTmpUI : 잠깐 나왔다가 사라지는 채팅 UI로, 실시간으로 올라오는 채팅이 잠깐 나왔다가 사라지는 UI이다.3. ChatElement : ChatUI의 스크롤박스의 자식, ChatTmpUI 의 VerticalBox에 들어가는 실제 채팅 메세지, 발신인을 표시하는 UI이다. RichText를 사용하여 부분적으로 텍스트의 색상을 변경 가능하도록 하였다. 플레이어의 상태, 현재 팀에 따라 플레이어 앞에 붙는 수식어와 플레이어의 이름 색상이 변경되도록 하였다. 만약 ..

UE5로 만드는 Team Fortress 2 닷지볼 - 킬피드UI

게임 도중 누가 죽이고 누가 죽었는지를 보여주는 킬 피드 UI를 제작하였다.로켓 폭발시 연관성을 기반으로 동작하는 MulticastRPC를 사용하여 모든 플레이어들에게 공격자와 피해자 정보를 넘겨주고, 클라이언트에서는 넘겨받은 정보를 사용해 킬 피드 UI를 띄워주었다. 넘겨받은 플레이어의 정보를 바탕으로 팀 닉네임을 해당 플레이어의 팀 색으로 변경하고, 본인이 공격자거나 피해자이면 킬피드의 배경을 흰색으로 변경해주었다. 킬 피드 UI에는 Vertical Box 하나만 있고, 킬 피드 Element를 따로 제작하여 Vertical Box의 자식으로 붙이고 일정시간 뒤에 스스로 사라지도록 하였다.

UE5로 만드는 Team Fortress 2 닷지볼 - 스코어보드 UI 제작

실제 Team Fortress 2의 UI를 참고하여 현재 게임의 점수를 확인할 수 있는 스코어보드 UI를 제작하였다.  실제 Team Fortress 2의 UI에는 더 많은 정보를 포함하고 있지만 간단한 정보만 추려서 스코어보드 UI를 제작하였다. 전체적인 구조는 ScoreBoardWidget을 바탕으로 각 팀의 점수, 로컬 플레이어의 이름, 로컬 플레이어의 킬, 로컬 플레이어의 데스, 관전자 플레어들 목록을 표시하도록 하였고 현재 접속한 플레이어에 따라 플레이어가 Red팀이나 Blue팀이면  ScoreBoardElementWidget을 동적으로 생성하여 ScoreBoardWidget의 VerticalBox의 자식으로 붙히는 방식으로 제작하였다. ScoreBoardElementWi..