묻고 답해요
130만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRecvPacket에 PacketSessionRef를 넘겨줄 때
안녕하세요OnRecvPacket 함수 내부에서 HandlePacket 함수의 파라미터로 PacketSessionRef 타입 파라미터를 넘겨줄 때 왜 PacketSessionRef의 생성자를 호출해서 추가로 만든 객체를 넘겨주는지 궁금합니다.이 부분이 혹시 shared_from_this를 활용해서 PacketSession으로 캐스팅해서 객체 본인을 넘겨줘야 하는게 아닌지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티스레드 Job처리
제가 경험했던 환경에서는네트워크스레드(N) -> MessageQueue -> 메인스레드(1)사실상 메인로직이 싱글 스레드였습니다.그렇다 보니 Queue에 들어오는 순서대로 메인스레드에서 처리했고, 느릴수도 있었겠지만 순서는 확실하게 보장이 되었습니다 그런데 현재 구조상네트워크스레드(N) -> JobQ 메인로직(N)으로 진행되거나네트워크스레드(N, timeLimit제한) -> GlobalQ 메인로직 (N) 으로 진행되다보니 궁금한게 생겼는데요첫번째 궁금한점은패킷이 ABC 순서로 왔을때,AC는 JobQ1B는 JobQ2을 수행한다고 가정하고A, B, C를 각각 네트워크 스레드 1,2,3가 받았다면스레드1가 A(수행시간1초)를 처리하는스레드2는 B(수행시간3초)를 처리하고,스레드3은 C(수행시간1초)를 Push만 한다고 하였을때B가 먼저 들어왔지만처리시간이 늦어 C패킷보다 답장을 늦게 보내는 상황이 발생할것 같은데요,(시간이 1초 3초까진 아니겠지만 컴퓨터 입장에서는 충분히 코드의 짧은차이로도 발생 할 수 있는 경우라고 가정했을때)과정에서 B처리중 죽어있으면 클리어가 안된다거나 하는 조건이 있고, B가 먼저 수행 되었지만 C처리가 먼저 끝나버려서 B의 결과가 바뀌는 경우는 어떻게 처리를 하면 좋을지 궁금합니다.(꼭 이런 1개의 처리속도가 아니더라도, JobQ1의 작업 전부다 소모되는시간이 JobQ2의 작업 몇개를 수행하는것보다 빠르다면, 충분히 이런상황이 발생할 수 있다고 생각합니다)다른 예시로 JobQ1에는 어마어마한 양의 일감이 쌓여있는상태에서 A가추가가 되고,JobQ2에는 아무것도 없을때 B가 바로 실행이 될텐데, 이경우에도 A가 먼저 패킷이 도달했지만 B에 비해 아주 오랜 뒤에 처리가 될수 있을것 같다고 생각해서 이런경우 클라 입장에서는 분명 먼저 요청을 했는데 버그가 발생했다고 느낄수도 있다고 생각해서 질문드립니다. 두번째로 궁금한점은Part4 과정이 거의 끝나가고 있어서 질문드리는 것인데요,제가 메인스레드가 1개인것만 해봐서 멀티스레드를 어떻게 인게임컨텐츠에서 사용해야할지 감이 안잡혀서,멀티스레드로 인게임 컨텐츠 부분의 객체를 접근할때, 락을 사용하는 예제가 있는 강의가 있는지 궁금합니다.이과정이 끝나면 Part5를 바로 이어서 할예정입니다. 감사합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IocpEvent는 메모리 해제될 일이 없나요?
안녕하세요IocpObject가 지워지지 않게 Ref Count 처리해주는 부분을 보고, IocpEvent는 지워질 일이 없는지 궁금합니다. 어차피 Session의 멤버로 들고 있으니 Session이 지워지지 않는다면 IocpEvent는 절대 지워질 일이 없는걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
atomic 스마트포인터에 대해서궁금합니다.
밑에 질문들을 읽고 궁금한것이 있습니다.스마트포인터를 사용하면 refcount에 대해서는 스레드세이프가 이제 구조상 보장이 되지만 set부분이나 치환하는 부분에 대해서는 아직 완전 보장이 안되어 atomic 스마트포인터를 활용하거나 lock을 건다고 하셨는데 그렇게 되면 성능적인 부분에서 많이 걸리지 않나 궁금합니다. set이나 치환부분이 얼마 되지 않기 떄문에 신경쓸 필요가 없는걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 성능 테스트
안녕하세요 강사님강의 내용 기반으로 제작된 서버는 성능 테스트를 위해 어떤 툴이나 방법을 사용하는지 궁금합니다.구글링해서 JMeter, Gatling, Locust, nGrinder같은 툴로 성능 테스트를 하고 시각화까지 할 수 있다고 정보가 나오는데 HTTP 또는 HTTPS 프로토콜을 사용하는 환경에서 테스트 하는 것 같더라구요. 강의 내용과 같이 C++로 자체 제작한 서버에서는 어떤 툴이나 방법을 사용해서 성능 테스트를 할 수 있는지 궁금합니다. 강의 듣고 서버를 제작해서 연동까지 해서 이제 포트폴리오로 제출하기 위해 성능테스트 하고 수치화나 시각화된 자료를 첨부해보고싶은데 방법을 모르겠습니다. 전부 웹 성능테스트 얘기만 나와서..ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
파트4의 서버 파일이랑 다른건가요??
파트4에서 서버 프레임워크 강의를 보고 파트5로 넘어왔습니다.그런데 중간중간 서버 프레임워크 소스가 다른곳이 있는거 같은데요, 예를 들어 서버에서 사용중인 패킷핸들러 cpp에서 인클루드되어있는 파일이 현재 파트5 강의에서는 BufferReader.h와 BufferWrite.h를 포함하고있습니다. 파트4 기준으로 해당 헤더는 포함되어있지 않구요. 그리고 패킷 핸들러.h 에서는 현재 파트5에서는 MakeShared하는 부분을 언리얼과 구분 지어서 MakeShared, make_share로 강의를 해주셨는데, 애초에 파트4의 핸들러에서는 make_shared를 사용하지 않고SendBufferPtr sendBuffer = GSendBufferManager->Open( packetSize );소스를 이용중인것으로 보이는데요..혹시 제가 중간에 잘못본 강의가 있는걸까요?
-
미해결[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 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
3D 이동 동기화
안녕하세요 강사님! 저는 강의 Part4,5 수강하고 서버 제작한 뒤에원래 제가 만들어놨던 컨텐츠에 서버 붙이는 중인데요 패킷 송수신까지 잘 마무리 되었고이동 동기화를 진행하는 도중에, 강의에서 연습했던 환경(평지)과 달리 제가 만든 컨텐츠에서는 울퉁불퉁한 지경도 있고 다양한 오브젝트들(몬스터, 건물, 나무...etx)이 있어 충돌을 고려해야 하는 상황인데요. 충돌이 발생하면 오차가 점점 커기는걸로 봐서 추측하건데,한 명의 클라이언트의 움직임에 대해서 각각의 클라이언트에서 충돌처리가 일어나기때문에 오차가 점점 커진다고 판단이 되었습니다. 이러한 충돌로 인한 이동 동기화 오차를 줄일 수 있는 방법으로는 어떤 방법이 있을까요?제가 생각해본걸로는.. 다음과 같은 방법이 생각났는데클라가 먼저 이동해서 발생하는 충돌이벤트도 같이 서버에 패킷으로 보내준다. (위치정보+방향+충돌이벤트)서버는 받은 패킷을 모든 클라에게 뿌린다. 다른 클라들은 해당 캐릭터를 기존과 같은 방식으로 이동시키되(방향으로만 전진) 충돌이벤트가 있다면 받은 위치정보로 AI 기능(?)을 활용해서 추가로 이동시킨다. 이러면 충돌이 발생할 때마다 AI로 움직여주고. 그럼 그 사이에 해당 캐릭터가 또 움직이면 움직임 자체에 텀이 생겨버릴것이라는 문제점이 나타나네요 ㅠㅠ.. 이러한 이동 동기화 문제점을 어떤방식으로 해결하는지 궁금합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
외부 네트워크에서 접속에 대한 질문이 있습니다 !
안녕하세요 RooKiss님 항상 좋은 강의 올려주셔서 감사합니다..! 외부 네트워크 환경의 제 친구에게 언리얼 클라이언트를 보내준 뒤, 강의를 들으며 쌓아 올린 제 서버에 연결을 하려고 했는데, 서버 소스의 IP 주소 입력란에 127.0.0.1이 아니라 제 외부(공인)IP 주소를 입력하니 예외를 던지면서 서버 프로그램이 죽더라구요.. 제 소스 문제인가 싶어서 선생님께서 올려주신 서버 소스에도 제 외부 IP 주소를 입력해봤는데, 여기서도 예외를 던지며 프로그램이 죽었습니다. 혹시나 싶어 사설 IP주소를 입력했을 때는 서버프로그램이 죽진 않았지만, 클라 쪽에서 접속할 수 없었습니다. 포트포워딩도 해놓았습니다. 서버 소스에 문제가 있는 건가요? 아니면 외부 네트워크에서 클라이언트를 접속 받는 방법에 대해 제가 잘못 이해하고 있는 걸까요?
-
미해결[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 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
Proto buf 관련 질문
강의 영상을 보면서 다른 프로젝트에 Proto buf를 적용하고 있습니다. 하지만 이를 연동하는 과정에서 서버에서 수정한 정보가 클라이언트로 넘어가지 않아 확인해보니 ServerPacketHandler.h의 내용 중 아래 내용에서 S1.h를 제가 만든 프로젝트의 이름으로 변경해도 계속 S1으로 바뀌는 것을 발견하였습니다. 서버 쪽에서 S1과 관련된 모든 것을 제 프로젝트의 이름으로 변경하였는데 바꾸어야 할 이외의 것이 있을지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
캐릭터의 점프 문제
안녕하세요 루키스님. 강의 영상을 보고 third person이 아닌 제가 만든 캐릭터와 애니메이션으로 새 프로젝트를 만들어 보고 있습니다.캐릭터의 이동과 이동 애니메이션까지는 잘 동작하지만 캐릭터의 점프가 되지 않아 고민입니다. 이전에 강의 정상에서는 보낼 상태 정보(움직이고 있는지, 아닌지)를 if (DesiredInput == FVector2D::Zero())로 판단하여 MOVE_STATE_IDLE과 MOVE_STATE_RUN을 구분하였는데 점프는 어떻게 구분해야 할까요?또, 점프 패킷을 받은 클라이언트는 이를 어떻게 처리해야 할까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
Recv 처리 과정 질문
안녕하세요 루키스님. 지금까지 패킷 수신 송신 과정의 흐름을 코드상에서 어떻게 흘러가나 이해해보려고 정리를 해보았는데, 이해가 잘 안되는 부분이 있어서 질문드립니다.일단 제가 이해한 Recv과정은 다음과 같이 이해했습니다.RecvThread에서 계속 일하면서 Packet받은거 큐에 넣는것도 알겠고큐에 있는걸 처리하기 위해 Session이 Handler한테 요청하는 것도 이해했습니다.이해가 안가는건. 그러면 Session의 HandleRecvPacket()을 호출하기 위해서는 GameInstance가 HandleRecvPacket()을 호출해줘야 하는데그러면 GameInstance가 HandleRecvPacket()는 누가 언제 어디서 호출을 하는것인가요???제가 흐름을 잘못 이해하고 있는건가요 ㅠㅠ?제가 이해한걸 그림으로 표현해보았습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
proto 파일에 내용 추가시 인식 오류
안녕하세요 루키스님. 제공해주신 예제 서버 파일 그대로 빌드하고 따라하면서문제없이 잘 진행되었는데, proto파일에 C_SPAWN과 같이 추가로 작업하면 인식을 못합니다. 내용을 살펴보니 Proto:: 에 C_SPAWN이 없다라고 나오는데재빌드, 껏다 켜보기, 다시 예제서버 다운받아보기, 루키스님 최신 강의에서 무료 protobuf강의 따라해보기 다해보았지만'추가'에 대한 인식을 못합니다.기존에 있던거는 잘 되구요... 다음 사진과 같은 상황입니다.추가 한 모습에러 뜨는 부분.. 물론 이 밑으로부터 빨간줄 천지입니다. 원인을 좀 찾아보려고 출력, 입력 라이브러리 다 찾아보았지만 경로 설정은 잘 되어 있습니다. python코드에서 혹시 이것인가 싶은거는 PacketGenerator.py 파일에서 import jinja2를 인식을 못하고 있습니다.혹시 이것때문일까요? 아니면 의심되는 부분이 또 있을까요?아 좀 더 실행해보니 proto파일 인식을 못하는것 뿐만 아니라 Protocol.pb.h과 같은 파일을 지워도 재등록을 안해주는 문제가 발생했습니다. 어떤 부분을 추가로 살펴봐야 할까요? ㅠㅠ 이것때문에 진행을 못하고 있네요..