월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[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가 계속 예외를 발생시키면 무한루프를 만들어서 이게 맞는 대처방법인지 의문이 듭니다...
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
온라인 게임 서버 운영체제
안녕하세요! 우선 좋은 강의 만들어 주셔서 감사합니다.공부를 하다가 문득 온라인 게임 서버가 보통 어떤 운영체제에서 서비스되는지 궁금해졌습니다.보통 웹 서비스를 리눅스로 많이 운영하다 보니 게임 서버 쪽도 차이가 없을 것으로 생각했는데, 국내에는 윈도우를 많이 사용한다는 이야기가 있더라구요.근데 워낙 오래전 글을 본 것이라 현재도 그러한지 궁금하네요.온라인 게임하면 보통 굵직한 회사로 넥슨과 NC가 있을 것 같은데요. 현업 관계자로서 보셨을 때 두 회사에서 주로 어떤 운영체제로 서비스하는지 자그마한 힌트를 주실 수 있을까 조심스레 여쭤봅니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Read 함수
강의를 보고나서 코드를 다시보며 이해를 해보고 있었습니다. ReadOnlySpan을 만들어준 후 count += (ushort)를 2번 해주는데 이 부분이 이해가 안되더라구요 왜 그런건가요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Packet Generator#2 string부분
안녕하세요이 부분까지는 실행이 잘되는 것을 확인하였습니다.그 뒤에 PacketFormat 부분에서실행시키면 아래와 같이 string부분은 입력이 안됩니다. 제 코드에서 틀린부분을 못찾겠어서 선생님이 올려주신 정답 코드로 다시 실행을 해보았는데똑같이 string부분이 입력이 안되는데 혹시 어떤 부분이 잘못되었는지 알려주실 수 있으실까요? class PlayerInfoReq { public long playerId; public void Read(ArraySegment<byte> openSegment) { ushort count = 0; ReadOnlySpan<byte> s = new ReadOnlySpan<byte>(openSegment.Array, openSegment.Offset, openSegment.Count); count += sizeof(ushort); count += sizeof(ushort); this. playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count)); count += sizeof(long); } public ArraySegment<byte> Write() { ArraySegment<byte> segement = SendBufferHandler.Open(4096); bool success = true; ushort count = 0; Span<byte> s = new Span<byte>(segement.Array, segement.Offset, segement.Count); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count,s.Length-count), (ushort)PacketID.PlayerInfoReq); count += sizeof(ushort); success &= BitConverter.TryWriteBytes(s.Slice(count, s.Length - count), this. playerId); count += sizeof(long); success &= BitConverter.TryWriteBytes(s, count); if (success == false) return null; return SendBufferHandler.Close(count); } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Serialization #3 this.name
안녕하세요!강의를 수강하다가 질문이 생겨서 글 남깁니다.Serialization #3[08:30]name = "ABCD"의 문자열의 길이는 4이지만 byte배열로 변환하면 길이가 4byte가 아니라 8byte가 되는 것 까지는 이해하였습니다. 왜냐하면 C#은 UTF-16을 사용하므로 UTF-16은 문자들이 각 2Byte이기 때문입니다.Encoding.Unicode.GetByteCount(this.name)에서UTF-16기준으로의 바이트 배열로 변환됐을 때의 수를 가져오는 것이니까 그러면 위와 같이 8Byte인 것 같아서 어떻게 4Byte인지 궁금증이 생겨 질문 남깁니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send lock 관련 질문
public void Send(byte[] sendBuff) { lock (_lock) { _sendQueue.Enqueue(sendBuff); if (_pendingList.Count == 0) RegisterSend(); } } void OnSendCompleted(object sender, SocketAsyncEventArgs args) { lock (_lock) { if (args.BytesTransferred > 0 && args.SocketError == SocketError.Success) { try { _sendArgs.BufferList = null; _pendingList.Clear(); // Doing if (_sendQueue.Count > 0) RegisterSend(); } catch (Exception e) { Console.WriteLine($"OnSendCompleted Failed {e}"); } } } }수업을 들으면서 Send와 OnSendCompleted에 lock이 서로 다른 두개이상의 쓰레드가 동시에 sendQueue, pendingList에 Write하는 것을 방지하는 것이라고 이해했습니다.그리고 Send의 if문이 다른 쓰레드가 전송중일때를 체크하는 것이라고 들었는데 저 2개의 lock구조에서, 쓰레드A가 OnSendCompleted의 lock구역안에 있을 때 쓰레드B가 Send의 lock구역에 진입이 가능한지 궁금합니다.만약 접근이 안된다면 pendingList.Count가 항상 0이 되지않을까 생각하고 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디스어셈블리가 어디에 있는지 모르겠습니다 .
안녕하세요 수강생입니다. 강의를 듣다가 디스어셈블리를 찾고 있는데 없습니다. 강사님 VS에는 있는데 제가 쓰고 있는 VS에서는 없네요 어떻게 하면 될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
vs에서 디버깅이 제대로 이루어지지 않습니다.
이 상태로 디버깅을 진행하였습니다.컨트롤 F5를 눌러 디버깅을 하면 이렇게 나오고F5만 누른다면 콘솔창도 뜨지않고 바로 디버깅이 중료됩니다. 위에 있는 시작 버튼을 눌러도 똑같이 디버깅이 바로 종료됩니다. 왜 이런걸까요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문이 있습니다.
안녕하세요 저는 게임 서버에 관심이 있어서 혼자 독학하고 있는 대학생입니다. 다름이 아니라 Connector수업을 다 듣고 실행할라고 했는데 대상에 컴퓨터가 연결을 거부합니다. 이런 오류가 뜨는데 어떻게 해결 해야할지 모르겠습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom에서 세션 관리에 List를 사용한 이유가 궁금합니다.
Room에 Enter와 Leave를 통해 채팅에 참여하고 나갈 수 있습니다.그리고 해당 session들을 순회하면서 모든 세션에 메시지를 보내야 합니다. 여기서 의문 사항은 참여하는 것에는 List(ArrayList)는 O(1)인데, 나가는 작업이 발생하면 자칫 O(n)이 발생할 수도 있다고 생각했습니다.이유는 해당 session을 찾는데 linear하게 순회해서 찾아내야 하고, 해당 session을 제거하고나서 빈 공간을 앞으로 당겨줘야 하기 때문입니다. 이 때문에 제 생각엔 HashSet을 사용하는 것이 좋을 것이라 생각했습니다. 혹시 List를 사용한 이유가 Enter Leave 연산보다 Broadcast가 훨씬 많이 이용되고 있기 때문에순회가 HashSet보다 List가 훨씬 빠르기 때문인가요? 언제나 양질의 강의에 감사드립니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Segment와 Span의 차이
강의를 보던 중 Segment나 Span 같은 것들이 나오던데 이 둘의 차이점은 뭔가요 ?