월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
nullable 관련 경고가 너무 많이 나옵니다
.NET 6.0 최신으로 올려서 빌드를 했습니다. 경고가 30개 가까이 나오더라구여. 대부분 null 관련 경고인것 같습니다. 이곳에 널이 올수도 있다, 참조하는곳에 잠정적으로 널이 올수도 있다 등등 이런류 경고더라구요. C++과 달리 툭하면 경고를 뱉는거 같은데 내비둬도 괜찮은건가요? 일단 거슬려서 ! (null-forgiving) 연산자로 다 막아뒀는데 이렇게 땜빵을 해도 상관 없을까요? 아니면 좋은 수정 방안이 따로 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 UTF질문이 있습니다
학교 프로젝트 중에 C언어로 게임을 만드는 프로젝트가 있는데개인적으로 그 게임에 서버를 붙여볼까 생각 중입니다. 강의에서는 C#에 C#서버를 붙일 때는 utf 16이 편하다고 하셨는데C언어에서는 char크기가 1바이트이기도 하니까 C언어에 C#서버를 붙일 때는 UTF8로 하는게 더 편할까요? 별 차이가 없을까요? 감사합니다 (_ㅇ_ 즐거운 한가위 보내세요)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
원자성과 interlock연산의 관계에 대해서 질문입니다
<interlock 연산은 원자성을 가진다>는 것이 어떻게 <interlock 연산은 동시에 실행될 수 없다>를 설명해 줄 수 있는 것인지 잘 이해가 되지 않습니다.예를 들어 스레드 1과 스레드 2가 Interlocked.Exchange(ref locked, 1)을 정확히 동시에 실행하면 문제가 발생할텐데, <interlock 연산은 _locked 변수에 +1 하는 연산을 분리될 수 없는 하나의 작업으로 만든다>는 것이 어떻게 이 상황을 막는데 도움을 줄 수 있다는 것인가요?이러한 의문 때문에 interlock연산이 기존 연산을 단일 연산으로 만드는 것이 race condition을 해결하는데 왜 도움이 되는지 이해가 되지 않습니다 두번째 질문은 다음과 같습니다. interlock 연산의 동시 실행을 막는 기작은 lock을 이용한 것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
18분에서 3번째 배리어에 대해 질문 있습니다
배리어가 하는 일은 메모리 read/write 연산의 순서 제어와 배리어 이전의 dirty 데이터들을 dram으로 밀어주는 일 이라고 이해했습니다.그런데 B 쓰레드를 실행할 코어에서는 if 이전에 어떠한 write도 해주지 않았는데 왜 배리어를 넣어 준 것인가요?이 배리어가 어떤 기능을 하는 것인지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이제 이번 강의 보려고 하는데요..
이번 강의가 연동을 위해서 클라이언트를 만드는 것이 맞나요? 저희가 여태 만든 C# 서버는 그대로 사용하고 서버에서 만들었던 여러 파트 중 클라이언트에 필요한걸 가져와서 사용하는 것인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PriorityQueue<JobTimerElem> _pq 우선순위큐 질문드립니다.
우선순위큐 안에 요소를 디버그 모드로 확인해보니 계속 한개의 요소만 있는데 0.25초마다 flushroom이 큐에 들어가고 처리되고 반복이어서 그런건가요?아니면 flushroom action 만 있어서 복잡하지 않아서 그런건지 잘 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
17분 40초경 질문
안녕하세요 강사님! 다름이 아니라 밑에 분 질문중에 똑같은 질문이 있어 그걸 보고 해결하려고 햇는데 해결이 안되어 질문올립니다. https://inflearn.com/questions/79914 제가 참고한 게시물이구요. SetMinThreads와 SetMaxThreads 다 true로 뜨는 걸 확인했는데도 for문에서 i < 4로하면 작동하지 않고 i < 3으로해야 작동이 됩니다... 또 답글로 남겨주신분이 while문을 안써서 그럴 수 있다고 하셨는데 while문도 다 정확히 들어가있는데 작동하지 않아요. 원인을 알 수 있을까요? +) 로그로 스레드 갯수 확인해봤는데 스레드 갯수는 정확히 5개 생성되었는데 하나가 놀고있네요.. 원인이 뭘까요 ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
여기까지
session#3 까지는 어찌어찌 따라온것같은데 #4에서 어질어질 해졌습니다. 그냥 이해는 못하고 따라 치고 있습니다..ㅠ 이럴 때는 그냥 끝까지 듣고 복습하는게 좋을까요? 이금 복습하고(처음부터?) 이해하고 다음 수업을 듣는게 좋을까요?? (_ㅇ_)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
3D서버 만들 때 질문입니다
복학 전에 개인 작업으로 FPS게임서버를 만들고 있습니다. 구현된 것들: - 신규 유저 접속 시 기존 유저 데이터 전송, 기존 유저에게 신규 유저 스폰 전송 - 키보드 입력(Vertical, Horizontal)을 하나의 Vector3에 저장하여 이전 값과 다를 경우 패킷을 전송 ( 데드레커닝이 맞는진 모르겠음) - 카메라 회전 값을 각 클라이언트에서 0.25초 단위로 동기화 패킷 전송 ( 회전값은 서버에서 검증이 필요없을 거라 생각해서 검증 없이 Echo ) 위에 적은 대로 위의 기능은 문제없이 잘 작동하지만 이동 동기화에 대해서 문제가 심각합니다.... 데드레커닝처럼 이전값과 다를 때만 패킷을 보내는데, 상대 클라이언트는 회전값 동기화가 0.25 + (내RTT/2 + 상대RTT/2)이상이라 이동패킷이 더 빠르게 가버리면 위치값에 대한 데이터 일관성이 깨집니다. 그래서 추가로 1초 단위로 현재 위치를 서버에 전송합니다. 서버는 새로운 위치값을 받고 자신이 갖고 있던 해당 플레이어의 위치값 ( 서버 내에서도 이동방향, 회전값, RTT/2, 오차범위를 기준으로 위치값을 0.25초 단위로 업데이트함) 과 비교하여 이 값이 정상적인 데이터인지 검증합니다. 만약 결과가 정상적이라면 Broadcast, 비정상적이라면 Leave로 구현했습니다. 그런데 문제는 서버에서 검증하는 시간 + 내 RTT / 2 + 상대 RTT / 2 차이 때문에 데드레커닝으로 예측하더라도 계속 이전 위치로 돌아가는 현상이 발생했습니다. 데드레커닝을 포기하자니 너무 느린 반응때문에 FPS에 적합하지 않은 것 같고, 서버 검증을 포기하자니 에디터에 Inspector에서 위치 이동만 해도 핵처럼 보였습니다. FPS에서는 검증을 어떻게 하는게 맞을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
쓰레드가 만들어지는 시점이 언제인가요?
디버그 모드로 확인했을 때에는 bool pending = _listenSocket.AcceptAsync(args); 이 코드 이후에 쓰레드가 새로 생기는 것을 확인했는데 AcceptAsync가 쓰레드를 생성하고 생성한 쓰레드를 사용해서 I/O작업을 확인하다가 완료되면 e(args) 매개 변수에 대한 Completed 이벤트가 발생시키는 것 (공식 문서에서 따왔습니다)인가요?? 쓰레드가 만들어지는 시점이 언제인지 왜 만들어졌는지가 궁금해서 질문남깁니다! 그리고 소멸되는 시점도 궁금합니다.. (서버 공부를 시작하는 단계여서 소멸이라는 단어가 맞는지,,,) 디버깅을 해보면 작업자 스레드가 사라지는게 아니라 client.close()에 있다가 움직이는 것 처럼 보이는데 close하면 거기서 스레드가 자고있다가, AcceptAsync에서 Event를 주면 그때 깨어나서 일한다고 생각하면 되는건가요?? 항상 친절하게 답변해주셔서 미리 감사합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
프로그램 진행되는 과정이 맞는지 확인부탁드립니다!!
client에는 socket.Connect(endPoint) coreserver에는 clientSocket = listenSocket.Accept() 이 부분에서 쓰레드들이 서로를 기다리는 것인가요? client의 쓰레드가 혹은 coreserver의 쓰레드가 먼저 도착해도 상대가 자신을 부를 때(?)까지 기다리다가 서로 확인(connect, accept 둘 모두 실행될 때)이 되면 서로 다음으로 넘어가는 것인가요? (디버그했을 때는 가시적으로는 이렇게 보여서 맞는지 확인차 질문올립니다!)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
책으로 같이 더 공부하려고하는데
지금 게임 서버 프로그래밍 교과서라는 책을 구매해서 같이 보려고 합니다 그 이후에 윤성우의 열혈 TCP/IP를 보려고하는데 이 교재에서는 C/C++로 진행이되는데 C#(유니티)과 동작원리는 같아서 병행해서 공부해도 되는지 아니면 동작원리가 달라서 추후에 C#이 익숙해지고 공부하는 것을 추천하는지 선생님의 의견을 듣고 싶습니다 감사합니다! (아! 마지막으로 위 책들을 추천하는지, 루키스님이 추천하는 책은 어떤 것인지 알고 싶습니다)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유저 간 패킷전송의 평등성? 에 대한 질문입니다.
온라인 게임을 하다보면 pc의 성능이 안좋거나 인터넷 환경이 불안정한 경우 렉이 걸려 해당 유저의 캐릭터가 멈추는 경우를 봤습니다. 이는 아마도 서버와 패킷을 전송하는 과정에서 pc성능의 문제로 패킷을 소화하지 못하거나 인터넷이 끊겨 패킷을 제때 전달받지 못해서 발생하는 문제라고 생각합니다. 그렇다면 반대의 경우 pc 성능이나 인터넷 환경이 타유저에 비해 압도적으로 뛰어난 경우는 타 유저에 비해 보다 많은 패킷을 주고 받을 수 있을 거라 생각합니다. 그럴 경우 타인보다 더 많은 이동, 공격을 하는 등 유저 간 벨런스에 문제가 생길 것 같고 그를 방지하기 위해 패킷 전송에 있어 일종의 상한선을 걸어야 하지 않을까 라는 생각을 합니다. 마치 프레임 제한을 거는 것처럼요. 이게 맞다면 제 개인적인 판단으로는 그러한 한 번에 전송할 수 있는 패킷의 양, 전송대기 시간 등을 클라이언트 쪽에서 제한하는 쪽으로 코드를 짜야하는 게 맞다고 생각이 드는데 이런 부분을 클라쪽에서 관리를 해야할까요? 아니면 서버 쪽에서 관리를 해줘야 할까요? -- 번외의 질문입니다. 롤의 경우 렉이 걸리는 유저는 혼자 렉이 걸리고 심할 경우 게임에서 나가지는 식인 반면에 닌텐도의 슈퍼마리오메이커2는 유저대전에서 한 명이 렉이 걸리면 전원이 렉이 걸리는 방식으로 알고 있습니다. 게임을 개발하는 개발자로서 마리오 방식보다는 롤의 방식이 유저에게 좀 더 긍정적인 평가를 받을 수 있을 거라 생각하는데 게임사 측에서 마리오 방식을 택하는 이유가 있을까요? 늘 좋은 강의 감사합니다.^^
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 sendQueue.Enque와 OnSendCompleted에서의 sendQueud.Count
안녕하세요 강의를 통해 저희가 작성한 코드에 따르면 OnSendCompleted에서 RegisterSend에서 OnCompleted함수 간의 미끼를 던지고 낚는 반복적인 관계를 탈출하는 조건은 sendQueue에 더 이상 전송할 내용이 없을 때 입니다. 하지만 Send할 내용이 산더미라 위의 미끼를 던지고 낚는 반복 행위를 탈출할 수 없다면 멀티 쓰레드 환경일 경우 하나의 쓰레드만 계속 해당 session의 send를 점유하고 있어 정상 작동을 못할 것 같은대요 이러한 상황이 강의 말미에 말씀해주신 비정상적인 상황을 탐지하여 disconnect하는 경우일까요? 일반적인 상황이어도 유저가 많거나 하는 경우? 위의 사이클을 탈출하지 못할 것 같은데 일반적 상황이라면 이러한 문제가 발생하지 않는지 궁금합니다. 감사합니다
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
에러질문
- 19분 디버그시 에러 질문 'One or more errors occurred. (ValueFactory attempted to access the Value property of this instance.) (ValueFactory attempted to access the Value property of this instance.) (ValueFactory attempted to access the Value property of this instance.)' ValueFactory가 인스턴스 Value속성에 접근하는 에러가 떳습니다.WhoAMI 함수를 6번호출했고 콘솔창에는 My Name is 6(repeat)My Name is 5(repeat)뜨고 에러코드가 나옵니다따로 repeat가 없는게 찍히지는 않습니다.단 브레이크포인트를 찍었을시 강의의 17라인에서멈추긴합니다.혹시 버전문제인건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 24분 경 재귀적 WriteLock을 허용하는 경우 WriteUnlock시 질문
안녕하세요 재귀적으로 WriteLock을 허용하는 상황에서 WriteUnlock을 진행하는 경우(혹은 재귀적이지 않은 상황에서도) Interlocked.Exchange를 사용하여 _flag를 EMPTY_FLAG로 초기화합니다. 선생님의 다른 질의응답을 보면 크기가 큰 구조체 형태여도 원자적으로 계산하기 위해 'Interlocked.Exchange'함수를 사용했다고 하셨는대요 애초에 WriteLock이 걸려있으니 멀티쓰레드 환경이라고 할찌라도 하나의 쓰레드만 WriteUnlock을 진행할텐대 원자적으로 계산하는 이유가 있을까요? 자세히는 모르지만 원자적으로 계산하기 위해 성능을 더 사용할 것 같은데 성능의 차이가 없거나 혹은 미미할지라도 단순 대입을 통한 _flag 초기화가 아닌 Interlocked.Exchange를 사용하는 이유가 궁금합니다. 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
루키스님 안녕하세요! 게임 개발을 목표로 하는 수강생입니다!
스팀에 게임 출시를 목표로 유니티 공부를 하고 있습니다! 온라인 게임보다는 (볼륨이 상대적으로 적은)싱글 게임을 만들 생각입니다! 강의 구성으로만 봐서는 1 ~ 3파트만 봐도 될 것 같은데 4파트부터는 따로 챙겨볼 강의는 없나요? 아무래도 개발이 처음이다보니, 선택과 집중을 할 예정이라 집중적으로 투자할 강의만 보고 싶습니다! 물론 이번 게임을 출시하고 나머지 부분도 다 정독하여(이미 전부 결제했습니다!) 마스터할 예정입니다^^ 늘 제 질문에 답변을 잘해주셔서 감사합니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Func<Session> sessionFactory 사용에대해서 궁금합니다
Func가 리턴값이 하나인 함수를 캡슐화한다고 공식문서에서 찾아봤는데요 함수를 캡슐화한다는게 함수에서 매개변수로써 사용한다고 생각하면 될까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Encoding.Unicode.GetBytes를 사용했을 시의 안정성
string의 내용을 복사하는 방식이 Span이나 ArraySegment를 통한 TryWriteByte방식이 아닌 segment.Array를 불러와 직접 복사해넣는 방식인데 강의를 듣던 도중 생각난 가정을 물어보고싶습니다. Open의 reserveSize를 작게 설정하고 진행했을 때 만약 해당 string(여기서는 name)이 너무 길면실제 버퍼의 영역을 벗어나서 예외처리되거나Open한 크기 이상으로 Close를 시도하게 될텐데 일부러 예외처리가 발생하도록 냅두고 로그를 살펴보기 위함인가요? 아니면 reserveSize가 그렇게 작게 설정되는 상황 자체가 문제가 되는 건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
궁금한 것이 있어 문의드려요.
강의보다가 문득 처음에만 서버를 통하고 그 다음부턴 클라이언트가 서버가 되어 접속을 하게 하고 싶은데요. 어떤걸 참고하면 좋을지 몰라서요. stun turn서버를 봐야 하는건지 holepunching도 아닌거 같고 실제로 업무에서 어떻게 하는지 궁금해서요 2:2 게임을 만들고 싶은데 서버를 통하면 서버 유지비가 너무 많이 나갈 것 같아서 문의드려봅니다. 뭘 참고 해야될지 알려주세요.