월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
lock 관련 질문
Send부분에서 lock을 해주시고 나서 OnSendCompleted가 호출됬을때도 lock을 해주셨는데, 그럼 OnSendCompleted때 또 잠겨서 만약 Send가 같이 실행중에 있었다면 다른스레드는 Send부분 lock에서 갑자기 잠기면서 실행이 불가능하게 되는건가요? _pendingList.Clear()때문에 이런 고민을 하게되었습니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
델리게이트 문법이 잘 이해가 안됩니다.
_onAcceptHandler += onAcceptHandler; args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptComplated); 어셉트핸들러에 = 를 해주는 것과 += 를 해주는 것과 어떤차이인지 궁금합니다. 또 최초로 실행되는게 RegisterAccept인지 OnAcceptComplated인지 궁금합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
리시브 비동기에 관련하여 궁금한 것이 있습니다.
private static void OnAccepted(Socket clientSocket) { session.Start(clientSocket); byte[] sendBuff = Encoding.UTF8.GetBytes("Hello Server!"); session.Send(sendBuff); Thread.Sleep(1000); session.Disconnect(); } 해당 부분에서 소켓의 접속이 정상적으로 성공하여 해당 함수가 실행되고 session.Start에서 리시브 작업을 시작하고 비동기니간 바로 다른 작업으로 넘어가서 동작하다 메시지가 오면 연결되어있던 출력해주는 함수가 실행되고 출력후 다시 ResisterRecv를 실행하여 다시 또 비동기로 받을준비하고 이렇게 비동기로 클라이언트가 접속을 끊고 다시 재연결 하기 전까지는 반복으로 알고 있습니다. 그런데 여기서 궁금한게 위에 코드에서 Send 밑에 Hello라는 메시지를 그냥 콘솔에 출력해주는 코드 한 줄 넣고 클라이언트에서 예제에서는 5번 보내도록 되어 있는 것을 10만번으로 늘린 후 실행해보면 제가 예상한 결과는 10만번 보내는 도중에 위의 코드에서 Start에서 메시지 받는 것은 비동기니 받아지는 도중에 Send 진행되고 밑의 Hello 출력되고 접속이 끊긴다고 알고 있었는데 그렇지 않아 여쭤봅니다. 그러면 비동기하고 동기하고 차이가 없는 것 같아 여쭤봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 강의 도중 궁금한 점이 있어서 질문 드려요
채팅 테스트 #1 강의에서 6분 19초 쯤에 Clear 함수를 만들어서 샌드 큐랑 팬딩 리스트 클리어 해주시는데 만약 Session을 Disconnect하고 난 후에 재사용 안한다고 가정한다면 저기 Clear 함수를 호출 안해주면 발생하는 문제가 있나요? 저걸 안해줘도 크게 문제가 없어보이는데 해주시는 이유가 궁금합니다. 다른 특별한 이유가 있는지 궁금해요 안해주면 메모리 릭이라든지 그런게 발생할 수 있나요..? 정확히 어떤 이유에서 Clear를 해주는지가 궁금합니다 강사님~!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
9:30초 최적화 질문입니다.
쓰레드라는 프로그램을 실행을 해주는(직원)이 있는데 직원이 많으면 멀티 쓰레드 이다. 1. 번 질문 제 컴퓨터는 코어가 8개짜리라서 직원이 8명까지 배치를 해줘야 가장 효율적인것인가요? (가령 크롬, 비쥬얼 코드 , vscode, ... 이렇게 8가지의 프로그램을 돌려야 성능에 가장 효율적이라는 것인가요??) 1번 질문에서 처럼 우리는 멀티 쓰레드 환경이라 각 쓰레드는 static변수는 공통으로 사용을 할 수있다.(접근도 가능함) 스택부분만을 각자의 것으로 관리를 하는데 _stop을 공통으로 접근이 가능하게 되어있는데 모드를 release로 해버리면 컴퓨터가 주인님에게 최적화를 해주기 위해서 주인님이 멍청하게 while문 안에다가 _stop을 빠져나갈 부분을 안 만들어 주었네? 라고 생각하고 -> if(true) 로 해서 while(true)로 해주었었다. 2. 번 질문 그래서 이부분을 최적화를 하면 컴퓨터가 주인님을 위해서 알아서 if문안에 while무한 루프를 만들고 우리는 ThreadMain 쓰레드가 아닌 Main Thread에서 _stop을 = true로(공통으로 접근이 가능하기에) 바꿔주려고 하는데 이부분에 곂침? 꼬이는 현상이 발생을 하기에 최적화(release 모드를)해주면 안된다는 말씀이신가요???
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 베리어에 관하여 궁금한 것이 있습니다.
메모리 베리어 강의의 막바지에 예제에서 void () { _answer = 123; Thread.MemoryBarrier(); _complete = true; Thread.MemoryBarrier(); } 이런 코트가 있고 여기서 왜 메모리 베리어가 두 개가 있냐하면 _answer에 값을 변경하고 배리어를 통해 메모리에 써주고 _complete = true도 변경하고 배리어를 통해 메모리에 써주기 때문에 두 번 들어갔다고 설명을 하셨는데요. 여기서 문득 궁금해지는게 만약에 _answer = 123; _complete = true; Thread.MemoryBarrier(); 이런식으로 변경을 위로 몰고 배리어를 한번만 호출하면 위에 변경사항이 모두 메모리에 써져 기존과 같은 결과의 코트가 되는것인가요? 아니면 바로 위의 최근 것만 램에 저장이 바로 되어 결과가 다른 코드가 되는 것인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
새해 복 많이 받으세요!
진짜 유익하게 듣고 있습니다 !!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
JobQueue Flush함수 질문있습니다.
jobQueue에 데이터를 넣고 뺄 때 lock을 걸어야하는 것은 이해가 되는데 action에 데이터를 넘겨받고서는 lock이 풀린상황이니 invoke하기 전에 다른 스레드가 action을 바꿔치는 경우도 가능하지 않을까 하는 생각이 들어서 질문드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
20:26초 테스트 하는 부분 질문
현재 이렇게 뜨고 실행을 하고 콘솔창을 보면 그냥 종료가 되어 버립니다. 람다식으로 넣어준 while문을 true로 하고 { } 이렇게 해주어도 그냥 바로 종료가 되어 버리고 디버거 옵션을 "내코드만"부분을 해제도 해보고 다시 설정을 해보아도 똑같습니다..ㅠㅠ 무엇이 문제일까요 CPU 코어 갯수는 8개라고 나와있습니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이벤트 핸들러 관련 궁금증이 생겼습니다.
Connect Async를 사용해 Peeding값을 받아와 Completed 함수를 구현 했는데 이전에 Aysnc에 이벤트 핸들러로 Completed 함수를 넣었는데 Peeding으로 한번 체크하는 이유가 궁금합니다. SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.Completed += OnConnectCompleted; if (peending == false) OnConnectCompleted(null, args);
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
3D 게임에서 충돌체크 질문드립니다.
안녕하세요. 현업에서 3D 게임을 만들때 충돌관련 질문이 있어 질문 드립니다. 1. 2D처럼 충돌체크를 서버단에서 처리하는 방식을 쓰나요? 2. 그렇다면 콜리더는 쓰지않는건지, 콜리더를 쓴다면 어떻게 처리하는지 궁금합니다. 현재 스피어 콜리더로 범위를 두고 2D처럼 진행방향에 캐릭터가있으면 충돌처리하고 충돌에 따른 튕겨나감을 처리하고 있는데 싱크가 안맞아서 그런지 생각처럼 되지 않네요..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 교안에 대한 질문
1. 게임서버에 네트워크, db, 게임로직 등등이 들어간다고 설명주셨는데 서버의 "게임로직"은 루키스 전강의 중 어느 파트에 해당하는 것일까요? 2. 밑의 교안에 채팅에 관한 내용도 있는데 채팅도 http가 아닌 게임서버와 같은 실시간 통신으로 이루어지는 것인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReadLock부분에서 이해한게 맞는지 확인하고 싶습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 이부분에서 Interlocked.CompareExchange 조건문에 예상값과 비교후에 +1을 해주는데 일반적인 상황은 아니겠지만 ReadCount범위를 초과하게 되면 어떻게 되는거지 라고 생각을 해보니 결국 WriteCount영역에 도달을 하게 되지만 ReadCount최대값의 +1 까지만 접근 가능하고 더이상은 WriteCount가 올랐기 때문에 더이상 접근할수 없게되고, 그 이후에 ReadUnLock() 실행이 되면 WriteCount에서 빠지고 그 뒤로는 이전처럼 동작하게 구조가 맞는거죠 이해한게 맞는지 확인하고 싶어서 글 올려봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티에 스크립트 옮길 때 이런 오류가 발생합니다.
심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 오류 CS0037 'ArraySegment<byte>'은(는) null을 허용하지 않는 값 형식이므로 null을 이 형식으로 변환할 수 없습니다. Assembly-CSharp C:\Users\ARTECH COME 002\Desktop\Unity Project\0119 DB TEST\DB TEST\Assets\Script\Network\SendBuffer.cs 47 활성 강의에서 발생하는 오류가 아니라 저는 이런 오류가 발생하는데 어떻게 해결하면 좋을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디버그 시 상단에 스레드 표시하는 UI는 어떻게 활성화할 수 있나요?
비주얼 스튜디오 디버그 시 프로세스, 수명 주기 이벤트, 스레드, 스택 프레임 등이 적혀 있는 UI를 활성화하고 싶습니다. 눈에 보이는 관련 키워드로 구글링 먼저 해봤지만 도통 찾아내기가 어려웠습니다. 어떻게 하면 상단의 UI를 활성화할 수 있을지 간곡히 여쭤봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session Clear() 함수 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. Session클래스내 Disconnect시 Clear함수를 안해주었을때 발생하는 문제가 있을까요??
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SocketAsyncEventArgs에 대해 질문드립니다
안녕하세요 강사님 질좋은 강의 제공해주셔서 항상 감사합니다. 저가 질문드릴거는 SocketAsyncEventArgs와 관련된 부분입니다. (SocketAsyncEventArgs를 소켓처리를 지원하기 위한 클래스라고 이해하고 있습니다.) 질문은 두가지 입니다. 1. args.Completed라는 것이 정확히 어떤 동작을 완료했을 때 발생하는지에 대한 것입니다. 이 후 강의를 보면 send와 receive에서도 args.Completed라는 것을 쓰는데, args.Completed가 의미하는게 클라이언트에서 conncet를 요청한 상황인지, 클라이언트에서 데이터를 보내거나 받는 상황인지 어떻게 구별하는건가요? 2. SocketAsyncEventArgs와 Socket의 관계가 어떻게 되는지 궁금합니다. SocketAsyncEventArgs이 어떤 소켓을 지원하는지 어떻게 알 수 있나요? RegisterAccept함수에서 _listenSocket.AcceptAsync(args)를 해주었기 떄문에, args는 _listenSocket 소켓의 소켓처리를 지원하는 클래스라고 생각하면 되나요? 그렇다면 RegisterAccept함수가 시행되기전인 Init함수에서 args가 어떤 소켓을 지원하는지는 알 수 없는 상태인건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문중에 원자성이라는 말씀을 하셨는데
int temp = number; temp -= -1; number = temp; 이 코드가 number ++ 를 정의 하는 코드란 것인가요..?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send하는부분 전체적인 로직 질문입니다.
Send함수 : _pending이 true일 때 -> 지금 RegisterSend를 하고 있으니 등록하지 않고 대기열(큐) 에 넣어준다. _pending이 false일 때 -> 지금 RegisterSend를 하고있지 않으니 RegisterSend를 실행한다. 동시에 Send를 실행할 수 있으니 lock을 걸어줘야 한다. RegisterSend함수: _pending을 true로 바꿔서 실행중이라는 것을 표시, 큐에서 버퍼 하나를 꺼내서 SendAsync를 비동기로 실행, 완료되면 OnSendCompleted를 호출한다. Send에서 호출하는 경우와 OnSendCompleted 에서 호출하는 두 가지 경우가 있지만, Send에서는 _pending이 false일때 호출, OnSendCompleted에서는 _pending이 true일 때 호출하기 때문에 lock을 걸어주지 않아도 된다. OnSendCompleted 함수: RegisterSend을 하는 동안 큐에 쌓인 버퍼를 전부 처리하고 _pending을 false로 바꿔서 일을 끝냈다고 표시한다. 직접 호출과 콜백 두 가지 경로로 올 수 있기 때문에 lock을 걸어줘야한다. 대충 이렇게 이해했는데 이해한게 맞을까요..?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnAcceptCompleted 코드에서 질문이 있습니다.
1. Action.Invoke(), Func.Invoke() Invoke() 함수가 많이 등장하는데 MSDN을 살펴봐도 딱히 나오는 내용이 없더군요. 느낌상 <T> 제네릭 객체를 반환하는 것 같은데 어떤 기능을 하는지 잘 모르겠습니다. 2. 다형성에 관한 질문 OnAccpetCompleted에서 if (args.SocketError == SocketError.Success) { Session session = _sessionFactory.Invoke(); session.Start(args.AcceptSocket); session.OnConnected(args.AcceptSocket.RemoteEndPoint); } 라는 코드가 있습니다. 여기서 _sessionFactory에 ( ) => { return new GameSession( ) } 람다함수가 들어있습니다. _sessionFactory는 Func<Session> 이므로 람다함수가 반환한 GameSession이 Session 으로 형변환이 될 것 같습니다. 그리고 _sessionFactory.Invoke( )를 하면서 Session 객체를 반환할 것 같습니다. <-- 1번 질문 그런데 여기서 반환된 Session 객체가 OnConnected라는 메소드를 가질 수 있다는게 잘 이해가 안갑니다. _sessionFactory에 람다함수를 연결하는 과정에서 GameSesison이 Session을 형변환을 했으면, GameSession에 Override된 OnConnected를 쓸 수 없는거 아닌가요? 어떤 부분이 틀렸는지 알려주시면 감사하겠습니다.