월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WSAEventSelectModel 질문 있습니다.
안녕하세요, Client Socket과 이벤트를 select 하실때 FD_READ | FD_WRITE | FD_CLOSE 3가지를 동시에 바인딩하시는 이유가 궁금합니다강의중 언급하신 'TCP 논 블로킹 소켓에서, 데이터를가 분할되서 송신될 수 있다. 하지만 웬만하면 일어나지 않는다.'의 상황에 대응하기 위하여 send 함수 호출 시 각 인자를 수정하셨는데, FD_WRITE는, 만약 위와 같은 상황이 발생했을때, 다음 프레임에서 이벤트를 감지하기 위함이신지, 만약, 위와 같은 데이터 분할 송신이 절대 일어나지 않는경우라고 가정하면 FD_READ | FD_CLOSE 2개의 플래그만으로도 목표하신 에코서버 구현이 가능할것인지이 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LNK2001 링크에러
릴리즈로 할 때만 이런 링크에러가 납니다.이런식으로 무시를 해봐도 안 되고런타임 라이브러리를 다중스레드(DLL/MD)로 변경도 해보았는데 해결이 안 되네요.. C++버전은 17로 했습니다.혹시 이에대한 해결방안이 있을까요? 구글링을 해봐도 해결방안이 나오지 않아서 질문을 드립니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IocpEvent에서 OVERLAPPED 상속받고 가상 함수를 선언했을 때
IocpEvent에서 OVERLAPPED 상속 받고 가상 함수를 선언했을 때 OVERLAPPED가 주소의 맨 처음으로 가고 그다음이 가상 함수 테이블이 오지 않나요?만약 OVERLAPPED를 상속받지 않고 최상단에 선언한 경우라면 가상 함수가 맨 처음 주소이지만, 상속받은 경우에는 제가 테스트해 본 바로는 OVERLAPPED가 맨 처음 주소로 오는 것 같아서 질문드립니다!만약 위처럼 OVERLAPPED를 상속받았을 때 맨 처음 주소에 오더라도 가상 함수 테이블 때문에 문제가 생길 수 있는 것일까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CorePch.h 파일에서 헤더파일 선언 질문
CorePch.h에 CoreMacro.h를 선언하면 왜 그 아래에 있는 모든 라이브러리가 다 무시 되는건가요? 강사님께서는 안 쓰셨고 제가 궁금해서 써봤는데 오류가 나서 질문드립니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수신 스레드 분산 질문이 있습니다.
안녕하세요 강사님. 수신 스레드 분산 관련 질문이 있습니다.제가 배운 바에 의하면 송수신 속도 차이의 원인으로 다양한 걸 뽑을 수 있지만 의심해봐야 할 것은 '수신이 송신 속도를 따라잡지 못할 경우' 라고 알고있는데요. 저는 클라 입장에서 서버로부터 받는 recv가 쌓일 경우를 생각해보았습니다. 클라는 서버이외에도 렌더링이라던가 여러가지 상호작용의 일감을 처리해야 하니까 일 자체가 많아서 서버로부터의 recv가 쌓일수도 있지 않을까? 라는 의문점때문에요! 그래서 클라에서는 완료된 recv를 메인스레드에서 바로 받고 처리하는게 아닌 공용 메모리 큐에다가 일감을 넣어주고.해당 공용 메모리 큐를 무한루프로 감시하는 스레드를 별도로 두었습니다. 다만, 해당 스레드는 그 일감 자체를 스레드 내부에서 처리하지는 않고 다시 메인스레드의 해당 일감처리 함수를 호출해주는 방식입니다. 제가 의도했던건 IOCP모델에서 CP큐에 담겨져있는걸 최대한 빨리 빼오자 의도이지만, 사실 메인스레드에서 일처리 자체의 타이밍을 나중으로 미루는것이라서 조삼모사인 구조인가 의문이 들어 질문드립니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
node 안에 있는 data 타입을 shared_ptr 로 하는 이유?
제 생각에는 락프리 스택 만들 때도 그렇고 이번 강의 큐도 그렇고 노드 안에 있는 data 타입을 그냥 T data 라고 해도 될 것 같은데 굳이 shared_ptr로 하는 이유가 있을 까요?shared_ptr 로 하면 메모리 비용과 시간 비용이 더 드는것으로 알고있는데요! 별 이유는 없을까요
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문있습니다
안녕하세요! 강의 내용 복기중에 몇가지 의문점이 생겨 질문드립니다! 서비스에서 MaxSessionCount, SessionCount의미 -> 제가 이해한거로는 클라가 한명 연동 될 때마다 SessionCount가 1씩 증가하고 MaxSessionCount는 최대 허용 접속 수라고 이해하고 있는데 맞는지 궁금합니다.-> 이게 맞다면 한계치는 어느정도로 정하고 기준은 무엇인지 궁합니다. 리스너에서 AcceptEvent N개 사용의 의미-> StartAccept 부분에서 5개 만들고서 그거를 각각 Register에 등록했다는 말은... 동접 5명을 받을 수 있다는 의미인가요? -> 만약 동접 의미로의 N개 사용이라면 포폴 수준에서는 1개만 사용해도 무방한가요? 테스트해보니까 패킷 전송 속도에는 별 차이가 없어보여서요! C++ 서버 & 유니티 클라 연동 ? -> 패킷 정보가 Proto가 중간 역할 해주고 있고 직렬화 하면서 결국 정수로 데이터 핑퐁이라고 이해되고있는데 이게 맞다면 저런 관계의 연동에도 문제가 없나요? 이제 강의 막바지가 되어가고 복기를 쭉 해나가면서 질문들이 계속 나올것 같은데 지금처럼 커뮤니티 게시판에 질문드리면 될까요? 아니면 따로 질문 올리는 곳이 있을까요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문있습니다!
안녕하세요 루키스님.흐름을 이해하던 중에 이해가 안가는 부분이 있어서 질문드립니다. Accept부분에서 다음 그림의 순서로 흐름을 이해를 했는데이해가 안되는건Listner의 ProcessAccept부분에서session 가져와서 그 안의 소켓, 네트워크정보 업뎃해놓고그 다음 실행 부분인 RegisterAccept에서새로운 session으로 밀어넣으면 ProcessAccept부분에서 업데이트 했던 정보들이 다 날아가는것 아닌가 라는 의문점이 생겼습니다!! 제가 이해한게 맞다면 이 흐름대로 해버리면RegisterAccept에서 작업했던 session의 소켓 정보, 네트워크 정보는 다 날라가고 새로운 session으로 등록해버린거 아닌가요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
단순 궁금증) 멀티쓰레드가 아니라 싱글 쓰레드라면 sendQueue에 1개만 쌓이나요?
안녕하세요 루키스님단순히 제가 잘 이해하고 있는건지 궁금해서 여쭤보고자 합니다만약 멀티쓰레드가 아니라 싱글쓰레드라면 sendQueue에 1개 이상 쌓이지 않나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하십니까 언리얼 엔진과 자체제작 서버와의 연동에 있어 궁금한점이 있어 글 작성합니다.
제가 수업을 통해 자체제작 iocp서버를 제작한 상황에서 언리얼 클라이언트와 연동하는 상황에서 제가 제 노트북에서 서버를 열고 클라를 접속하는 부분에서는 문제가 발생하지 않으나, 제 노트북에서 서버를 열고 다른 노트북에서 ip와 포트번호를 활용해 접속하니 접속은 되나 중간중간 잘못된 패킷을 보내는 등 접속이 끊기는 상황도 발생하고 있습니다. 혹시 언리얼에서 외부에 접속을 할 시 따로 설정해야하는 것등이 있는 건지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Sleep_for질문입니다.
12:00부분에서 작성하신 예제들을 따라치며 CPU점유율을 확인을 해보니 sleep_for을 쓰면 10언저리로 나오는데 Producer에서 sleep_for만없이 실행을 하면 CPU점유율이 0~2사이로 나옵니다. 영상에서 설명을 들으면 Consumer에서 무한루프로 체크하는것 때매 CPU점유율을 먹는다 라고 했는데 그렇다면 sleep_for도 없이도 점유율이 10언저리로 안나오는 이유가 뭔가요? 혹시 sleep_for로 인해 수면상태가 되어 Consumer스레드로 컨텍스트스위칭이 발생하여서 그로인한 오버헤드때매 CPU점유율이 증가했다라고 이해하면 되는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
char8_t 관련 protobuf 질문
google Protobuf에서 한글을 보낼때는 utf8 형식으로 보내야하는 걸로 알고 있습니다. 그래서 u8을 앞에 붙여서 set_name()에 인자를 넣은거구요. 근데 C++언어 표준을 latest 로 해놓고 하면 google protobuf 쪽에서 char8_t 를 지원을 안해주어 컴파일에서 걸렸습니다..C++ latest 로 지정하고 u8을 하면 문자열이 const char8_t 로 변환되더라구요. 이전 C++ 17 이전으로는 u8을 해도 const char로 변환되었습니다. 그래서 기존에는 컴파일타임에 걸리지 않고 실행이 된것 같습니다.그래서이렇게 u8을 쓰지 않고 converter 를 통해 utf8 로 변환 후 패킷을 보냈습니다.이렇게 하니까 한글이 정상 출력이 되는 걸 확인했습니다..이런 방식도 나쁘지 않은 방식인가요...?제가 의심을 하는 이유는 codecvt_utf이 deprecated 된 것인데 경고를 무시하는 코드를 넣고 실행을 돌리기 때문입니다.C++ latest 에서 사용하기 위해서는 제가 생각한 최선의 방법이었습니다.좋은 방법이 있을까요
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
World Update Packet 처리
안녕하세요 강의 잘 보고 있습니다!!다름이 아니라 IOCP를 이용하여 언리얼 클라이언트와 연동을 하고 있는데 패킷을 보내는데 의문이 들어서 이렇게 질문을 남깁니다. 클라이언트 코드에서는 타이머를 이용하여 초당 60개의 패킷을 서버로 전송합니다.(서버에 접속이 성공적인 경우에 한해서) 그후 서버에서는 작업자스레드에서 모든 입출력을 처리를 하게 되는데, 만약 클라이언트 수가 많아지면 그만큼 서버에서 모든 클라이언트의 초당 패킷을 처리하게 되므로 과부하가 심해질 것으로 예상이 됩니다. 이에 따라 PQCS함수를 이용하여 저가 자체적으로 UPDATE이벤트를 넣어주어 처리를 하려고 했는데 생각한것처럼 잘 되지가 않아서요.. 아니면 그냥 서버에서 UPDATE쓰레드를 따로 구분지어서 클라이언트에게 브로드캐스트를 하는것이 방법일까요? 어떤 것이 좋을지 감이 안잡혀서 이렇게 질문남깁니다!!
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Variadic 함수 인자 포워딩 관련
수업의 JobSerialize::PushJob() 함수에서, template<typename T, typename Ret, typename.. Args>void PushJob(Ret(T::*memFunc)(Args...), Args... args){.... std::forward<Args>(args...)} 이 부분에서PushJob() 인자 중 Args&&... 가 아닌 Args... 로 &&을 생략해도 포워딩이 정상적으로 진행이 되는 건지 궁금합니다. 구글링을 해 보니 전부 Args&&... 형태로 쓰는 것으로 보여서요. 가변 템플릿 문법은 언제나 굉장히 헷갈리네요.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
콜백 방식에 비해 이벤트 방식의 단점?이 와닿지 않습니다
콜백 방식에 비해 이벤트 방식의 단점?이 와닿지 않아서 질문 남깁니다. 아마 제가 대규모 유저를 받는 환경의 코드를 아직 보지 못해서 그런 것 같아서 와닿지 않은것 같습니다. 설명해주신 내용은 클라 소켓 하나당 이벤트 하나를 대응시켜야 하는데 64개까지 제한이고, 여러명을 받는 서버의 코드는 코드가 간단하지 않다는 점을 단점으로 꼽으셨는데 와닿지 않습니다.정말 이벤트를 64개 넘게 관찰해야 하는 상황이 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
event관련 질문입니다.
저렇게 SetEvent를 주석을 달고 했을때 무한 대기상태로 들어가는건 이해가 됬습니다. 저상태에선 브레이크 포인트를 잡는다던가, 디버그 행동을 할 수가 없나요?? 저는 현재 WaitForSingleobject가 쓰레드 함수가 끝날때까지 대기 하는것으로 이해하고 있습니다. 쓰레드 함수가 정상적으로 끝나는게 아닌, 외부 함수에 의해서 강제강료 했을때 무한대기 하는 상태가 발생하는데, SetEvent를 호출하지않고 강제종료되는 경우를 고려할수있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
google Protobuf 관련 메모리 릭
CrtDumpMemoryLeaks(); 함수 호출을 통해 메모리 릭을 검사했는데 강사님의 코드에서는 다 잘 지우는 것 같아서 강사님 코드에서의 릭은 아닌것 같습니다.. 강사님 코드에서 객체 생성을 다 막고 디버깅해도 똑같은 메모리 릭이 남았습니다.. google protobuf 에서의 릭인 것 같은데.. pb.h pb.cc 는 건들지 못하니 고칠 방법도 없고 해서 이렇게 질문 올립니다. 저 메모리 릭을 해결하는 방법이 있을 까요..?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Win32API 클라이언트 연동
강의에서는 서버에서 정해진 데이터(id, hp, 공격력)를클라쪽으로 broadCast 하고,클라에서는 Recv만 하고 있는데, 클라쪽에서도 Send하고서버에서 Recv하는 echo방식으로는어떻게 수정해봐야할까요..? ㅠ 목적은 Win32APi로 만든 클라이언트 2~3개정도 켜서 PacketHandler까지 구현된 Server와 붙혀서 이동동기화 부터 시도하고 있습니다그래서 클라이언트 1개에서 만약 이동했다면 그 행동이서버랑 다른 클라이언트에도 똑같이 보이게하고 싶습니다ClientPacketHandler에 ServerPacketHandler의 Make_S_TEST 함수를 복붙하고GameServer의 방법과 같이 BroadCast를 해야할지 아니면 Send함수를 따로 구현해야 할지 방향을 못잡겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterRecv() 함수에서
WSABUF wsaBuf; ::WSARecv(_socket, &wsabuf, ...);위 코드에서 WSABUF 타입 객체를 스택에 생성에서 WSARecv() 함수에 넘기면 이 함수가 바로 완료되지 않고, 나중에 완료 통지로 받는다면 스택에 생성된 WSABUF는 그전에 해제되서 잘못된 메모리에 쓰게 되는 게 아닌가요?또 이런 api들을 호출할 때 넘길 파라미터를 스택에 생성할 지 new 로 힙에 생성할 지 기준은 어떻게 정하시는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에 ServerCore를 복사 시, #include 안될 때
포트폴리오 작업하고 있는데, 클라이언트를 PacketHandler까지 작업 완료된 서버랑 연동해보려고 합니다~ ClientServiceRef service = MakeShared<ClientService>(NetAddress(L"127.0.0.1", 7777),MakeShared<IocpCore>(),MakeShared<ServerSession>, // TODO : SessionManager 등1); 클라이언트쪽에서 위와 같은 코드로 서버와 연결하기 위해 ServerCore 라이브러리를 통쨰로 클라이언트쪽으로 가져와야 하는데... 비쥬얼 스튜디오 2022에서파일 --> 추가 --> 기존 프로젝트 메뉴 이 기능으로 ServerCore 프로젝트를클라이언트 솔루션에 복사 하고,파일탐색기에서도 ServerCore 폴더를 클라이언트쪽에 통쨰로 옮겼는데도#include가 안되고 있는데, 방법을 알 수 있을까요?? 클라이언트 솔루션에 ServerCore 프로젝트 추가완료 GameProjcet .cpp소스에서 ServerCore 쪽 파일들 인클루드 시도했으나 에러발생