월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
17:13 부분 질문드립니다
i<5이기때문에 아무것도 출력되지 못하는게 맞는데 저는 헬로 스레드가 다섯번 나와버립니다..! 무슨 문제일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Clean함수의 else부분 질문 있습니다
_readPos = 0;_writePos = DataSize; 이렇게 하셨는데 순서가 반대 아닌가요??readPos가 2이고 writePos가 5였을 때 DataSize는 3그런데 readPos를 먼저 0으로 하면 DataSize는 5로 변해writePos는 3이 아닌 5로 초기화가 될것 같습니다else부분은 남은 데이터가 있는 경우 readPos만큼 Array의 처음 주소를 앞 당기는거니까 초기화된 writePos의 기대값으론 기존 writePos - readPos 아닌가요??readPos = 0;이 부분이 먼저 나온 이유가 궁급합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener Init 함수를 여러번 호출 시킨 뒤 세션을 만들면 예기치 않은 동작을 할 수 있지 않나요??
Init 함수안에는 sessionFactory += sessionFactory;가 있는데Init을 여러번 호출 시키면 세션을 만드는 함수들이 _sessionFactory에 들어가서 Invoke 했을 때 여러개의 세션들이 만들어지는 예기치 않은 동작을 하지 않을까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterRecv를 if 문에 넣는 이유
OnRecvCompleted함수에서 Listener와 다르게 Register 함수를 if문에 넣는 이유는 exception에 걸렸을 때를 생각해서 일부러 if문 안에 넣으신건가요??
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReadLock 질문 드립니다!
ReadLock은 어떤 쓰레드도 write를 하고 있지 않을 때 ReadCount를 1 늘리는데 왜 while문 안에는 해당 조건문이 없는건가요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
콘솔프로그램으로 만든 서버 배포질문
보통 이렇게 콘솔프로그램으로 만든 서버는 어떻게 배포를 해야하나요? bin/Debug의 exe로 서버컴퓨터에서 실행시키지는 않을 것 같은데.... 따로 Setup파일을 만들어서 서버에 배포를 하는 건가요? 따로 Setup파일을 만든다면 어떤 방식으로 하는지도 궁굼합니다.!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
receiveBuffer 부분 질문있습니다.
ReceiveBuffer 강의 듣는중 의문이 있어 문의드려요. TCP로 통신을할 경우 커널단에서 패킷 전체가 전송이 완료된후 OnReceive가 일어나는것으로 이해하고 있었는데해당강의 에서는 어플리케이션단에서 전체 패킷이 다 들어왔는지 확인 후 처리를 하는 로직이 들어가는거 같아 혼돈이 오는것 같습니다. 제가 이해한게 잘 못 되었을까요?TCP 단에서 전체 패킷이 다 도착한 후 OnReceive가 일어나는게 맞다면 어플리케이션단에서 다시 한번 확인 후 처리하는 이유가 있을까요? PacketSession에서 마지막에 client에서 데이터를 쓰기위해 sendBuffer에서 사용할 영역을 예약하는 open에 문의 사항이 있습니다.1) 강의대로 따라 하게되면 client에서 open(4096)을 하면 불필요하게 필요이상으로 버퍼를예약해서 실제 사용하지도 않지만 많이 예약하게되 _usedSize보다크게 되면서 계속해서 버퍼를 새로 만드는것으로 보이는데 실제 프로젝트에서는 필요한 사이즈만큼만 예약하게 되나요? 2) snedBuffer.Close() 에서 usedSize가 강의 에서는_usedSize = usedSize로 되어있는데 이러면 계속 같은 버퍼 공간에 덮어 씌어질거같은데_usedSize += usedSize로 되야 할거 같은데 이부분은 제가 잘못 이해 한건지 아니면 오타일까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리가 줄줄 새고 있습니다
안녕하세요 메모리 릭과 관련해서 질문 드립니다비주얼 스튜디오에서 프로그램 실행시키면 진단 도구 창이 뜨고 그 안에 현재 프로세스가 얼마나 메모리 잡아 먹는지 보여주는데 콘솔에 로그 찍으면 메모리 계속 잡아먹으니까 서버와 클라 모두 콘솔에 아무것도 로그를 찍지 않게 빈 상태로 두었는데도 약 30초마다 3~5MB 씩 오릅니다 그래서 강의 자료에 있는 모든 코드를 복붙해서 어떤 로그도 안찍게 살짝 수정 후 실행했더니 결과는 동일하게 조금씩 오르더라구요 이 상태에서 서버는 계속 작동시키고 클라를 끄니까 메모리 릭 현상이 멈추긴 했습니다만이 현상이 선생님 환경에서도 일어나는지 궁금하네요..기본 서버 강의라서 아직 최적화가 덜 돼서 그런건지요..?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷 클래스 관련 질문입니다.
안녕하세요, Generator로 만든 클래스들(packetHander.cs나 GenPackets.cs, ~~Packetmanager.cs)을 보면 namespace가 없는데요, namespace가 없어도 다른 클래스에서 선언 및 사용이 가능한데요,혹시 namespace 없이 클래스를 선언해 사용하는 것과 namespace를 정의하고 클래스를 선언해 사용하는 것이 어떤 차이가 있는지 알 수 있을까요??그리고 namespace는 책꽂이 같은 개념이라 namespace를 using으로 선언하고 그 scope아래에 클래스를 만들면, 해당 클래스가 어디 위치에 있다는 것을 정의하는 개념으로 사용된다고 알고 있는데요, 이것도 맞을까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 WriteLock의 Yield부분이 헷갈려 질문 드립니다
public void WriteLock() { int desired = (Thread.CurrentThread.ManagedThreadId << 16) & WRITE_MASK; while (true) { for (int i = 0; i < MAX_SPIN_COUNT; i++) { if (Interlocked.CompareExchange(ref flag, desired, EMPTYFLAG) == EMPTY_FLAG) { return; } } Thread.Yield(); } }이코드에서 MAX_SPIN_COUNT까지 시도 해보고 Thread.Yield()로 다른 쓰레드에게 양보한다고 이해하고 있는데 여기서 다시 while(true)로 인해 또다시 반복해서 문을 두드리면 굳이 Yield()를 하는 이유가 무엇인지 모르겠습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부방법관련 질문드려요
안녕하세요공부 관련 질문있어서 글 작성해요!현재 part4까지 들었는데유니티 part2 부분과 part4 부분이 부족하여 복습하면서 계속 강의를 계속 들을 예정인데알고리즘/자료구조 공부도 이제 시작하는데시간 비율을 어느정도로 하는게 좋을지 궁금해서 여쭤보려고 해요현재는 C# 공부 6 : 코딩테스트 준비 4로 하려고 하는데C# 공부 비율을 더 늘리는게 좋은지 어떤지 잘 모르겠어서 질문남겨요
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
send 과정에서 멀티스레딩에 관한 질문입니다
//양질의 수업 감사합니다. 데이터를 보내는 과정은 수업에서 크게send() // 데이터를 큐에 넣고 보내는 사람이 없으면 직접 보냄register_send() // 비동기로 send 실행on_send() // 데이터 전송 후 콜백 함수총 3가지 과정입니다근데 여기서 lock 경합 상태를 방지하기 위해 누군가가 보내고 있으면 큐에 데이터를 넣기만 하고 다른 일을 하러 가고 실제로 보내는 스레드는 단 1개로 설계한 것처럼 보이는데 큐에 데이터를 넣는 과정도 lock 안에 있어서 데이터를 보내는 스레드가 일을 마칠 때까지 큐에 데이터 못 넣고 대기 상태에 빠지지 않나요? 그래서 결국엔 lock 경합을 예방하는데 도움이 되는지 궁금하네요뭔가 send_queue 이 자원은 object key를 따로 만들어서 딱 이 녀석만 상호배제해야 할 것처럼 생각이 드네요
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
비동기 함수와 lock 의 관계에 대한 질문입니다
lock(key){ bool pending = recvAsync() if(pending == false) //콜백 함수}이런 상황에서 비동기 함수가 pending == true면 흐름이 끊긴다고 할까요? 대기 중인 상태 랄까요 어쨋든 이런 상황에서는 다른 스레드가 lock 안으로 들어올 수 있나요?? 질문을 다시 정리하면 스레드 1이 위의 코드에서 pending 이 true 인 상태면 lock 을 빠져나가서 스레드2가 lock 안으로 들어 올 수 있나요 아니면 스레드가 1 이 lock 안에 계속 있는 판정이라서 스레드2 가 lock 안으로 들어올 수 없나요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
NetworkStream에는 SendBuffer와 RecvBuffer와 같은 기능이 없나요?
안녕하세요.PacketSession까지 강의를 보다가 NetworkStream에는 SendBuffer와 RecvBuffer와 같은 기능이 없는지 궁금해져서 글을 적었습니다.데이터를 암호화할 때 SslStream에 NetworkStream을 넣어서 암호화를 하는 걸로 알고 있습니다. 그러가다 문득 아래와 같은 궁금점들이 생겼습니다.암호화를 했던 데이터를 받아서 복호화하려면 암호화되었던 바이트 배열을 모두 받아야 복호화를 할 수 있지 않나?데이터를 다 받은 다음 복호화하려면 NetworkStream이나 SslStream에 이미 SendBuffer, RecvBuffer 같은 기능이 있어야 되지 않나?SslStream는 굳이 데이터를 다 받지 않아도 복호화가 가능한가? 제 질문을 끝까지 읽어주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Span<byte> 으로 유지해서 진행해본 결과..
강사님 안녕하세요.정말 즐겁게 학습 중인 수강생입니다. 강의 후반부에 유니티 연동하면서Span<byte> 를 수정하는 방향으로 진행하는 와중에제가 사용하는 유니티 버전에서 Span<byte>을 지원하게 되어 따로 수정하지 않고 이번 강의를 최종적으로 마무리 지었습니다. 다만, 더미 클라이언트를 마지막에 500으로 설정하고유니티에서 실행하는데 강사님 코드로는 500개 더미 클라이언트가 가끔씩 500개가 연결되지 못한 상태로 연결됩니다.제 코드 역시 간혹 500개가 연결되지 않습니다. 여기서 문제는...강사님은 연결이 덜 된 클라이언트가 있어도 패킷을 모아보내기가 수월하게 동작하나,span<byte>코드로 유지한 저는 500개도 아닌 200개 이상으로 설정하면 연결도 안 덜 되고... 패킷 모아보내기 조차 수행되지 않습니다. 윈머지를 통해서 코드는 전부 비교했으나, span<byte> 관련 부분 제외 전부 동일합니다. 500개가 항상 정상적으로 연결되지 못하는 이유가 있을까요?혹은, 500개가 연결되지 않더라도 span을 사용했을 때와 사용하지 않았을 때의 모아보내기 가능 유무가 달라지는 이유가 어떤게 있을까요...?어떤 차이로 혹은 어떤 곳을 의심해봐야 하는 지 여쭤봐도 될까요? 의심부분을 찾기 너무 어려워 질문 올립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
솔루션 'Server'(0개의 프로젝트)로 생성이 되어버립니다.
'콘솔 앱(.NET Core)'가 존재 하지 않아서 '콘솔 애플리케이션'으로 프로젝트를 생성하였습니다. .NET 데스크톱 개발은 설치가 되어있습니다.개별 구성요소에서 .NET Core 3.1 Runtime(Out of support)를 체크하여 '콘솔 애플리케이션'을 만들었습니다. 프로젝트를 생성하였으나 솔루션에 프로젝트가 0개라고 떠서 더이상 진행 할 수 가 없습니다. 혹시 어떻게 해결하면 될까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 룸 입장, 퇴장 관련 패킷이 궁금합니다
안녕하세요 게임 서버 개발자가 되고 싶어서 공부중입니다.카트라이더처럼 유저가 게임 룸을 만들고 원하는 룸에 입장하고, 퇴장하는 게임을 만들 때, 생성되어있는 게임 룸들의 리스트들을 서버에서 받아와야 하는데 이 때 룸 정보들을 요청하는 패킷, 예를들면 C_RoomList 같은 패킷이 필요할까요?그리고 룸에서 퇴장할 때도 C_LeaveRoom 같은 패킷이 필요한지 궁금합니다. 정확하게는 GameRoom 코드에서 LeaveGame과 ClientSession의 OnDisconnected가 어떻게 작동되는 것인지 궁금합니다.항상 좋은 강의 감사드립니다!!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 서버의 구조? 및 공부법에 대한 질문입니다.
안녕하세요! 루키스님 강의를 통해 서버를 공부하고 있는 한 대학생입니다.현재 학교에서 게임 서버와 관련된 전공이 따로 있지 않아 혼자 공부하며 졸업작품을 사전에 준비하려고 하는데요.게임에 사용되는 서버가 단순히 클라이언트를 연결해주는 서버 뿐만 아니라, 채팅 서버, 동기화 서버, NPC서버 등등.. 기능에 따라 분할하여 관리하는 경우가 많다고 들었습니다. (실제로 현업에서는 어떻게 관리되는지 모르겠지만 구글에서 찾아본 바로는 이렇게 알고 있습니다.)현재 MMORPG 게임 서버를 만드는 데에 있어서 어떠한 요구사항들이 필요한지 구조를 설계해보고 있는데,사실 현재 질문을 작성한 섹션까지의 강의를 보고 따라하면서도 코드가 잘 와닿지 않습니다.우선 제 생각은 처음부터 끝까지 우선 정독하며 코드를 따라 작성하며 다시 정주행하며 작성했던 코드들 하나하나 뜯어보고자 했는데, 현재 이해되지 않는 부분들을 이해하고 넘어가는게 좋을까요?또한 제가 처음부터 이쪽으로 공부했던 것이 아니라, 전과를 하여 전공지식에 있어서 부족한 점들이 있습니다. 특히 데이터 베이스나 웹에 대한 지식이 아직 없는데, 데이터 베이스를 공부한 뒤 서버를 공부하는 것이 좋을까요?해당 강의에서 알려주시는 서버에 관한 내용들은 위에서 제가 언급한 분할 서버들(채팅, 동기화 등)에서도 모두 활용이 되는 내용들일까요?아니면 전혀 무관하여 부가적인 공부가 필요할까요?클라이언트는 기존에 작게 프로젝트를 해본 경험이 있어 어느정도 익숙해졌다고 생각해 서버를 공부하기 시작한건데요.서버 프로그래밍이 매우 어렵다는 것을 알고 나름 강의를 수강하기 전 이론에 관해서도 어느정도 확립한 뒤 듣고있는데도.... 코드를 봐도 전체적인 흐름조차 잘 파악이 되지 않네요... 정상일까요?아니면 기본기가 부족하여 이해를 못하고 있는 것일까요?목표는 클라이언트 프로그래머이지만, 서버를 알고 클라이언트를 개발하는 것과 모르고 개발하는 것에 큰 차이가 있을 것이라고 생각해 작게라도 MMORPG를 한번 만들어보고자 하고 있는데, 어려운만큼 노력하면 되는건데도 시작점이 같지 않다는 핑계가 머리를 떠나지를 못하네요..아직 부족한 전공지식도 많은데 이런 내용들을 공부해도 괜찮은 걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
브레이크 포인트를 거는데 그냥 실행됩니다.
중단점이 현재 적중되지 않습니다. 이 문서의 기호가 로드되지 않았습니다.라고 뜨고 브레이크 포인트와 상관없이 그냥 실행됩니다.왜 그런걸까요 ㅠ
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓 SendAsync 예외 발생시 대처방법에 대한 질문입니다
안녕하세요 선생님! 강의 잘 듣고 있습니다유니티 연동하면서 간혹 클라에서 서버로 보내는 과정에서 세션 클래스의 SendAsync 부분이 예외를 발생시켜 pendinglist 를 비워주는 clear 함수를 호출 하지 못해if (_pendingList.Count == 0) RegisterSend();영원히 send가 막히는 경우를 발견했습니다 try { bool pending = _socket.SendAsync(_sendArgs); if (pending == false) OnSendCompleted(null, _sendArgs); } catch (Exception e) { RegisterSend(); // 수정한 부분 Console.WriteLine($"RegisterSend Failed {e}"); } 이렇게 RegisterSend(); 를 다시 호출해서 SendAsync 가 될때까지 시도를 하는 방식으로 고쳤더니 send가 막히는 현상을 없애기는 했습니다만제가 생각하는 이 대처방법의 문제는 sendAsync가 계속 예외를 발생시키면 무한루프를 만들어서 이게 맞는 대처방법인지 의문이 듭니다...