월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[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 같은 것들이 나오던데 이 둘의 차이점은 뭔가요 ?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
파트별 학습순서
안녕하세요, 학습순서에 대해서 질문드리려고 합니다.파트 3을 완강했고,게임서버4, 디비5, 웹서버6까지 강의를 구매해놓았습니다.저는 컴퓨터공학을 전공했지만 파트4의 내용들이 꽤 어려운 것 같아서, 파트4->파트6순으로 듣는게 맞는것인지 아니면 6->4 순으로 듣는것이 좀더 좋은지, 혹은 아예 독립적인 내용인지 여쭤보려 글 남깁니다.전부 다 수강한다는 전제하에 파트 별 학습순서를 추천해주실 수 있을까요:?감사합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
교재관련
안녕하세요. 게임서버와 관련해서 C#으로 설정되는 교과서가 있을까요? 해외 원서도 좋습니다. 시중에는 C++로 기술된 교재밖에 없어서 강의 병행하기에는 애로사항이 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
[에러 공유] disposeed object
args.connectedSocket을 socket으로 줄여쓰고 싶어서 이렇게 코드를 짜면 계속 disposed object 에러가 난다. 해결법 : socket변수를 따로 만들지 말고 루키스 선생님의 코드처럼 그냥 args에서 connectsocket을 가져와야된다. https://stackoverflow.com/questions/71450166/when-is-an-object-disposed-if-it-uses-using-and-it-is-being-used-in-a-few-meth 영어가 미숙해서 정확히 이해는 못했지만 { }를 나갔다가 오면 문제가 생기는 듯하다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Dns.GetHostName()에서 'String conversion error'가 뜹니다.
Unity버전은 동일한데 방법있을까요?파일경로나 PC이름을 영어로 바꿔야할까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
_pending 을 _pendingList.Count == 0으로 대체한 것에 대한 질문입니다
_pending을 없애고 _pendingList.Cont == 0 으로 대체하셨는데pendingList.Count가 0일 때 1개의 쓰레드가 통과되고, 통과한 쓰레드가 _pendingList에 값을 추가하기 전에 또 다른 쓰레드가 _pendingList.Count == 0인가에 대한 if문에 도착하면, 그 쓰레드 또한 _pendingList.Count == 0을 무사통과하게 되지 않나요??혹시 놓치고 있는 부분이 있나요?? 항상 감사합니다~!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티로 메타버스 멀티플레이를 구현해보고싶습니다!
안녕하세요 서버에대한 지식이 전무했는데 루키스님의 강의를 들으며 많은 배움을 얻어가고있습니다.저는 유니티로 메타버스 멀티플레이까지 구현을 해보는게 목표입니다.저 혼자 알아보면서 포톤pun , fusion 같이 이미만들어진 서비스들을 알게되었습니다.메타버스 멀티플레이구현이 목표라면 서버를 만들기보다는 포톤같이 이미 만들어진 서비스를 이용하는게 좋을까요 ??물론 두 방법 모두 저에게는 어렵고 공부가 많이 필요한 상황인데 루키스님 강의를 들으며 많은 도움을 얻어가고 있어서 감사합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
테스트 메모리 릭킹 관련 질문
아래와 같은 테스트를 진행했고 이는 강의코드에도 유사하게 발생할 것으로 보입니다. 서버 컨텐츠단에서 패킷 모아 보내기 기능까지 구현500개의 더미 클라이언트가 S_Chat 을 송신서버는 비주얼 스튜디오에서 디버그모드로 구동더미클라이언트는 exe모드로 실행과 종료를 반복 이때 클라이언트의 connect, disconnect가 잦아지면서 서버의 메모리 점유율이 내려가지 않는 현상이 궁금해서 그러는 것이지, 고쳐달라고 떼쓰는게 아닙니다. 이런 현상은 강의 코드에서도 발생할 것으로 보이는데요. 혹시 알고 계신 이유가있다면 그것만 말씀해주시면 됩니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
테스트 중 메모리 릭킹 현상 질문
테스트를 하다 릭킹(leaking) 현상이 생기는게 궁금해서 여쭙습니다.테스트 과정서버 컨텐츠단에서 0.15~0.25초 단위로 패킷을 모아보내는 기능까지 구현더미 클라이언트에서 500명이 C_Chat 패킷을 보내도록 구현서버만 Visual Studio의 디버그 모드로 실행 (메모리 진단을 위해)클라이언트는 빌드된 exe파일로 접속클라이언트만 반복적으로 종료하고 다시 실행이때 서버쪽 메모리 점유율이 올라가기만 합니다.Disconnect() 가 분명히 불리고 소캣을 Clean(), Shutdown()을 하는데 (심지어 Dispose()도 넣음 다 돌아가는거 확인)서버 메모리 점유율이 260메가 막 그러네요, 아무리 오래 두고 봐도 CG가 정리할 생각을 안해요 ㅠㅠ다 깔끔하게 정리할 욕심은 없습니다. 다만 릭킹은 안좋아보여서요.이거 이유가 있을까요? 참고로 리스너쪽 대기 큐 150 이상으로 설정해야 테스트가 잘됐습니다, (강의시 backlog 인자)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
경합조건과 임계영역의 차이
안녕하세요. Interlocked 과목 중 경합 조건Race Condition에 대한 수업 잘 들었습니다.과거 네트워크와 운영체제 시간에 배웠던 임계 영역과 경합 조건에 대한 개념이 헷갈려서 질문 드리고 싶습니다.말씀해주셨던 다수의 쓰레드들이 하나의 데이터 혹은 그러한 영역에 접근하고자 할 때 생기는 문제를 저는 경합 조건이라고 이해했는데요.이 개념이 혹시 임계 영역을 제가 잘 못 이해하고 있는지, 혹은 경합 조건에 대해 제대로 이해하고 있는지 궁금합니다.또 선생님께서 생각하시는 임계영역과 경합조건의 차이는 어떠한 것인지도 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
펙토리 함수가 꼭 필요한건가요? 그냥 세션으로 받으면 안되요?
public void Connect(IPEndPoint endPoint, Session session) // 사용하는 부분//connector.Connect(serverEndPoint, () => { return new GameSession(); }); GameSession gameSession = new GameSession(); connector.Connect(serverEndPoint, gameSession);Func 형 말고 그냥 Session을 참조로 받아서 하면 안되나요? 코드가 돌긴 하던데..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Disconnect 순서 문제질문드리고싶습니다!
가끔 결과가 위처럼 나오는데 이 문제는 서버단에서 RegisterRecv를 해주는 도중에 클라에서 send를 다해주고 Disconnect 해버려서 발생하는 문제인가요??위에 Seesion.cs : lin116은 OnRecvCompleted함수에서 OnRecv를 해주고 다시 RegisterRecv()<< 이 함수를 호출하는 줄입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의에서 쓰레드 생성되는게 제가 이해한게 맞을까요?
다만 Listener의 Init 부분에서 위 사진의 코드가 register개 만큼 쓰레드를 생성한다고 보면 맞을까요? 그리고 C++에서는 여러개의 Worker Thread가 GetQueuedCompletionStatus 로 이벤트 분기에 따라 send, recv, accept, connect 등을 처리해줬는데, 이 코드는 Accept만 멀티쓰레드로 처리하고 Send, Recv는 싱글쓰레드로 처리되는건가요?