월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IPEndPoint와 listenSocket
지금은 서버와 클라 양쪽에서 IPHostEntry, IPAddress등을 사용해서 IPEndPoint를 만들고 이를 연결하는 식으로 사용하고 있는데1) EndPoint가 상대의 주소와 포트를 설정하여 목적지?를 설정한다고 봐도 되나요?1-1) 만약 그렇다면 지금은 컴퓨터 하나로 시험해야 하기에 같은 주소를 사용하므로 IPEndPoint를 만들어서 사용하고 있지만, 실제는 서버에서는 스스로의 주소를 넣어주고, 클라는 알고있는 서버의 주소/포트를 사용해 연결 요청을 했을때 서버가 캐치 하면서 클라의 주소를 받아서 연결이 되는거...겟죠?1-2) 그때 리스너에서 Socket.RemoteEndPoint을 사용해 클라의 주소를 추출하나요? 1-3) _onAcceptHandler.Invoke(args.AcceptSocket);이 부분에서 Accept된 Socket을 가져와서, 새로 클라의 소켓을 만들어줄 필요없이 이미 (질문1-2)와 같은 일을 하고있는 걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
준비상태->실행상태 이동 시 레지스터와 캐시 상태 질문
CPU타임을 할당받아 준비상태에서 깨어나게 될 시, PCB에 있는 정보를 레지스터에 저장한다고 말씀해주셨는데요, 캐시 상태에 대해서도 궁금해서 질문드립니다. 스레드 혹은 프로세스 전환을 하게 되면 이전의 cache 정보는 필요가 없으니 flush 될 것 같은데요, 구글링과 스택 오버 플로우를 통해 정보를 얻고 아래 질문들을 하고 싶어졌습니다. 이정돈 알아서 해라! 싶은 질문은 넘겨주세요. 1. 상태 전이 시, cache가 clear되나요(memory mapping을 어떻게 하느냐에 따라 하지 않을수도 있을것 같은데, 하지 않는 mapping방식이 실제로 쓰는가 혹은 이론상 그런것이냐도 의문입니다)? 2. 그렇다면, 실행->대기, 대기->준비, 실행->준비 3가지 이동 중 어떤 단계에서 flush가 일어나나요? 3. 문맥 교환 시에는 memory mapping이 초기화 되고 바뀔텐데요, memory mapping이 바뀌지 않는 경우도 있을까요? (memory mapping 을 어떻게 하느냐에 따라 다를것 같기는 한데,,, 수업 들을 때 memory mapping을 어떻게 하는지에 대한 방법론?을 배우고 종류나 그에 따른 trade-off를 배우지 않아 확실하게 알고 있지는 않습니다.) 4. 아래 사이트를 참고했을 때, [Architecture] MMU improvements (tistory.com) 가장 빠른 방법이 Cache-Indexed, Virtually-tagged cache방식을 사용하는 것이고, 이를 위해서는 캐시 용량을 증대시켜야 한다고 이해했습니다. 이번 라이젠 5000번대의 성능이 비약적으로 증가한 이유가 cache 용량이 2배가 뻥튀기 돼서 위와 같이 cache를 더 잘 활용해서 라고 이해하면 될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티 엔진 스크립트 정책?
이번 강의에서는 유니티 정책에 맞게 패킷을 작성하는 파일들이 바뀐 것인가요? 이 부분을 기존의 Server, DummyClient도 바꿔주지 않으면 실행 시 유니티 엔진에서 아무런 메시지가 출력되지 않나요? 유니티 Assets/Script만 다운로드 받아서 넣었더니 DummyClient와 Server 사이에는 잘 메시지가 출력되었는데 유니티 엔진에서는 메시지가 출력되지 않았습니다. 그런데 DummyClient와 Server 코드도 다운로드받아서 실행했더니 이번엔 유니티 엔진에서 잘 출력되었습니다. 유니티 엔진 내의 스크립트뿐만 아니라 Server, DummyClient도 고쳐주어야 하는건지, 아니면 제가 이전에 코드를 잘못 작성한 부분이 있었던건지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 정리 포스팅 관련 문의
열심히 들으며 part3개를 해치우고 어느덧 part4에 왔는데요,, 복습겸 수업에서 중요했던 것들을 다시 정리해서 티스토리에 올리려고 합니다. 이미 몇 개는 미처 생각을 못하고 올려버렸습니다. 앞으로도 조금씩 적어서 올리려고 하는데요, 그 전에 먼저 허락을 받으려 합니다. 코드의 경우에는 거의 올리지 않으려 하고, 줄 글 정도로 해당 챕터의 내용을 정리하려 합니다. 글을 올려도 될까요? 안된다고 하신다면 티스토리에 현재 올라간 내용들은 보는 즉시 삭제하도록 하겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
제가 맞게 이해한건지 싶어 질문드립니다
int original = Interlocked.Exchange(ref isLocked, 1);original 이란 변수에 ref isLocked의 원본 값을 반환해줌과 동시에isLocked 참조값을 1로 바꾸다 라고해석했는데 맞게 해석한걸까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
가시성이라는게
가시성이라는게 사람?코드?의 가시성이 아니라 메모리간의 가시성이라고 이해하는게 맞나요? 그 직원(메모리)들이 잘 볼수있도록 전광판을 업데이트 하는 메모리들간의 가시성?이 맞나요? 어렵네용ㅎㅎ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRead에서 DataSize보다 크다면 false를 뱉어 내는데 그전에 한번더 검사하는 이유를 알고 싶습니다.
감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
세션패킷과,버퍼 질문
//최소한 헤더는 파싱(데이터를 읽을수 있는지)할 수 있는지 확인 if (buffer.Count < HeaderSize) break; // 패킷이 완전체로 도착했는지 확인 ushort dataSize = BitConverter.ToUInt16(buffer.Array, buffer.Offset); if (buffer.Count < dataSize) break; 1. 최소한의 해더파싱은 Packet클래스의 size 는 2byte인데 완전체는 Packet클래스의 size,packet 4byte를 말하는게 아닌가요? 그럼 int로 받아야하는데 왜 ushort로 받나요? 2. 버퍼 카운터는 byte의 크기를 말하는건가요? 3. ArraySegment<byte> openSegment = SendBufferHelper.Open(4096); byte[] buffer = BitConverter.GetBytes(packet.size); byte[]buffer2 = BitConverter.GetBytes(packet.packetId); Array.Copy(buffer, 0, openSegment.Array, openSegment.Offset, buffer.Length); Array.Copy(buffer2, 0, openSegment.Array, openSegment.Offset + buffer.Length, buffer2.Length); ArraySegment<byte> sendBuff = SendBufferHelper.Close(packet.size); 코드 흐름이 이해가 안가네요 쉽게 설명해주실수 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
a connect request was made on an already connected socket 예외가 발생합니다.
Connector를 만들면서 a connect request was made on an already connected socket 예외를 뱉어 내는데 제가 어느 부분은 살펴봐야 하나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
비동기와 관련해서 궁금한점이 있습니다.
비동기 함수를 호출하면 다른 스레드에 의해 해당 코드가 실행되는 것으로 알고있습니다. 그런데 만약 main 스레드 쪽에서 다음과 같이 int ret = 비동기함수(); 이때, 비동기 함수가 반환한 값을 ret 변수에 넣어주는 행위는 main 스레드에서 해줘야 되는게 아닌가요 ? 그렇다면 main 스레드는 더 이상 진행하지 못하고 ret 에서 기다려야 되는게 맞는거 같은데... 다른 스레드에서 비동기 함수 처리 후 ret 변수에 넣어주는 거 까지 처리를 해주는건가요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
네트워크 프로그래밍, 이벤트 드리븐 방식에 관해서 궁금한점이 있어서 질문드립니다.
안녕하세요. 강사님. 잡큐에 대해 학습을 진행하면서 문득 궁금한점이 생겼습니다. (마치 GUI 프로그램이나 자바스크립트의 이벤트같은..) 평소에도 많이 궁금했던 점인데 마우스로 특정한 버튼을 클릭하면 콜백으로 특정한 함수들이 호출되는 구조가 많은데... 마우스로 특정한 버튼을 클릭하는 순간 잡큐와 비슷한 개념으로 이벤트큐(?)라고 하는 큐 스택에 이벤트가 들어가고 해당 이벤트를 순차적으로 호출하면서 특정 콜백이 실행되는 구조가 맞는지요 ?? 왠지 잡큐를 학습하면서 이벤트로 처리하는 방식에 대해서 자꾸 생각이 나서요...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
_pendingList 와 lock 질문
void RegisterSend() { // // a[][][][][][][][][][][][][][][][] while (_sendQueue.Count > 0) { byte[] buff = _sendQueue.Dequeue(); _pendingList.Add(new ArraySegment<byte>(buff, 0, buff.Length)); } _sendArgs.BufferList = _pendingList; bool pending = _socket.SendAsync(_sendArgs); if (pending == false) OnSendCompleted(null, _sendArgs); } 1. _sendQueue.Count > 0 말고 바로 _sendArgs.BufferList .Count > 0 로 하는게 좋지 않나요 굳이 따로 만들어서 담는 이유가 있나요? _sendArgs.BufferList = _pendingList; ---------------------------------------------------------- public void Send(byte[] sendBuff) { lock (_lock) { _sendQueue.Enqueue(sendBuff); if (_pendingList.Count == 0) RegisterSend(); } } 2. c#에서 같은 쓰레드인 경우는 락을 무시하고 들어갈수 있는게 맞나요?? 3. 지금 코드는 멀티쓰레드 기준으로 만들었는데 실행은 싱글쓰레드로 작동하나요? Thread를 따로 만들지 않고 실행하는데.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
프로젝트마다 패킷을 개별적으로 생성해주는 이유가 무엇인가요?
안녕하세요. 우선 좋은 강의 감사드립니다! 이 강의를 보면서 정말 많은 공부가 되었습니다 :) -------- Listener, Connector를 ServerCore에 작성하고 클라이언트, 서버에서 이를 참조하여 사용하듯 패킷도 하나의 프로젝트에 정의하고 클라이언트와 서버에서 참조하는 것은 어떤가요? 그렇게 하지 않고 프로젝트마다 개별적으로 생성해주는 이유가 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이건 컴퓨터 성능 때문일까요?
안녕하세요, 선생님 c# 게임 서버 강의를 수강하다가 선생님과 다르게 작동하는 부분이 있어서 질문드립니다 6번째 강의인 컴파일러 최적화 강의에서 코드를 실행하면 4:25초경에 쓰레드 시작! 쓰레드 종료! Stop 호출 종료 대기중 종료 성공 이 순서대로 선생님은 실행이 되는데요, 저는 쓰레드 시작! Stop 호출 종료 대기중 쓰레드 종료! 종료 성공 순서로 쓰레드 종료!가 더 늦게 뜨네요 강의에서처럼 _stop에 volatile을 붙이면 선생님이랑 같은 값이 나오긴 하는데 컴퓨터 성능 차이 때문일 수 있나요? 코드가 다른 부분은 없습니다. 몇 번이고 확인했어요 감사합니다!
- 미해결[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 모두 아이템을 가짐.