inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

투사체 서버 판정 질문입니다

해결됨

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

서버가 보통 10 ~ 20 프레임으로 돈다고 들었는데 그렇다면 서버 내의 오브젝트(투사체, 아이템)도 아무리 빨라야 10 ~ 20프레임이 될 것 같습니다. 그렇다면 RPG기준으로 몬스터가 논타겟 총알을 발사했을 때 플레이어를 통과하는 경우도 있지 않나요? 1인게임 만들 때 처럼 딱 맞았을 때 판정하면 좋겠는데 그게 안되니 언제 판정을 해야할지 모르겠습니다..

  • 네트워크
  • MMORPG
  • windows-server
박홍준 댓글 2 좋아요 0 조회수 378

포트폴리오 작성 Pimpl Pattern 사용

해결됨

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

현재 포트폴리오를 작성하면서 각종 라이브러리 및 .h파일을 작성하고 있습니다. 개발중 한가지 고민이 생겼습니다. 나는 listener.h를 불러왔는데 왜 .h파일을 불러와져야할까? 그래서 찾아보니 Pimpl 패턴으로 클래스를 전방선언하고 .cpp에 구현함으로써 .h 파일에는 다른 include.h가 되는걸 최소화 할 수 있다는걸 알게 되었습니다. 해당 패턴에 장 단점또한 정확하게 파악하고 있습니다. 하지만 Pimpl패턴을 사용하는것이 포폴에서 좋은 영향을 줄지는 걱정이 됩니다. 괜히 읽는 사람입장에서 불편하게 만들지 않을까라는 것 입니다. 어떻게하는게 좋을까요...

  • 네트워크
  • MMORPG
  • windows-server
opcy02 댓글 1 좋아요 0 조회수 366

PacketSession

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

혹시 PacketSession만들떄 프로토콜같은경우는 게임을 만들다보면 공격, 스킬, 이동, 퀘스트, 물약처리, 말고도 DB처리, AI서버가 있으면 AI관련된 프로토콜도 있을테고 기타 등등 엄청 많아질거 같은데 그러면 처리해야할 모든 프로토콜을 enum class로 처리해서 모든 각각의 서버와 클라가 공용으로 사용을 해야하는건가요?

  • 네트워크
  • MMORPG
  • windows-server
tmvldjtm1018 댓글 1 좋아요 0 조회수 331

유니티 캐주얼 모바일 MMORPG (M2) 강의 질문 드립니다. / 다른 강의 질문 양해 말씀 드립니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

루키스님 안녕하세요. 먼저 다른 강의에 대해 문의 드리는 점 양해 말씀 드립니다. [Rookiss 켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2) 해당 강의 구입을 고민중인데, M1과는 완전히 다른 강의 인가요? M1과 이어지는 강의인지 아닌지를 고민하고 구매를 결정할 생각입니다. 답변 미리 감사합니다!

  • 네트워크
  • MMORPG
  • windows-server
mhyim 댓글 1 좋아요 1 조회수 303

makeshared에 대해

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

복습차원에서 다시 듣느데 혹시 자체적으로 만든 makeshared를 쓰는 이유가 메모리풀을 적용시켜서 sharedptr로 만드는건데 요즘은 그냥 new delete성능이 좋아서 그냥 써도 상관없다는것을 들었는데 그러면 그냥 지원해주고 있는 make_shared함수를 써도 성능상에서 아무문제 없는거 맞는거죠?

  • 네트워크
  • MMORPG
  • windows-server
tmvldjtm1018 댓글 1 좋아요 0 조회수 317

Session의 수명 관리를 위한 Ref 카운트 관리 부분

해결됨

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요. 수업 잘 듣고 있습니다. 감사합니다. Session 수업 부분에서 Register함수들에서 owner = shared_from_this(); 를 Process함수들에서 owner = nullptr 를 해주는 방식을. 한 군데에서 관리하는게 좋지않을까 하는 생각이 들었습니다. Session이 생성될 때 Init함수 같은 것을 하나 둬서 멤버 변수로 들고 있는 각Event들의 owner에 shared_from_this()를 넣어주고 (계속 들고 있는 상태로 유지) 나중에 문제가 생겨서 Disconnect()를 호출해야 할 때, ProcessDisconnect함수와 소멸자 같은 부분에서 nullptr로 밀어주는 식으로 한다면 비동기 함수에 걸어놓는 동안 session의 생명은 계속 유지가 될 것 같고, 매번 참조횟수를 늘렸다 줄였다 하지 않아도 되니 괜찮을 것 같다 생각했는데요. 혹시 제가 잘못 생각하고 있거나 미처 생각을 못한 부분이 있을까요?

  • 네트워크
  • MMORPG
  • windows-server
seekchange 댓글 1 좋아요 0 조회수 298

네트워크 궁금한점이 있습니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

서버개발 내용에 대해 궁금한것이 있어서 질문드려요. 메인 서버가 있고 접속한 클라이언트 1,2가 있을때 메인서버를 통해 클라이언트 1,2를 서로 연결만해주고 연결후에는 메인서버를 통하지 않고 연결이 가능할까요?

  • 네트워크
  • MMORPG
  • windows-server
GODOT 댓글 1 좋아요 0 조회수 279

RWlock

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Reader-writer Lock 잘 시청하였습니다. 그런데 인터넷 글 구경중 SRWLock라고 지원해주는것이 있던데 이거는 오래된된것이라 안쓰는 추세인가요?

  • 네트워크
  • MMORPG
  • windows-server
tmvldjtm1018 댓글 1 좋아요 0 조회수 314

LLocalStack 을 main 밖에서 쓰면 에러가 나는 이유??

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

이런저런 실험 도중에 발견한 에러입니다 CoreGlobal::CoreGlobal() { GThreadManager = new ThreadManager(); GMemory = new Memory(); GSendbufferManger = new SendBufferManager(); GDeadLockprofiler = new DeadLockProfiler(); SocketUtils::Init(); LlockStack.push(1); LlockStack.pop(); // 에러 지점 } main 안에서는 문제 없었는데 코어글로벌 cpp 파일에서 저 부분이 문제더라구요 push 까지는 통과되고 size 도 1로 늘어나는것을 확인했는데 pop() 하는 도중 크러시가 납니다 혹시 이유를 알고 계신가요??

  • 네트워크
  • MMORPG
  • windows-server
우웅 댓글 2 좋아요 0 조회수 477

마이크로소프트 제공 SList 는 use-after-free 에 대하여 안전한가요??

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

마이크로소프트 제공 SList 를 모방하는 과정에서 SList 는 여전히 use-after-free 에 대하여 취약하다고 말씀하셨는데 마이크로소프트에서 제공하는 SList를 사용 할 때도 일반적인 상황에서는 안전한 것인지 궁금합니다 제 생각에는 수업의 경우 메모리 풀이라는 특수 상황에서는 free가 일어나지 않으니 일단 안전한다고 생각하는데 메모리 풀이라 안전한 것이지? 그렇지 않은 경우는 또 어떨지 궁금합니다.

  • 네트워크
  • MMORPG
  • windows-server
우웅 댓글 1 좋아요 0 조회수 341

클라연동 질문드립니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요 루키스님 강의를 따라하면서 클라를 콘솔이 아니라 winapi를 이용해 연동에 성공했는데요.(싱글톤으로 서버 세션을 만듬)일단 연결이 된걸 확인했으나 클라에서 창을 닫고 나가면 deque헤더에서 액세스위반 크래쉬가 나더라구요. 그래서 디버깅을 열심히 해보니 클라가 나갈때 CoreGlobal의 소멸자가 호출되고 그중에 SendBuffer매니저를 지워줄때 문제가 생기더라구요. 그래서 혹시몰라 CoreGlobal 에 delete 하는 부분을 없애봐도 프로그램이 종료 되면 SendBufferManager::PushGlobal함수 호출 ->SendBufferManager::Push 함수 호출 되고 나가는 과정에서 Lock이 문제가 발생했습니다.. 아무리 제가 찾아도 문제를 못찾겠어서 기존에 만들어주신 더미클라이언트에선 콘솔을 닫을때 코어글로벌 소멸자호출을 확인하니까 아예 호출이 안되는걸 확인했고 이 문제를 해결하려고 여러방면으로 시도를 해봤는데 잘 되지않아서 질문드립니다.. 서버를 열지않은상태에서 클라를 닫을때 크래쉬가 안나는걸 봐선 클라문제는 아닌거같은데 어떻게 해결하는게 좋을까요?

  • 네트워크
  • MMORPG
  • windows-server
오늘의논리 댓글 1 좋아요 0 조회수 469

UE MMO 콘텐츠 구현은 언제쯤 출시 예정이실까요?

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

C# 서버 듣고 돈이 안아까워서 C++서버랑 게임도 붙여보고 싶습니다. UE MMO 콘텐츠 구현은 언제쯤 출시 예정이실까요? 올해 말까진 출시됐으면 좋겠는뎅

  • 네트워크
  • MMORPG
  • windows-server
mhyim 댓글 2 좋아요 1 조회수 494

Queue가 비어있을 때, TryPop 질문입니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

shared_ptr<T> TryPop() { // [data][data][ ] // [head][tail] CountedNodePtr oldHead = _head.load(); while (true) { // 참조권 획득 (externalCount를 현시점 기준 +1 한 애가 이김) IncreaseExternalCount(_head, oldHead); Node* ptr = oldHead.ptr; if (ptr == _tail.load().ptr) { ptr->ReleaseRef(); return shared_ptr<T>(); } // 소유권 획득 (head = ptr->next) if (_head.compare_exchange_strong(oldHead, ptr->next)) { T* res = ptr->data.load(); // exchange(nullptr); 로 하면 버그 있음! FreeExternalCount(oldHead); return shared_ptr<T>(res); } ptr->ReleaseRef(); } } static void IncreaseExternalCount(atomic<CountedNodePtr>& counter, CountedNodePtr& oldCounter) { while (true) { CountedNodePtr newCounter = oldCounter; newCounter.externalCount++; if (counter.compare_exchange_strong(oldCounter, newCounter)) { oldCounter.externalCount = newCounter.externalCount; break; } } } void ReleaseRef() { NodeCounter oldCounter = count.load(); while (true) { NodeCounter newCounter = oldCounter; newCounter.internalCount--; // 끼어들 수 있음 if (count.compare_exchange_strong(oldCounter, newCounter)) { if (newCounter.internalCount == 0 && newCounter.externalCountRemaining == 0) delete this; break; } } } TryPop을 할 때는 ExternalCount를 증가시키는데 head와 tail이 같을 경우에는 internal 카운트를 감소시키고 return 합니다. 만약 push가 없고 pop만 반복된다면, ExternalCount는 계속 증가하고 internalCount는 계속 감소하는것같은데 맞나요? externalCount 와 internalCount가 일정해야하는게 옳은 결과값 같아서 질문합니다.

  • 네트워크
  • MMORPG
  • windows-server
satie사티 댓글 1 좋아요 0 조회수 268

vector 생성시 메모리 참조 오류가 납니다

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

stomp allocator를 적용한 vector를 생성시에 내부에서 아래와 같이 1바이트를 할당하는데 그이후에 쓰기 액세스 오류가 발생합니다. memory, allocator파일 그대로 받아서 넣어도 동일합니다 ㅠ

  • 네트워크
  • MMORPG
  • windows-server
누구게 댓글 2 좋아요 0 조회수 372

Lock-Free Stack #3 compare_exchange_strong 사용이유

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

void IncreaseHeadCount(CountedNodePtr& oldCounter) { while (true) { CountedNodePtr newCounter = oldCounter; ++newCounter.externalCount; // 카운터가 정상적으로 1 증가할때까지 실행 if (_head.compare_exchange_strong(oldCounter,newCounter)) { oldCounter.externalCount = newCounter.externalCount; break; } } } while의 조건문에는 언제나 compare_exchange_weak를 사용했는데 while문 내부의 if에는 compare_exchange_strong을 사용한 이유가 궁금합니다.

  • 네트워크
  • MMORPG
  • windows-server
satie사티 댓글 1 좋아요 0 조회수 332

OnRecvPacket에 PacketSessionRef를 넘겨줄 때

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요 OnRecvPacket 함수 내부에서 HandlePacket 함수의 파라미터로 PacketSessionRef 타입 파라미터를 넘겨줄 때 왜 PacketSessionRef의 생성자를 호출해서 추가로 만든 객체 를 넘겨주는지 궁금합니다. 이 부분이 혹시 shared_from_this를 활용해서 PacketSession으로 캐스팅해서 객체 본인을 넘겨줘야 하는게 아닌지 궁금합니다.

  • 네트워크
  • MMORPG
  • windows-server
점심 댓글 2 좋아요 1 조회수 332

멀티스레드 Job처리

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

제가 경험했던 환경에서는 네트워크스레드(N) -> MessageQueue -> 메인스레드(1) 사실상 메인로직이 싱글 스레드였습니다. 그렇다 보니 Queue에 들어오는 순서대로 메인스레드에서 처리했고, 느릴수도 있었겠지만 순서는 확실하게 보장이 되었습니다 그런데 현재 구조상 네트워크스레드(N) -> JobQ 메인로직(N)으로 진행되거나 네트워크스레드(N, timeLimit제한) -> GlobalQ 메인로직 (N) 으로 진행되다보니 궁금한게 생겼는데요 첫번째 궁금한점은 패킷이 ABC 순서로 왔을때, AC는 JobQ1 B는 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를 바로 이어서 할예정입니다. 감사합니다

  • 네트워크
  • MMORPG
  • windows-server
비타 댓글 2 좋아요 6 조회수 532

IocpEvent는 메모리 해제될 일이 없나요?

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요 IocpObject가 지워지지 않게 Ref Count 처리해주는 부분을 보고, IocpEvent는 지워질 일이 없는지 궁금합니다. 어차피 Session의 멤버로 들고 있으니 Session이 지워지지 않는다면 IocpEvent는 절대 지워질 일이 없는걸까요?

  • 네트워크
  • MMORPG
  • windows-server
점심 댓글 1 좋아요 0 조회수 368

atomic 스마트포인터에 대해서궁금합니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

밑에 질문들을 읽고 궁금한것이 있습니다. 스마트포인터를 사용하면 refcount에 대해서는 스레드세이프가 이제 구조상 보장이 되지만 set부분이나 치환하는 부분에 대해서는 아직 완전 보장이 안되어 atomic 스마트포인터를 활용하거나 lock을 건다고 하셨는데 그렇게 되면 성능적인 부분에서 많이 걸리지 않나 궁금합니다. set이나 치환부분이 얼마 되지 않기 떄문에 신경쓸 필요가 없는걸까요?

  • 네트워크
  • MMORPG
  • windows-server
tmvldjtm1018 댓글 1 좋아요 0 조회수 326

서버 성능 테스트

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요 강사님 강의 내용 기반으로 제작된 서버는 성능 테스트를 위해 어떤 툴이나 방법을 사용하는지 궁금합니다. 구글링해서 JMeter, Gatling, Locust , nGrinder같은 툴로 성능 테스트를 하고 시각화까지 할 수 있다고 정보가 나오는데 HTTP 또는 HTTPS 프로토콜을 사용하는 환경에서 테스트 하는 것 같더라구요. 강의 내용과 같이 C++로 자체 제작한 서버에서는 어떤 툴이나 방법을 사용해서 성능 테스트를 할 수 있는지 궁금합니다. 강의 듣고 서버를 제작해서 연동까지 해서 이제 포트폴리오로 제출하기 위해 성능테스트 하고 수치화나 시각화된 자료를 첨부해보고싶은데 방법을 모르겠습니다. 전부 웹 성능테스트 얘기만 나와서..ㅠㅠ

  • 네트워크
  • MMORPG
  • windows-server
Park SungEun 댓글 1 좋아요 0 조회수 723

인기 태그

인프런 TOP Writers

주간 인기글