월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock을 거는 것과 await 키워드를 사용하는 것는 어떤 차이가 있을까요?
제목 그대로 lock과 await의 차이가 궁금합니다. C#에서 제공하는 await 키워드 또한 lock과 비슷한 느낌적인 느낌인데 혹시 차이가 있을까요? lock은 임계구역을 생성해서 보호막을 만드는 느낌이라면 await은 task가 끝날 때까지 잠시 대기 해주는 역할을 하는 것 같은데 먼가 둘의 차이가 정확하게 와닿지가 않아서요! 좀 더 정확하게 잘 이해가 안되는 부분은 "동시 다발적으로 await이 걸려있는 task를 처리한다고 했을 때 어떤 식으로 동작을 할까?"인 것 같아요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener의 동기 와 비동기 간단히 설명하자면..
서버관련해서 처음이라 동기와 비동기를 간단히 정리하면 1. 동기는 유저가 서버에 입장할 때 까지 무조건 기다리는 것이고 2. 비동기는 서버에 유저가 바로 입장한다면 유저가 실행해야할 일(OnAcceptCompleted)을 저희가 실행 시켜주고, 바로 입장하지 않는다면 넘겨버리고 후에 유저가 입장하면 콜백event로 OnAcceptCompleted를 실행 한다고 이해 하면되는지? 무슨 느낌인지는 알겠는데 나중에 혼자 작성해보라고 하면 못할것 같네요... 모바일게임 웹서버(유저 행동 데이터,유저데이터 저장, 랭킹등..)를 혼자 만들 수 있는 실력까지 기르는 것이 목표인데 완벽하게 코드 전체를 공부하고 넘어가는 것이 좋을까요? 아니면 무슨느낌인지만 알고 넘어가도 될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 배리어
앞서서 캐시를 사용하는 이유가 메모리까지 계속 데이터를 나르기가 버겁기 때문이라면 메모리 배리어는 직접 메모리에 적재하거나 적재된 걸 가져오는 거라면, 필요한 부분에만 사용해야 하는 건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
DummyClient.PlayerInfoReq.Write()의 동작 원리 중 질문이 있습니다.
SendBufferHelper를 통해 Open만 해줬을 뿐인데 어떻게 s가 ThreadLocalStorage에 있는 SendBuffer의 _buffer 값에 접근을 할 수 있는지 궁금합니다. 다시 말해 s는 분명 구조체 타입이고, TryWriteBytes로 s에 패킷 데이터를 밀어 넣어준 다음에 SendBufferHelper.Close를 했는데, 어떻게 s의 정보가 ThreadLocalStorage에 있는 SendBuffer의 _buffer에도 남아 있는지 궁금합니다. 디버깅을 찍어보니깐 SendBuffer.Close()가 호출이 될 때, 새롭게 생성한 ArraySegment의 인자로 들어가는 _buffer 값이 s의 값이더라구요. 패킷의 데이터를 실제로 넣은 곳은 s인데 어떻게 ThreadLocalStorage에 있는 SendBuffer의 _buffer 값에도 영향을 주는 것인지.. ArraySegment가 class 타입이면 SendBufferHelper.Open으로 생성한 ArraySegment 를 참조해서 가능하겠거니 이해가 되겠는데 struct 타입이라 도저히 이해가 되지 않아요..ㅠ 어떤 마법과도 같은 일이 있었는지 알려주시면 감사하겠습니다 :D
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener에서 새로운 Session을 생성할때마다 각자 다른 Socket이 할당되는 원리
클라이언트가 접속했을때 Listener에서 session.Start(args.AcceptSocket); 을 통해 Session에 Socket을 주입하는데, new 하는곳이 없는데 어떻게 Socket을 자동으로 생성해서 AcceptSocket에 할당해서 뿌려주는지 알고싶습니다. Listen 함수가 호출된 소켓만이 AcceptAsync에서 응답이 왔을때 초기화 해주는 것일까요? 그리고 args.AcceptSocket = null; 로 밀어주는 이유가 있을까요? 다른건 다 초기화 되는데 이것만 초기화되지 않는 이유가 따로 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 내용 중 질문 있습니다.
강의 내용중 아이템복사 문제에 대하여 Interlocked으로 어떻게 해결이 가능한지 궁금합니다. 지금 까지의 강사님께 배운 지식으로는 Interlocked으로 인벤에 넣고 빼는 것을 처리해도 거래중 서버가 다운되면 아이템 복사가 일어 나는 것 같아 질문드립니다.(함수 전체를 Interlocked 시키는 방법이 있을까 싶어서 도큐먼트를 봐도 없어 질문을 드립니다.) User1 => User2 집행검 거래시 1. 집행검을 User2 인벤에 넣어라 - Interlocked처리 완료 1.1 거래중 서버가 터짐 2. 집행검을 User1인벤에서 삭제 - 서버가 터져서 처리 중단? 결과. User1 ,User2 모두 아이템을 가짐.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unity 실행이 안됩니다..
NetworkManager 에 script를 추가하고 실행을 하면 Unity가 멈춥니다. NetworkManager를 빼고 실행하면 실행이 되는데 뭐가 문제인지 잘 모르겠네요.. 노트북으로 실습하고 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
올려주신 강의에 버그가 있는 것 같습니다.
서버 GameRoom쪽 Enter에 보면 클라이언트 세션리스트에 ADD 해주는 부분이 있습니다. 따라서 500개의 더미세션을 넣게되면 0번부터 500번까지 하나씩 add됩니다. 문제는 sessions를 돌면서 PlayerList패킷 내부의 player리스트에도 세션 수 만큼 담게되는데, 어쨋든 그 이후에 직렬화 해주는 부분에서 list내용을 직렬화 할때 player list수 만큼 offset값이 계속 누적되면서 준비된 버퍼사이즈가 부족하게됩니다. 올려주신 강의는 16byte * 100 만큼 버퍼사이즈를 잡아서 500명까지는 괜찮습니다. 하지만 버퍼사이즈를 줄이거나, span.slice방식을 사용하면 직렬화 도중 크래시가 발생합니다. 우선 버퍼사이즈를 떠나서 계속해서 누적되는 부분 자체가 버그라고 생각되는데 혹시 제가 놓친 부분이 있는건가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 Lock
안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다. ServerCore의 Send부분 입니다. 제가 다음과 같이 이해를 했습니다. Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다. 일단 이렇게 이해하는게 맞는건지 궁금합니다. 만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
BitConverter에서 헷갈리는 부분이 있습니다.
this.playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count)); 부분에서 s.Slice(count, s.Length - count) 범위가 count 번 째에서 배열 끝까지 반환해주는거 같은데 그러면 배열의 남은 범위가 long보다 크면 ToInt64에서 앞에서 부터 long크기 만큼의 배열을 잘라서 반환해주는 건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
왜 8바이트가 나오는지 잘 모르겠습니다.
8:24에서 "ABCD"의 길이는 4인데 바이트 배열로 바꾸면 왜 8바이트가 되는지 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티 파일 저장
3분대에 유니티를 생성하고 저장할때, 저장공간을 MMO_server가 아닌 다른곳에서 저장하면 나중에 작동이 되지 않나요? 제일 궁금한것은 후에 강의도 다 보았는데, 유니티에 코드를 작성하고 실행하려면 서버도 실행해야 한다는 것이었습니다. 둘이 어떻게 연결이 되어있길래 서버에 있는 코딩에 따라서 유니티에 작동되는 것이죠?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
넷 버전 질문드립니다.
프로젝트 생성시 .net core가 없어서 설명란은 동일한 C# 콘솔어플리케이션으로 선택했는데요. 거기서 net 버전 고르는게 있었습니다. 2.1 / 3.1 / 5.0 이렇게 있던데 강의 영상 보니 3.1로 진행중이신거 같은데 5.0으로 해도 문제가 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Task 관련 질문드립니다.
해당 강의에서 ThreadPool을 이용해 쓰레드 수를 지정해서 Task로 작업을 지정해주었는데 만약 ThreadPool로 쓰레드 수를 지정하지 않는다면 Task를 선언할 때 마다 쓰레드가 생성되어 작업을 수행하는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 배리어 질문
질문이 있습니다. 1. 코드가 원래 함수안에서 순차적으로 위에서 아래로 실행되는걸로 알고 있는데 멀티쓰레드 환경에서만 이러한 현상이 생기는 건가요? 2. 쓰레드 실행순서에 궁금합니다. 그 두번째 예제에 쓰레드 t1 쓰레드 t2 를 만들고 t1.start() 먼저 시작하고 그 다음t2.start()하면 쓰레드 t1이 A()함수 실행 다하고 쓰레드 t2가 B()함수를 실행하는 방식인가요? 아님 동시에 실행되는 방식인가요? 만약 동시에 실행되면 꼬이지 않을까요? a함수는_answer=123을 넣고 b함수는 _complete를 체크하면 b함수는 _answer을 출력못하는데 제가 잘못 이해하고 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WRITER_MASK로 원하는 값을 구분 가능한 이유가 스레드ID가 15bit로 표현할 수 있는 값보다 작아서 인가요?
첫번째로 쓰레드ID가 생성 순서대로 1 2 이런 식으로 붙혀지는 것인지 궁금합니다. 이것이 아니라면 어떤 규칙에 의해 ID가 생성되는지는 os나 사용 언어(C#, C++등)에 따라 달라지는 건가요? 두번째는 상식적으로 쓰레드개수가 1000개 10000개(이럴 일이 있을까요?)여도 15bit로 표현 가능한 수보다 ID값이 작기 때문에 MASK와 쉬프트 연산자로 계산 가능한 게 맞는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문이 있습니다
서버 Unhandled exception. System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at System.Collections.Generic.List`1.Enumerator.MoveNext() at ServerCore.Session.send(List`1 list) in C:\Users\bekna\source\repos\Server\ServerCore\Session.cs:line 91 at Server.GameRoom.Flush() in C:\Users\bekna\source\repos\Server\Server\GameRoom.cs:line 45 at Server.Program.<>c.<Main>b__2_1() in C:\Users\bekna\source\repos\Server\Server\Program.cs:line 29 at ServerCore.JobQueue.Flush() in C:\Users\bekna\source\repos\Server\ServerCore\JobQueue.cs:line 51 at ServerCore.JobQueue.Push(Action job) in C:\Users\bekna\source\repos\Server\ServerCore\JobQueue.cs:line 28 at Server.GameRoom.Push(Action job) in C:\Users\bekna\source\repos\Server\Server\GameRoom.cs:line 38 at Server.Program.Main(String[] args) in C:\Users\bekna\source\repos\Server\Server\Program.cs:line 29 클라이언트 System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at DummyClient.SessionManager.SendForEach() in C:\Users\bekna\source\repos\Server\DummyClient\SessionManager.cs:line 24 at DummyClient.Program.Main(String[] args) in C:\Users\bekna\source\repos\Server\DummyClient\Program.cs:line 29 패킷 모아보내기 강의를 보고있고 프로그램을 실행하면 이런 예외가 뜨던데 혹시 이게 무슨 예외일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
더미클라방식 말고 단일클라에서 서버세션관리
혹시 일반적으로 단일 클라방식에서도 서버세션을 리스트로 두는 경우가 있나요? 현재는 더미클라이언트 방식으로 하려고 클라쪽에서도 서버세션을 리스트로 두어서 관리하고 있는거 같은데
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
전체적인 알고리즘의 이해가 좀 어렵습니다..
Listener 클래스에서 SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); 1) 위의 두 줄의 코드가 정확히 어떤 것을 의미하는지 잘 모르겠습니다. args.Completed로 OnAcceptCompleted를 실행하고 RegisterAccept(args)도 또 실행해주는 건지.. 2) 그리고 pending이 true일 경우에는 RegisterAccept를 빠져나온 다음 다시 Init함수를 실행하기 때문에 위의 두 줄의 코드를 실행할 수 있게 되는 것이 맞는 이해일까요? 3) 마지막으로 Async가 있는 코드는 bool pending = _listenSocket.AcceptAsync(args); 이 코드밖에 없어서 pending이 참인지 거짓인지 판별만 가능할텐데, 어떻게 Async 함수를 통해 비동기적인 실행을 할 수 있는 것인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
도와주세요....
혹시 어디 이상한 부분이라도 있나요? 왜 이러죠....? 참고로 중간에 있는 사진은 GenPacket.bat을 관리자 권한으로 실행시키니까 뜬 창이에요