UI_Joystick 컴포넌트를 학습하는 도중에 궁금사항이 생겨 질문 드립니다. 강의 중에 처음에 RawImage가 달리지 않은 오브젝트를 이용할때는 클릭했을때 조이스틱의 위치가 변경되는 범위가 조이스틱 오브젝트가 있는 부분에서만 되었다가 RawImage가 추후 부착된 프리펩을 이용했을때는 RawImage의 범위에 속하는곳에 어느곳에 터치를 해도 조이스틱 위치가 이동이 되었는데. 유니티를 아직 잘 다루지 못해서 추측해서 이해를 했는데 맞는지 한번 확인 부탁 드리겠습니다. public class UI_Joystick : UI_Base { enum GameObjects { JoystickBG, JoystickCursor, } private GameObject _background; private GameObject _cursor; private float _radius; private Vector2 _touchPos; public override bool Init() { ... gameObject.BindEvent(OnPointerDown, type: Define.EUIEvent.PointerDown); gameObject.BindEvent(OnPointerUp, type: Define.EUIEvent.PointerUp); gameObject.BindEvent(OnDrag, type: Define.EUIEvent.Drag); return true; } 해당 스크립트에서 BindEvent로 연결해준 부분이 GetObject로 달아준 하위 오브젝트가 아니라 컴포넌트가 달린 UI_Joystick 캔버스 자체에 이벤트를 달아주어서 캔버스 자체에는 Raycast Target이 없기 클릭을 해도 이벤트 인식이 안되서 Raycast Target이 활성화된 하위 오브젝트를 눌렀을때 이벤트가 발생이 되어서 처음에는 조이스틱 부에서만 작동이 됬던것이 맞는가요? 그게 맞다면 오브젝트 자체에 이벤트를 달아주게 되면, 그리고 그 오브젝트에 이벤트를 인식하는 Raycast Target가 비활성화 되어있거나 관련된 컴포넌트가 없다면, 그 이벤트가 달린 오브젝트의 모든 하위 오브젝트에 Raycast Target 상태를 확인해서 활성화 되어 있다면 하위 오브젝트에 모두 이벤트가 동작되게 되는것 인가요?
프레임워크 코드를 보면서 공부중에 람다식에 대해 궁금증이 생겨서 질문을 남깁니다.. 프레임워크상으로 람다식으로 액션을 할당하고 있는데, 람다식에 대해 공부를 해봐도 잘 이해가 가지 않아서..위에 매개변수로 넣는 evt는 람다식으로 작성한 Debug.Log("ChangeScene"); Managers.Scene.LoadScene(EScene.GameScene); 의 내용이 들어감 액션 함수의 이름이라고 볼수있는걸까요? 인터넷에 있는 람다식에 대한 영상이나 자료들을 아무리봐도 강사님의 프레임워크처럼 효율적으로 직접 사용하는 부분에 대해서는 내용을 찾을 수가 없어서 공부하는데 힘이드네요..람다식에 대해 설명을 부탁드리겠습니다..혹시 내용이 많아 힘드시다면 공부하기위한 자료가 있을까요?
5월 서버 강좌를 듣기전에 미리 예습을 하고자하는데, 강사님 강의중에 Part4 : 게임 서버 (네트워크, 멀티쓰레드, OS) Part5 : 데이터베이스(SQL Server) Part6 : 웹서버 (ASP.NET Core Blazor, WebApi) 현재 강의 Part7 : MMORPG 컨텐츠 구현 (Unity + C# 서버 연동) 부분을 미리 공부해야할까요?? 해당 파트 내용들이 지금 강의에서 중심적으로 다루어지는지 알고 싶습니다.
강의를 수강하던중 Select 모델과 (Non)blocking의 차이점에 궁금증이 생겨 질문을 남기게 되었습니다. Select를 사용하기전 Blocking, Non-blocking 방식에서도 해당 소켓의 정상/비정상 상태를 확인하여 패킷을 전송하는 것으로 이해하였습니다. 그중 Non-blocking은 명칭적으로는 정상/비정상에 큰 신경을 쓰지 않지만 소켓의 상태가 정상/비정상인지 확인하는 과정을 거치기에 자원 손실이 일어나는 것으로 이해됐습니다. 이런 단점을 해결하기 위해 Select 모델을 이용해 send, write에 소켓을 저장해 해당 소켓이 정상인지, send, recv 중 어떤 소켓을 진행해야 할지, 준비되었는지 판단하는 과정이 Blocking과 Non-blocking에서의 상태 파악 과정과 비슷하다는 생각이 들어 Select 모델을 사용하는게 별 다른 이점이 없지 않나? 라는 생각이 들어 질문을 남기게 되었습니다.
bool SocketUtils::SetTcpNoDelay(SOCKET socket, bool flag) { return SetSockOpt(socket, IPPROTO_TCP, TCP_NODELAY, flag); } 로 코드를 고쳐주어야 할 것 같습니다. (SOL_SOCKET -> IPPROTO_TCP SOL_SOCKET, TCP_NODELAY로 인자를 넣어주면 SO_DEBUG 옵션을 대신 설정해주게 됩니다. 현재 기준으로 마지막 코드까지 오타가 수정되어 있지 않으니 혹시 실제로 서버를 사용하실 분들은 해당 코드를 수정하여 사용하시는걸 권장드립니다.
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
안녕하세요. 간단히나마 실제 멀티게임 구현을 목표로 이전 강의(Part7)들 듣고 있습니다. 아직 Part7을 듣고 있어서 그런데 해당 강의 Part9를 들으면 실제 서버 전용 PC를 두고 여러개의 클라PC가 각 .exe파일을 실행하는 환경을 구축하는 내용이 포함되어 있을까요? 만약 그렇지 않다면, 다른 강의에서는 혹시 위 내용이 포함된 강의가 있을까요? 루키스님은 물론이고, 다른 수강자 선배님들, 인프런 AI 인턴 답변 모두모두 환영합니다. 답변 미리 감사합니다.
안녕하세요 5월부터 시작하는 수업에서 BM (광고, 결제) 시스템과 서버 기본기 구현을 배우게 되는것으로 알고있는데요! 이과정에서 c#과 AWS를 사용하여 직접 서버를 구축하는 방법을 배우는것인지 아니면 파이어베이스나 뒤끝같은 관리형 서비스를 사용하는 방법을 배우는건지 궁금합니다 !
제가 이해한것이 맞는지 확인하고 싶어 질문을 남기게 되었습니다. Event는 Signal, Non-Signal 상태를 WaitForSingleObject(handle, INFINITE)를 통해 대기합니다. 여기서 INFINITE로 무한정 대기를 통해 불필요한 컨텍스트 스위치가 일어나지 않게 됩니다. 하지만 그만큼 자원(메모리? CPU? )의 손해가 일어나기에 생겨난 것이 Conditional Variable입니다. Conditional Variable cv.notify_one();를 통해 대기하고 있던 Thread를 실행합니다. Conditional Variable는 메모리에 Thread를 Wait 시키지 않고 대기 시키다가 cv.notify_one();를 통해 실행하는 것이고 Event는 Thread를 메모리에 WaitForSingleObject(handle, INFINITE)를 통해 대기시켰다가 SetEvent(handle);를 통해 실행시킨 점이 차이라고 이해하면 될지 여쭙고 싶습니다.
안녕하세요 지난 강의 '패킷직렬화 #1' 부터 현재강의에서 buffsOffset을 사용하는데 이 변수가 존재해야 하는 이유를 모르겠습니다. sizeof(PKT_S_TEST)를 이용하면 되는게 아닌지 자꾸 의문이 들어서요. sizeof(PKT_S_TEST)를 이용해서는 안되는 경우가 있어서 buffsOffset을 사용하는 걸까요?
ObjectPool.h에서 게임서버쪽에서 MakeShared 를 사용할때도 메모리 풀이 적용되게해주는 함수인데 여기서 Push는 왜 괄호를 안쓴걸까요 ?? static shared_ptr<Type> MakeShared() { shared_ptr<Type> ptr = { Pop(), Push}; return ptr; } GameServer.cpp에서 이미 아래와 같이 인자를 전달해서 그런걸까요..?? 왜 이렇게 되는지 궁금합니다.. ObjectPool<Knight>::Push(knights[i]);
uniquelock은 lock_guard와 달리 std::unique_lock<std::mutex> uniqueLock(m, std::defer_lock); 를 통해 명시해놓고 자신이 원하는 순간에 uniqueLock.lock 을 할 수 있다고 이해하였습니다. 일반적인 Lock과의 차이점은 자신이 원하는 순간에 lock을 거는 것은 똑같지만 lock_guard와 같이 unlock과 같이 명시를 해주지 않더라도 일정 부분이 끝나게 되면 자동으로 unlock이 되는 것이라고 이해해도 괜찮을까요?
안녕하세요.. UIManager 의 SetCanvas 에서 public void SetCanvas(GameObject go, bool sort = true, int sortOrder = 0) { Canvas canvas = Util.GetOrAddComponent<Canvas>(go); if (canvas == null) { canvas.renderMode = RenderMode.ScreenSpaceOverlay; canvas.overrideSorting = true; } "if (canvas == null)" 부분이 "canvas != null" 이 되어야 될 것 같은데 설명 부탁드립니다.
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
안녕하세요 루키스님 덕분에 서버개발자로 취업하였습니다. 루키스님의 강의를 체화하기 위해서 간간히 코드를 보면서 잊어먹을랑 말랑한 것들을 다시 강의로 듣곤 합니다 그러다가 아래 코드를 보면서 문득 의문이 들었는데요. while(true) { GameLogicTask.Instance.Update() } 게임 실행 시 위 로직을 타면서 메인쓰레드 하나서 모든 Room의 Update를 담당하고 있는데 Room에 유저수가 많아지게 되면 메인 쓰레드에 점점 부하가 더 많아지는게 아닌가해서 질문을 드립니다. 메인쓰레드 부하가 많아지면 컨텍스트 스위칭이 생겨도 Room마다 Thread를 생성하여 남은 자원을 Update가 바쁘게 돌아가는 Room쪽에 쓰레드를 조금 더 할당해 주어도 될까요? (밑에 질문에 답변해 주셨네요 ^^; Room마다 쓰레드를 더 만들겠습니다.) 심리스 월드에서 Actor마다 JobSerializer를 할당하는 방법을 쓰면, 쓰레드를 너무 많이 만들게 될것 같은데 컨텍스트 스위칭 외에 또 생기는 성능적인 사이드 이펙트를 뭘 또 고려하면 좋을까요? Actor마다 JobSerializer를 쓴다고 하면 Actor단일로서는 lock을 걸지 않아도 되지만 서로 상호작용이 일어나는 상황에서는 어쩔수 없이 lock을 걸어줄수 밖에 없을 것 같은데, 그러면 결국은 JobSerializer를 쓰지 않아도 되지 않나 부족한 지식으로 어렴풋이 생각이 듭니다. 또한 JobSerializer를 Flush 하기 위해선 Actor마다 while(true) 루프를 돌면서 계속해서 잤다가 깼다가 확인 하는 과정과 컨텍스트 스위칭비용이 점점 더 늘어날 것 같은데 이런 비용을 감안하면서 사용하는 것인지요. 아니면 딱히 신경쓰지 않아도 될만한 부하인지 궁금합니다.
send를 사용할 때 블로킹 모드는 모든 데이터를 다 보내고 논블로킹은 일부만 보낼 수가 있다고 하셨는데 이 보낸다는 게 send를 사용한 사용자 커널에 있는 송신 버퍼에 보낸다는 건가요? 아니면 받는 사용자 커널에 있는 수신 버퍼에 보낸다는 건가요? 그리고 논블로킹 모드에서 데이터를 일부만 보낼 수가 있으면 UDP에서는 데이터 경계의 대한 개념이 있으니까 논블로킹을 사용할 수 없는 건가요?