월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptAsync 이후 pending 관련
void RegisterAccept(SocketAsyncEventArgs args) { args.AcceptSocket = null; bool pending = _listenSocket.AcceptAsync(args); if (!pending) { OnACceptCompleted(null, args); } } 위 Function에서 보면 pending == false 인경우 OnACceptCompleted 함수를 바로 실행시키는데요 init 함수에서 SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.Completed += new EventHandler<SocketAsyncEventArgs>(OnACceptCompleted); RegisterAccept(args); 위와같이 args.Completed에 OnACceptCompleted를 등록해 주었기 때문에 펜딩이 안되어 바로 Accept가 된 상황에서도 등록한 이벤트로 인해 OnACceptCompleted 가 실행되는것 아닌가요? if (pending == false) { OnACceptCompleted(null, args); } 이 코드는 불필요 한게 아닌가 궁금합니다. 실제로 로그를 찍어보면 서버가 AcceptAsync를 하는 시점과 클라이언트가 접속하는 시간 차이가 있어서 pending이 항상 true로찍혔고 그래서 pending이 false일때에 대한 상황은 재현하지 못했습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
jobQueue 질문 드립니다.
jobQueue 를 두는 이유가 기존에 thread 가 많아서 context-switching 비용이 더 비싸기 때문인가요? thread 숫자가 줄어서 결국 context-switching 비용을 아끼고 그만큼 성능이 빨라지게 되는 건지요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
11:41초 질문
이부분에서 Slice의 용도가 BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), nameLen); 를 하게 되면 s에다가 s의 offset은 count이고, s.Length - count만큼 자른부분에서 nameLen을 넣겠다! 이고 이게 성공을 하면 true 실패를 하면 false로 내뱉어 주는 것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SessionManager Find 질문 입니다.
find 시 lock 을 잡아야 하나요? write 아니고 read 라면 안잡아도 되지 않나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의와 상관없는 질문
FMOD failed to initialize. This may be because your sound card is configured to give applications exclusive access, thus preventing Unity from using this device. You can change this in Control Panel > Audio Devices and Sound Themes > Playback Device > Properties > Options ... : "Soundcard does not support the minimum features needed for this soundsystem (16bit stereo output). " (59) 안녕하세요. 강의와 상관없는 질문이긴 하지만 검색해도 안나오길래 질문해봅니다. 스피커를 바꾸고 바로 유니티엔진을 켰는데 위 에러가 뜹니다. 구글검색해도 안나오고 뭐 어찌해야할지 모르겠습니다.. 혹시 해결책을 아시는지 궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
9분 OnRecv질문입니다.
Session에서 OnRecv부분 while문 안에서 "패킷이 완전체로 왔는지"에대한 부분 질문입니다. 현재 OnRecv애서 buff를 받고 첫번째 if 문에서 buff.Count < HeaderSize보다 작으면 break;이기때문에 buff.Count는 첫번째 if문을 통과를 했다면 2byte이상인 상태이고 두번째 if문은 이부분인데 Bitcinverter.ToUInt16이 첫인자로 받은 바이트 배열을 buffer.Offset부터 시작해서 ushort형으로 뽑아서 준다는 것 까지는 이해했습니다. 그런데 더미나 서버에서 패킷을 처리하기 위해서 OnRecv를 받을때 OnRecv에 받은 buff가 4바이트일 수도있고 3바이트 일 수도 있고 2바이트 일 수도 있는데 Bitcinverter.ToUInt16(buff.Array, buff.Offset)을 dataSize에 넣는다고 이게 왜 완전체인 패킷을 받는 다는 것인지 이해가 가지 않습니다. < 가장 햇갈리는 부분 > OnRecv에는 인자로 buffer를 받았는데 결국, dataSize가 BitConverter를 통해서 받아온 buffer의 offset부터 buffer.Array(buffer의 크기)를 뽑아온 값(맞나요..?) 즉, BitCinverter.ToUInt16(buffer.Array, buufer.Offset)을 통해 뽑아온 dataSize는 (값은) 결국, OnRecv에 인자로 받은buffer의 크기 ( == buffer.Count)와 같은거라 if (buffer.Count < dataSize)일때 break;가 아니라 if (buffer.Count != dataSize) 일 경우 break;를 하는게 맞는 부분 아닌가요?? (인자로 받은 buffer.Count랑 buffer.Length가 같은말이고 BitConverter.ToUInt16(buffer.Array, buffer.Offset)이 다 같은 말이라)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
15분 질문입니다.
지금 초기화부분 (init에서) 먼저 등록을 해주고 pending이 false이면 OnAcceptCompleted를 호출을 할 것이고 pending이 true라면 이부분에서 자동적으로 OnAcceptCompleted를 호출한다고 하셨는데 args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); 이부분이 args의 Compledted함수에서 응답(액션같은게 오면) OnAcceptCompleted 함수를 부르겠다(콜백하겠다) 의미까는 이해가 갔습니다. 그런데 궁금한것이 pending이 true일 경우 자동적으로 OnAcceptCompleted 호출한다는 말씀이 무었인지 잘 이해가 안갑니다. 1) 번질문 SocketAsyncEventArgs args = new SocketAsyncEventArgs();를 init에 만들어 주고, RegisterAccept에서 _listenSocket.AcceptAsync(args); 하게 되면, false인지 true인지를 pending에다가 뱉어주는데 true일 경우에 args.Completed함수에 EventHander라는 액션이 가게 되어 callback으로 등록해둔 함수가 호출이 되는 것인가요? 2)번질문 만약, 1)번에서 질문 한 내용이 맞다면 args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); 한 이유는 AcceptAsync(args);했을 때 true가 나오면 Completed함수가 자동으로 호출이 된다는 말씀이신가요? 3) 번질문 제가 1), 2)번 질문의도나 이해 방향이 틀렷다면 그냥 간단하게 생각해서 bool pending = _listenSocket.AcceptAsync(args);를 해주는 순간 pending이 false이면 if (pending == false) OnAcceptCompleted(null, args); 이대로 가는 것이고 pending이 true일 경우 AcceptAsync에 인자로 넣은 args에 EventHandler? 가 true라고 args의 Complete함수에 알려주는 것인가요? 4)번질문 제가 Completed에 뭔가 액션이 오면 콜백으로 OnAcceptComplete를 호출하는 것은 이해를 했는데, pending이 true일 경우 args.Completed함수에 액션이 어떻게 Completed 가게되어지는지를 조금 이해가 안되는데 이부분은 제가 콜백을 이해를 못한것인가요? 아니면 args가 어떻게 동작하는지 아직 이해를 못해서 그런것인가요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
17분 질문
ThreadPool.SetMinThreads(1, 1); ThreadPool.SetMaxThreads(3, 3); Parallel.Invoke(WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI, WhoAmI); 이런식으로 Min, Max를 설정해주었기 때문에 Parallel.Invoke 가 threadPool에서 아무 쓰레드나 뽑오와서 일을 시키는데 그 과정에서 1번쓰레드가 일을 끝내고 다시 threadPool에 있는 상태에서 다시 parallel가 1번 쓰레드에게 다시 일감을 던져주게 되어 같은 ManagedThreadId 가 cmd창에 찍혀서 나오게 되는 것인가요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
8분 Bit Flag질문
0. Thread.CurrentThread.ManagedThreadId 가 1씩 늘어나는 그런 숫자라고 해주셨는데 이게 무슨말인지 모르겠습니다. 1. 쉬프트 연산자를 사용을 할때, Thread.CurrentThread.ManagedThreadId << 3 을 하게되면 이런 의미인것인가요 아니면 3번째 칸만 켜주는 이런 의미가 되는 것인가요? 2. 만약 Thread.CurrentThread.ManagedThreadId << 3 라는 의미가 첫번째 질문의 원리와 같다면 이런상태라 가정하였을때 다시 Thread.CurrentThread.ManagedThreadId << 3를 하게되면 이런식으로 바뀌는 것인가요?? 3. 현재 if (_flag == EMPTY_FLAG)일 경우 WriteThreadID은 15비트를 켜진상태 ( 1인 상태를) 가져오고 싶은것이 맞다면 Thread.CurrentThread.ManagedThreadId << 16 이렇게 밀어버리게 되면 이렇게 되는것이 맞나요? 3-1. 이렇게 되는 것이 맞다면 (Thread.CurrentThread.ManagedThreadId << 16 뒤에 & WRITE_MAKS; 이녀석은 Thread.CurrentThread.ManagedThreadId << 16 && Thread.CurrentThread.ManagedThreadId << WRITE_MASK 라는 뜻인가요?? 3-2 Thread.CurrentThread.ManagedThreadId << 16 && Thread.CurrentThread.ManagedThreadId << WRITE_MASK 라는 뜻이 맞다면 Thread.CurrentThread.ManagedThreadId << 16 로 이렇게 한번 밀어주고 Thread.CurrentThread.ManagedThreadId << WRITE_MASK로 이렇게 밀어주게되면 Unused(1)이 나오게 되는것 아닌가요..?? 4. 비트 마스크 ex) 1 << 5를 하면 1 << 10을 하게되면 이런 기초적인 것은 이해를 했는데 위에 질문드린 부분들이 이해가 안갑니다 ㅠ 제가 완전히 잘 이해를 이상하게 하고 있는거 같습니다..ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
3:00분 질문, 11:20초 질문
1. SpinLock이 구현이되어있는것을 사용하시면 된다고 하셨는데 bool _lockTaken = false; _lock.Enter(ref _lockTaken); 을 해주게되면 _lockTaken 이 false일 경우에는 ( == 아무도 자물쇠를 안잠군 상태이다) Enter가 true를 _lockTaken 이 true일 경우에는 ( == 누군가 자물쇠를 잠구었다) Enter가 false를 반환하는 것인가요? 2. 왜 Reward 클래스를 찾는 함수안에서 보상 아이템을 추가한다고 해서 lock 키워드를 저기서 사용을 하는지 잘 이해가 가지않습니다...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서로 다른 pc에서 통신이 안되네요
안녕하세요! 하나의 pc에서는 잘 통신이 되는걸 확인했는데요. 위 제목대로 서로 다른 pc에서는 통신이 되질 않네요. 서버 pc cmd의 ipconfig 창에 나온 IPv4 주소, 기본 게이트웨이를 다 입력해봤는데도 안됩니다. 서로 다른 pc를 통신하려면 어떻게 접근해야할까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버에서 반응이 없습니다
사진처럼 서버코어 쪽에서 아무런 반응이 없습니다. 아무리봐도 잘못된 곳이 없어 보이는데 저런 경우 코드 어디를 살펴봐야 할까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님 질문이 있습니다
현재 이강의를 보려는 목적이 인디게임개발쪽으로 쓸려고 하는데요, 제가 직접코드를 짜서 서버를 구성해보는게 좋나요 아님 강사님코드를 이용해서 제 게임에 적용하는게 좋을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님 커리큘럼 질문입니다.
현재 C# Part1~3까지 듣고 게임서버를 들으면서 1:1 로 대결을 할 수 있게 게임을 공부겸으로 C# && 유니티로 만들고 있습니다. 그런데 혼자 공부하다 보니 제가 어디로 가고있는지 방향은 어느정도 맞는지 잘 몰라서 찾아보다가 강사님 강의중에 "게임프로그래머 취업전략 가이드"라는 강의를 듣고있는데 저는 취업이 목적인데(물론 최종 목표는 정말 재밌는 RPG 게임을 만드는 것이 목표입니다 누구에게나 재밌다고 인정 받을 만한 게임이용..ㅎㅎ;) 현재 C#으로 게임을 만들고있습니다. 저는 강사님 말대로 "클라" "서버" 둘다 공부하는것이 좋다고 생각하고 저한테도 도움이 될거 같아서 둘 다 공부를 목적으로 하고있습니다.(22학년도 부터 대학교 3학년입니다) 그래서 강사님 강의가 저한테는 잘맞아서 언리얼로 빨리 실력을 쌓고 싶어서 생각한 저만의 커리가 1. part4까지만 듣고 "c++ 훑어보기" , "언리얼 엔진4 입문" -> "c++과 언리얼로 만드는 MMORPG" 시리즈 듣기 + 현재 만들고 있던 게임은 만들기 2. 현재 강의 시리즈(C#) part4 게임서버 마저듣고 part5~7? 까지 다듣고 "c++ 훑어보기" , "언리얼 엔진4 입문" -> "c++과 언리얼로 만드는 MMORPG" 시리즈를 듣는것 둘중에 어떤 커리가 클라+서버를 공부하는데 효율적일까요..?? (저는 물론 취업을 할 때 클라쪽으로 먼저 가고싶고 클라쪽에 조금더 관심이 많습니다) 둘다 강의 커리가 조금 이상하시다면 다른 추천? 할만한 커리가 있을까요??(강사님 강의중에) 조언을 조금 받을 수 있다면 정말 정말 감사하겠습니다 :)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 궁금한 점이 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 클라에서 서버로 액션 요청 하고 로직 처리 후 클라로 응답 받는 시간이 어느정도되어야지, 지연 없이 받았다고 생각하면 될까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
flush에 대한 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 flush 쪽에서 의문이 생겨서 이렇게 글 남겨봅니다..! 강의에서는 Push 안에 bool flush = false를 이용하는데 따로 flush를 더 사용안하고 위 이미지처럼 그냥 _flush 만 이용하면 안되는 이유가 따로 있을까요..? 강의에서는 lock때문에 접근을 못해서 단계적으로 하기 위함이라고 하셨는데 이해가 잘 안갑니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
해당 강의와는 관련없는 부분이지만 개인적으로 궁금해서 여쭤봅니다.
유니티의 Webgl은 Websocket으로 통신을 해야한다고 하던데요. 지금 배우고 있는 Socket 클래스 방식으로 웹소켓 통신 연결을 구현하여 소켓에서 웹소켓 통신 인것으로만 바뀌고 Socket 클래스를 사용하여 지금 배우는 방식대로 통신이 가능한가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
마지막 20:00 ref 질문
지금 좀 이해가 되는 부분은 멀티 쓰레드 이기때문에 prev에서 값을 가져올려고 하는 순간 1. 다른 쓰레드가 number의 값을 변경 할 수도 있기 때문에 말이 안된다 == 다른 쓰레드가 number의 값에 접근을해서 number의 값이 바뀐 상태일 수도 있기 때문에 유효한지 안한지 모르기때문에 number를 막바로 추출하는것은 말이안된다. 맞나용...?? 2. ref레퍼런스로 참조를 해서 Increment인자에 넣어서 원자 성이 보장되는 것이 아니라 InterLocked계열의 함수를 사용했기때문에, Increment안에 레퍼런스 number를 넣어 주었을때 원자성이 보장되어 값이 "확정" 되는 것인가요? 3. InterLocked 계열에서 ref를 쓰면 가시성 보장 + 순서를 보장해주고 InterLocked 계열의 함수가_number의 진짜 값(진짜 주소)에 접근을 하는 것을 막아 주어서 다른 쓰레드가 접근을 못하는 것인가요? (말그대로 Increment 인자에 들어온 변수의 주소를 지금 내가 Locked 했다는 의미 인가요??)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SendForEach에 대한 질문 사항
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 강의 내용 중에 궁금한 점이 있어서, 문의드립니다. 1. SendForEach 호출시에 모든세션에 send를 진행하게되는데 이 send를 호출한 순서대로 처리하지 않는 부분이 궁금한데요, 서버에 각 세션 마다 비동기로 recv진행하게되는데 공용 쓰레드 풀에서 쓰레드 개입해서 알려주기 때문에, 거의 동시에 왔을 경우 순서에 대한 보장이 없는건가요?? Sleep(1)을 이용해서 약간에 딜레이만 줘도 순서대로 전송되는걸 확인했습니다. 2. 1번가 비슷한 내용이긴한데요 SendForEach에서 Send 후에 서버에서 브로드캐스팅을 통해 연결되있는 모든 서버로 전송하게 되는데 I am {playerID} 부분을 클라에서 찍어보면 0 0 0 1 1 1 요런식으로 안나오고 막 섞여서 나오고 있는데, 이 부분에 대한 이유가 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
xml death.. 질문이 있습니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 밑에 선생님과 중복되는 질문입니다. 이 부분에서 이 부분은 참조를 안할 것 같아서 테스트를 해봤는데 int depth = r.Depth + 1; 이 조건에 걸려서 반복문을 빠져나오게 됩니다.. 혹시 재가 빠트린 게 있을까요..? //항상 감사하게 듣고 있습니다 !