월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[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는 소켓 통신과 다르다고 하는걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
에러도 안떠요..
루키스님 코드 받아서 그대로 실행해도 이렇게 됩니다 ㅜㅠ 왜 이러는 걸까요..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
여기 에서 이후에서 궁금 한것이 많아서 질문 드려요
1. 이동 등등 까지 해서 너무 좋은거같아요 이 이후에는 패킷 추가 하고 하는 방식으로 무기 선택 공격 피격 같은건서버에서 players list 에서 좌표 가지고 와서 피격 처리후 클라로 보내주는건가요? 아니면 클라에서 나 맞았어 라고 서버로 보내서 서버에선 Broadcast만 해주는건가요 ? 2. 또 강의 중에 들었던 프로토콜 버퍼 나 플랫 버퍼 같은 라이브러리를 이용해서 만들수도 있다고 하셧는데 지금 코드에서 수정 해서 만들어 봐도 될까요? 3. 지금은 서버 이긴한데 자체 컴퓨터 안에서만 돌아가는거 같아요. 노트북이나 쓰고있는 pc ip를 그냥 넣어서 다른 pc에서 접속으로 해도 될까요 수정이 많이 필요한가요?? 따로 강의는 없는거같아서 혼자 해보려고 해요.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
lock문에 대한 질문입니다.
강의 13분경에 나온 내용을 보고number라는 변수에 대해 접근하는 권한으로써 새 오브젝트 _obj를 만들어 사용했으니 _obj 자체를 number에서 캐스팅해 받아오는 것은 어떨까 하고 시도해 봤고(static object _obj = number;)해당 코드 자체는 성공적으로 동작했습니다. 이런 방식으로 어떤 변수, struct, Class를 캐스팅해서 받는 object를 이용한 lock문은 어떤가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의내용의 블로그 업로드 가능여부
해당 강의를 잘 보고 있는 한 수강자입니다! 해당 강의의 내용을 개인 블로그에 업로드하는 행위가 가능할까요? 가능하다면 소스코드 공개가능여부등 기준을 알려주시면 감사하겠습니다!!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
19:30 즈음에 나온 ref에 대한 질문입니다.
해당 함수를 보다 이해가 안돼서 질문합니다. Interlocked.Increment(ref int location);과 같이 참조해서 값을 사용하고 원자성을 보장해야한다는 이야기를 하시다가 ref 없이 쓰면 안된다고 말 하시는데 애초에 Interlocked의 메소드에서 받는 매개변수 중에서 실질적으로 값에 변화를 줘야하는 매개변수인 location들(대부분의 함수에서 ref T location 혹은 ref T location1, ref T location2 처럼 정의돼있었습니다.) 중에서 참조형으로 넘겨주지 않는 메소드가 존재할 수 있나요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadPool에서의 Join
Thread를 만들어서 사용하는 것 처럼 ThreadPool이나 Task에 어떠한 일들을 던져두고 이후 Main이나 다른 쓰레드에서 해당 일이 끝났는지, 어떤 상황인지 알 수 있는 쉬운 방법(혹은 많이 쓰이는 방법)이 있을까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CS의 특성에 관한 ThreadPool의 질문입니다.
ThreadPool의 레퍼런스를 까보니 Static Class 로 정의되어있는 것을 봤습니다.ThreadPool이 메모리에 올라가는 시기는 언제인가요? 해당 타이밍을 조절할 방법이 있나요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
평소에 맥OS에서 VScode를 사용하는 학생입니다.
1. 운영체제가 다른 부분이 학습에 문제가 있을 수 있을까요?2. VS가 아닌 VScode를 사용하여 진행할 방법이 있을까요? 1번 질문에 대한 문제가 없다면 일단 맥북에 VS를 깔아서 사용할 생각입니다.