안녕하세요 강사닙 C++ IOCP강의 정말 감탄하면서 잘 들었습니다. ( 되새김질 50번은 한거같네요 ) 양질의 강의 제공해주신 점 정말 감사합니다. 현재 저는 대학교 3학년 복학 준비중이고, 졸업작품 제작을 염두에 두고 있는 상태입니다. 로드맵 관련해서 질문하고 싶은게 있습니다. Unity의 part4 C#목차를 보면 C++서버와 동일하더라고요. 근데 굳이 후순위에 배치하신점이 궁금합니다. ( C++서버와 구조가 같아보이는데 들어야할까요? ) ( JobQueue같은 스레드 배치항목만 이해했다면 굳이? 싶어서요 ) 또한 unity시리즈의 데베쪽 강의와 연동쪽 (part 5~9 )를 듣고 싶은데, unity엔진에 대한 경험이 없어도 될까요? UE로 포폴을 작성할 생각인데, C++연동 강의를 듣고 UE공부를 할려고 합니다. (GAS 등 ) 이 때, 공부 순서를 어떻게 해야할지 감이 안잡혀서요... C#으로 데베연동쪽으로 컨텐츠 구현감을 잡고나서 하는게 좋을까요? 분산서버의 경우 C#과 C++을 혼용해서 개발할 수 있을거 같은데, 이걸 위해서라도 C#을 공부하는게 좋을까요? ( 인증서버는 C#으로 구현하는 경우가 많으니 )
안녕하세요 강의 정말 감탄하면서 잘 수강하고 있습니다. Job에서 보편참조로 받았는데 forward로 하지 않은 것은 Ref들의 생명연장을 해주기 위해 의도적으로 복사하기 위한 의도일까요? JobSerializer로 인터페이스를 제공한 쪽에서는 어차피 Job내부에서 복사를 일으키고 있으니 forwad로 전달하는 의도가 맞을까요? 강의 코드를 매일 복기하면서 보고 있는데 정말 감탄이 나오네요 항상 감사드립니다.
락프리 구조를 사용하지않는다고 하셨는데 락프리를 써야 서버의 성능이 제대로 나오는것 아닌가요? 오히려 너무 어려워서 제대로 만든것이 아니라면 서버가 죽거나 오류가 날수 있기때문에 안쓰는 건가요? 락을 사용해서 데이터 하나에 접근을하면 싱글 스레드보다 성능이 낮을것같아서 질문드려요 멀티스레드를 사용하는 경우가 실무에선 많이 없을까요? 아니면 boost.asio에 있는 lockfree자료구조를 사용하나요?
32비트짜리 threadID를 비트 연산으로 16비트 옮겨준뒤 짤라준 것을 WriteFlag에 담는 과정에서 손실이 일어나는거 아닌가요? 그래서 현재 ThreadID와 _lockFlag의 WriteFlag를 다시 16비트 옮겨준 값이랑 비교했을 때 일치하지 않는 문제가 발생할 수 있지 않나요? 강의 18:40초입니다. ( ThreadID를 16비트로 관리하지 않는 이유는 또 무엇인가요??? )
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
Spawn #2 따라하고 실행해보는데 메모리 충돌로 인해 언리얼 크래쉬가 발생하네요 혼자 열심히 시도해 본 결과 UE FMemeory와 ProtoBuf 소멸자에서 delete 되는 부분에서 UE delete 오버라이드 문제인 것 까진 알게 되었으나 어떻게 해결해야 할 지 모르겠어서 질문 드립니다 UE 5.6 버전이고, ProtoBuf는 C++ 5.29.5(29.5) 버전입니다 vcpkg를 사용해서 라이브러리 다운 받았고 /MD 동적 라이브러리로 UE 프로젝트에 포함시켰습니다 (dll로 인해서 new/delete 오버라이드로 인한 메모리 충돌 문제가 더 쉽게 발생하여 /MT로 포함하는 것이 나을 수도 있겠다고 LLM(gpt, grok) 등이 말한 내용을 적용하고자 하였으나 빌드를 실패하여 그 부분은 진행하지 못하였습니다) 다음 이미지는 실행했을 때 크래쉬가 발생하는 부분과 로그 일부 입니다 LoginId:468bde9140a0ef5bd78746b7d5b86a2c EpicAccountId:e6607fa7037e41448797c486f54e5315 Unhandled Exception: EXCEPTION_ACCESS_VIOLATION reading address 0x0000023d9d00116f UnrealEditor_Core UnrealEditor_Core UnrealEditor_S1!operator delete() [C:\Program Files\Epic Games\UE_5.6\Engine\Source\Runtime\Core\Public\HAL\PerModuleInline.inl:9] UnrealEditor_S1!Protocol::PlayerInfo::`scalar deleting destructor'() libprotobuf!google::protobuf::internal::RepeatedPtrFieldBase::DestroyProtos() [C:\Users\yudle\vcpkg\buildtrees\protobuf\src\v5.29.5-5bafd96eab.clean\src\google\protobuf\repeated_ptr_field.cc:90] UnrealEditor_S1!Protocol::S_LOGIN::~S_LOGIN() [D:\GitHub\S1\Source\S1\Network\Protocol.pb.cc:586] UnrealEditor_S1!std::_Func_impl_no_alloc ServerPacketHandler::Init':: 2'::<lambda_1>,bool,TSharedPtr<PacketSession,1> &,unsigned char *,int>::_Do_call() [C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\INCLUDE\functional:810] UnrealEditor_S1!PacketSession::HandleRecvPackets() [D:\GitHub\S1\Source\S1\Network\PacketSession.cpp:37] UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_CoreUObject UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Core UnrealEditor_Core UnrealEditor_Core UnrealEditor_Core UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_Engine UnrealEditor_UnrealEd UnrealEditor_UnrealEd UnrealEditor UnrealEditor UnrealEditor UnrealEditor UnrealEditor UnrealEditor kernel32 ntdll S_LOGIN 패킷의 소멸자에서 오염된 메모리 접근 문제로 크래시가 발생한 것으로 보입니다
물론 회사마다 다르고 각 회사의 기존 스타일을 따라야 하는게 맞지만 독학하는 입장에서는 clang-format이 제공해주는 힌트들, 구글 스타일 가이드 혹은 인터넷에서 나오는 여러 c++ 스타일 가이드를 보면서 어떠한 스타일을 채택해 사용할지 고민이 됩니다 미리 손에 익혀두며 학습하고 싶어 질문드려 봅니다
예들 들어서, 할당된 메모리 주소가 0x1000~0x3000이고, 실제 사용하려는 메모리 위치를 0x2008로 반환받았다고 가정할 때, const int64 address = reinterpret_cast<int64>(ptr); const int64 baseAddress = address - (address % PAGE_SIZE); 이 계산으로 전체 메모리 해제가 가능한가요? 메모리 해제 부분이 이해가 잘 안되네요..
루키스님 강의 잘 듣고 있습니다. 서버 강의 재밌게 듣고 있는데 제가 공부 하는 방법이 시간이 많이 드는데 시간을 많이 쓰는 거에 비해 학습에 크게 도움이 되는 것 같지 않아서 질문 드립니다. 저는 강의를 듣고 복습 차원에서 노트에 그날 들었던 강의들의 내용을 정리하고 코드에 대해 이해해보려고 검색 하면서 공부하고 있는데 노트에 필기 하는데도 시간이 많이 들고 필기에 투자 하는 시간 대비 외우는 게 잘 안되는 거 같아서 이 방식이 잘못되었다고 느껴지네요... 루키스님은 어떤 식으로 공부 했는지 궁금합니다!! 진로는 서버 쪽으로 밀고 가려고 하고 있습니다.
52강 ServerService 수강 중 13:54 때에 MakeShared함수를 이용해서 shared_ptr을 생성해주는 부분이 있는데, 똑같이 따라하던 중 제 프로젝트에서 컴파일 에러가 발생했습니다. 첨부해주신 프로젝트와 비교해보니 MakeShared함수가 변경되어 있더라구요 기존에 Memory 관련 강의 이후에는 변경된점이 없어서 어느 시점에 변경된건지 궁금합니다.
지금까지 개발한 서버코어는 IOCP기반의 비동기 논블로킹 방식이라 생각됨니다.Send에서는 SendBuffer를 sendEvent에 등록한 다음 Scatter-Gather로 모아서 ::WSASend로 송신을 수행하는 것으로 이해했습니다.Recv에서는 ::WSARecv에서 수신을 받기 전에 버퍼에 패킷 데이터를 조립한 다음에 바로 함수를 실행하고 있습니다.이벤트 데이터는 사실상 비어있고 callback함수도 없으니 ::WSARecv는 수신완료를 CP에 보내는 것 밖에 없다고 봅니다.제가 볼때 수신부는 제가 이해한 비동기 방식과는 다르게 돌아가는 것 같습니다.어떻게 이해해야 할까요?
여기서 만약 복사 시작지점 + len 이 array 범위 밖이면 sendBuffer->Close(len) 안에서 ASSERT_CRASH(_allocSize >= len); 으로 체크하기 전에 array 정적배열에 memcpy를 하니까 이 부분에서 문제가 생길 것 같습니다. OnRecv로 들어온 buffer가 6001바이트짜리 라면 Open(4096)이 성공하고, 6000크기의 배열에 6001크기를 memcpy 하니 오버플로우가 일어날 것 같습니다. 아니면 Open(4096)으로 chunk로부터 사용할 수 있는 공간을 할당 받을 때 len이 4096보다 반드시 작을거라는 확신이 있기 때문에 memcpy 전에 확인하지 않는건가요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
Hello Master 🙂 I would like to ask wich method is prefered in wich case. Most mmo code i seen either go packet way like in this course or Client send commands wich contains input + mouse postion + fields that allow you to for example specify operation type like interact, consume etc. Server respond each tick with snapshot of zone you are around your aoi with all possible data with delta comporession so you get only new information. Wich approach is prefered, on wich it depends? Does they have some serious perfomance gains when you stick to one of them? Or its just matter of architecture your team prefer?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
Hello, 1 . What is more capable of m2 c# server or cpp from episode 4? Would it make sense to use cpp version of server with c# unity client? Is it better to keep c# integration inside unity engine or create bindings to cpp client and only call bindings from c# unity?
우선 좋은강의 만들어주셔서 감사합니다. 제가 질문드릴건 메모리풀을 1024까지는 32바이트단위로 만드는데, 그러면 32바이트전용 풀 64바이트 전용 풀 이렇게 만들어질거고 근데 이제 요청하는데 16바이트 요청을 1000번하면, 32바이트 풀안에 메모리헤더 큐가 1000개가 생기는거죠?? 해제안했다는 가정하에