월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[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 게임을 만들고 싶은데 서버를 통하면 서버 유지비가 너무 많이 나갈 것 같아서 문의드려봅니다. 뭘 참고 해야될지 알려주세요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadPool에 직접 넣는것과 Task로 넣는 것의 차이
학습 도중 Thread, ThreadPool, Task에 대한 이해가 완벽하지 않은 것 같아 질문을 남기게 되었습니다. 다른 수강생분들의 질의응답을 참고해봤는데 그런데 일손이 조금 부족한데 굳이 새로운 일꾼을 채용해서 굴리기 싫다면,이를 인력 사무소(ThreadPool)에 의뢰를 하는 것도 가능한데요.의뢰를 할 일감을 Task로 만든다고 볼 수 있겠습니다. 라는 답변이 있더라고요 그렇다면 Task는 결국 ThreadPool이라는 인력사무소에 넣어주어서 일꾼(Thread)에게 이 일을 하게 해달라는 것과 같다고 이해하였습니다. 그런데 ThreadPool에서도 일꾼에게 일감을 줄 수 있는 방법인 QueueUserWorkItem 라는 메서드가 존재합니다. 이 두가지가 어떻게 다른 것인지 이해가 잘 가지 않아 질문을 남기게 되었습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임서버 공부전에 질문있습니다!
안녕하세요 루키스 선생님 지금 part3와 part4를 병행하고 싶은데, part3가 part4의 선수과목인지, 독립적인 과목인지 궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 마지막 Room 처리 관련 질문입니다!
바쁘실텐데 죄송합니다. 알려주신대로 잘 처리는 했으나 살짝 애매하게 이해한 거 같은 부분이 있어 질문드립니다. GameRoom room = Room; -> 여기서 Room은 클래스가 아닌 변수라서 Stack에 저장되어 room으로 값 복사가 발생한 것이고 그렇기에 바로 아래 줄에서 Room = null 처리 해도 room의 값이 살아있어 잘 처리 된것 같은데 제대로 이해하고 있는지 헷갈려서 질문을 드립니다. 힙에 저장 됐으면 참조만 같아지는거니까 Room = null하는 순간 room, Room 둘다 null이 되는게 맞을 거 같아서요! 기초적인 지식이라 질문드리기는 죄송합니다만 자꾸 헷갈리는데 물어볼곳이 없네요..ㅜㅜ 항상 강의 잘 듣고 있습니다. 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SendBufferHelper class를 두는 것은 디자인 패턴의 하나인가요?
자주 사용하는 어떤 기법 같은 것인지 궁금합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnAcceptCompeted 함수 질문드립니다..
_onAcceptHandler.Invoke(args.AcceptSocket); 부분에서 _onAcceptHandler에서 object가 null 값이 되면서 오류가 발생합니다. 이 오류가 왜 발생하는지 잘 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
interlocked.Exchange(ref _disconnected, 1) == 1
안녕하세요disconnect() 함수 안에서if(interlocked.Exchange(ref _disconnected, 1) == 1) 체크를 해서 두번 실행하는것을 방지한다고 했는데테스트를 위해 Disconnect()를 직접적으로 두번 불러서 했지만 실제로 게임이 진행되고 있는 과정에서 두번 실행되는 경우의 수가서버쪽 셰션에서 Send를 할때 Disconnect가 이루어 졌는데 그때 갑자기 클라이언트로 부터 Recv가 들어오면서 이미 send쪽에서 해당 클라 셰션을 disconnect가 되어 있는 상황으로 recv 쪽에서 예외가 발생하면서 Disconnect를 실행되는데 상황이 될 수 있을까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadLocal<SendBuffer> 질문
public static class Helper { private static readonly ThreadLocal<int> Num = new ThreadLocal<int>(() => 0); public static int Plus(int n) { Num.Value += n; return Num.Value; } } public class Program { public static void Main() { var action = () => { Console.WriteLine(Helper.Plus(1)); }; Parallel.Invoke(action, action); Parallel.Invoke(action, action); Parallel.Invoke(action, action); Console.WriteLine(Helper.Plus(100)); /* 결과 * 1 * 1 * 2 * 2 * 3 * 3 * 104 */ } } ThreadLocal<SendBuffer> 타입은 스레드가 해당 값을 참조하려 할 때 스레드의 스택 영역에 할당해주잖아요. 이 것은 마치 냉장고에서 재료를 꺼내러 갔더니 요리사들에게 재료의 사본을 꺼내 주는 것과 같은 거네요? 그렇다는 것은 클라이언트 A와 B는 { 1, 1, 0, 0 }의 ArraySegment 동시에 가져가게 되는 꼴인데, A와 B가 서로 2 바이트 만큼 SendBuffer에 덧붙인다고 했을 때 A가 Open & Close해서 작성한 SendBuffer {1, 1, 1, 1}과 B가 Open & Close해서 작성한 SendBuffer {1, 1, 1, 0}이 서로 충돌하는 상황이 될 것 같은데요. 1) 제가 이해한 것이 맞는지 궁금하구 2) 충돌하는 상황이라면 문제가 되는지 궁금합니다. 항상 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 내용을 게임에 대입했을때 제가 이해한게 맞을까요?
현재 두번째 복습을 하고 있는데 강의 내용이 게임에 대입했을때 맞는지 확인해주실 수 있나요? static int number = 0 //서버의 클라이언트 전달 패킷 static void Thread_1() //플레이어 1 static void Thread_2() //플레이어 2 Interlocked => lock 을 통해 한번에 한명씩만
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session.Disconnect 락 필요성
static void OnAcceptHandler(Socket clientSocket) { try { Session session = new Session(); session.Start(clientSocket); byte[] sendBuff = Encoding.UTF8.GetBytes("Welcome to MMORPG Server !"); session.Send(sendBuff); Thread.Sleep(1000); session.Disconnect(); } catch (Exception e) { Console.WriteLine(e); } } Session#1 강의 듣던 중 Session의 Disconnect 함수가 임계영역이 아닌 것 같아 질문드려봅니다. 쓰레드 마다 Session 객체를 새로 생성후 사용하기 때문에 Session객체가 다른 스레드가 접근할 수 없는 스택영역에 올라가있다고 생각했거든요. 혹시 제가 간과한 부분이 있다면 지적 부탁드립니다. 좋은 강의 감사합니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
프로그램 실행 에러
OnRecvCompleted Failed System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at Server.GameRoom.Broadcast(ClientSession session, String chat) in C:\Users\lll\source\repos\Server\Server\GameRoom.cs:line 27 at PacketHandler.C_ChatHandler(PacketSession session, IPacket packet) in C:\Users\lll\source\repos\Server\Server\Packet\PacketHandler.cs:line 19 at PacketManager.MakePacket[T](PacketSession session, ArraySegment`1 buffer) in C:\Users\lll\source\repos\Server\Server\Packet\ServerPacketManager.cs:line 58 at PacketManager.OnRecvPacket(PacketSession session, ArraySegment`1 buffer) in C:\Users\lll\source\repos\Server\Server\Packet\ServerPacketManager.cs:line 42 at Server.ClientSession.OnRecvPacket(ArraySegment`1 buffer) in C:\Users\lll\source\repos\Server\Server\Session\ClientSession.cs:line 30 at ServerCore.PacketSession.OnRecv(ArraySegment`1 buffer) in C:\Users\lll\source\repos\Server\ServerCore\Session.cs:line 34 at ServerCore.Session.OnRecvCompleted(Object sender, SocketAsyncEventArgs args) in C:\Users\lll\source\repos\Server\ServerCore\Session.cs:line 214 안녕하세요 위와 같은 에러가 나왔는데, 아무래도 뭔가 제가 코딩하면서 잘못 작성한 부분이 잇는거겠죠? ㅎㅎ ㅠㅠ 문서 찾아보니 아래와 같이 나오네요. foreach 문 안에서는 컬렉션에 수정을 하면 안된다? 같네요.. https://docs.microsoft.com/ko-kr/dotnet/api/system.invalidoperationexception?view=net-6.0#Iterating foreach 구문을 고치라는데..정작 강의에서는 foreach 로 되어있어 난감하네요 코드비교를 해봐도..어느부분이 문제인지 알수가 없어 일단 다음 강의로넘어갑니다ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티쓰레드 환경에서 Send인터페이스 질문
강사님 안녕하십니까! 강의 코드를 읽어보다 궁금한점이 생겨 질문드립니다! 멀티쓰레드 환경에서 Send 인터페이스 사용시 다른 쓰레드가 이미 lock을 잡고 있다면, sendBuff는 sendQueue에 Send함수가 끝나 sendBuff가 sendQueue에 못들어간다고 생각했습니다. 그리고 다음 for 문에서는 sendBuff가 초기화 되던데, 이러면 이전 sendBuff정보가 사라지지 않나요?? 강의는PacketSession 까지 들은 상태입니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
HTTP도 소켓통신 인가요?
컴퓨터 네트워크는 OSI 7계층으로 통신한다고 하잖아요 그래서 응용계층의 HTTP 프로토콜도 통신하기 위해선 Transport Layer를 거쳐야한다는 건데... 1. 그렇다는건 웹서버도 리스너 소켓을 생성하는거겠죠? 그리고 크롬, 엣지, 파이어폭스 같은 브라우저들이 클라이언트라고 볼때 2. Connection을 요청하기 위해 브라우저들도 소켓을 생성하고 있다고 볼 수 있을까요? 3. 만약 그렇다면 http도 소켓 API를 사용하는데 왜 http는 소켓 통신과 다르다고 하는걸까요?