묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
reserved 공간은 뭘 위해서 만들어둔건가요??
reserved 4비트 공간은 왜존재 하는건가요? 그냥 64비트로 존재하게 냅두면 비트쉬프트를 하지않아도 될텐데 라는 의문이 들었습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 풀 할당 반복문 오류가 있는거 같습니다.
1024를 넘어서도 32씩 증가를하고 다른분이 올리신거같은데 세번째 반복문에 이상이있는지 끝이 NULL로 세팅되는 오류가 있습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
shared_ptr질문
shared_ptr에도 레퍼런스 카운트 블록안에 weak값이 존재하고 shared_ptr타고 들어가서 보니 shared_ptr도 weak가 0이될때 그제서야카운트 블록을 날려주는거 같은데. 만약 shared_ptr에 weak가 0이 되지 않는상황이 오면 계속 남아있을거 같은데 shared_ptr에서는 weak가 절대0이상이 될수가 없는건가요??weakCount는 weak_ptr로만 늘려줄수 있어서 상관이 없는걸까요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LockFree를 실제로 쓰긴쓰나요?
엄청 복잡하기도하고 버그 발생 여지도 많을거같은데 그냥 mutex쓰는게 좋은거 아닌가요?? Lockfree 만의 장점이 있나요? 실무에선 어떻게 활용하는지 궁금합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock Free Stack #1강의에서 atomic 헤더없이 사용 가능한 이유?
강의 시간 02:07atomic타입으로 Node 포인터 변수를 선언 했는데 <atomic> 헤더를 선언하지않았는데 빌드가 잘되던데 왜그런건가요??미리 컴파일된 헤더나 mutex안에 atomic이 있지도 않은데 말이죠.. 아직 c++ 이 많이 익숙치 않아 질문남깁니다. ㅜㅜ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CAS 질문 strong vs weak
스핀락 시간에는 strong을 사용하고 이번엔 weak를 사용했는데 이유가 있나요?? compare_exchange_strongcompare_exchange_weak
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
언리얼 클라이언트와 tcp 연동에 대해 질문있습니다.
강의 tcp 서버 실습 강의를 보고 dummyclient 에서 작성한 코드를 바탕으로 언리얼엔진과 간단히 연동을 해보려 하는데 언리얼 c++에서 어디 클래스 부분에 코드를 붙여야 할 지 감이 안잡혀 질문 드립니다. 기본 빈 클래스에 FRunnable 상속을 받아 진행해봤는데 빌드하는 부분에서 자꾸 오류가 떠서 막막하네요 ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Dfs 함수의 순방향 간선 예외 체크 로직에 대해 여쭤봅니다.
Dfs 함수에서if(_discoveredOrder[here] < _discoveredOrder[there]) contiue;해당 로직을 통해서 순방향 간선이면 continue를 하여 넘어갔는데 해당 if 문에 걸리는 경우가 존재하나요??_discoveredOrder[there]의 값이 -1이 아니라는 뜻은 자신의 부모로부터 이미 방문한 적이 있다는 뜻인데 if 문에 걸리는 것이 없는 것 같아서요. 어떤 경우에 발생하는 지 궁금합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TypeList 수집 관련 질문
영상 구현에서는 TypeList를 직접 작성 했는데 실제 사용에서는 inheritance hierarchy를 탐색해서 TypeList를 생성해야 할 것 같다는 생각이 듭니다.일단 template meta programming을 잘 다루지 않아서 hierarchy를 어떻게 수집 할 수 있을지도 감이 오지 않네요.수집이 가능하다 해도 hierarchy가 크다면 hierarchy tree의 클래스 개수 n^2 만큼의 메모리를 점유하게 될 텐데 해당 부분도 우려가 됩니다.메모리 문제를 해결하기 위해서 _typeId 초기화 시점에 parent id도 추가적으로 선언+초기화하고 런타임 비용을 조금 더 쓰더라도 id를 hierarchy를 따라 올라가서 casting 가능 여부를 판단하는 방식은 어떨까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
언리얼에서 소켓 연결 관련 전역 객체의 생성 질문
안녕하세요 강사님강사님의 강의를 들으며 게임 서버 개발자를 꿈꾸는 학생입니다.다름이 아니라 이번에 프로젝트를 진행할 기회가 생겨서 언리얼 클라와 IOCP 서버를 연동해 게임을 만드려고 합니다.이때 클라측에선 네트워크 스레드를 별도로 두어 패킷의 송수신을 담당하도록 하고 수신받은 데이터를 전역에서 존재하는 큐를 여러개 두어(인게임 패킷만 다루는 큐, 로비에서의 패킷만 다루는 큐 등) 여기에 밀어주도록 하고 메인 스레드에서 이를 락을 걸어 뽑아서 쓰는 형식으로 구현할 계획입니다.여기서 궁금한 점이 이런 소켓 연결 관련 객체와 글로벌 큐를 어느 위치에서 가지고 있어야 하는지입니다. 전역으로 사용하고 연결이 끊기면 안되므로 Game Instance를 생각하고 있습니다만 더욱 좋은 방법이 있는지 강사님께 여쭤보고 싶습니다. 읽어주셔서 감사합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
보안에 대해서 질문있습니다!
안녕하세요. 루키쓰님루키쓰님의 영상을 열심히 보고 있는 취준생입니다.루키쓰님 덕분에 열심히 포폴을 만들고 있는데, 혹시 게임 서버 그리고 클라와 서버간에 통신을 하면서 사용되는 보안 기술에 대해서 알 수 있을까요?키워드라도 알려주시길 부탁드립니다..!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓과 패킷에 대해 질문이 있습니다!
제가 공부하기로는 패킷은 데이터 앞뒤로 헤더와 같은 정보들이 붙어있는 걸로 알고 있습니다.소켓은 클라와 서버 사이에 데이터를 보내기 위한 데이터를 담는 통 같은 개념으로 알고 있습니다.제가 공부한 게 맞는다면 소켓에 담는 데이터가 패킷 형태로 담아지는 건가요??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C++ 11 이전 CAS 문법
안녕하세요~ 선생님.강의를 복습하다 보니 compare_exchange_strong 문법에 호기심이 생겨서 찾아보니,atomic과 compare_exchange_strong은 C++ 11 부터 추가된 문법이라고 그러더라고요. 저는 현재 연습용으로 옛날 문법(C++ 11 이전)을 이용해서 Read-Write Lock을 구현해보려고 하는데atomic 과 compare_exchange_strong,weak 없이 구현할 수 있을까요? ㅠㅠ...
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TSharedPtr<T>이 thread safe한지에 대한 질문
안녕하세요. 강의 감사히 들었습니다.TSharedPtr<T>이 thread safe한지에 대해 고민해보던 중 질문이 생겨 글 작성하였습니다. 관련된 다른 질문들을 보아도 의문이 해결되지 않아서요. class User { public: changeWraight(WraightRef wraight) { wraight_ = wraight; } WraightRef wraight() { return wraiht_; } private: WraightRef wraight_; }; thread 1User *user = Server::getUser(userId); user->changeWraitht(wraight); thread 2User *user = Server::getUser(userId); WraightRef wraightRef = user->wraight(); 위 상황에서 thread 2 가 실행되어 복사생성자가 호출되었고, 복사생성자에서 Set함수가 호출되어 아래 조건문 까지 검사하고 thread1이 실행되었다고 가정한다면 WraightRef를 사용하여도 복사시 문제가 발생할 수 있을 것이라고 생각했는데요. 제가 잘못생각한 것이 있다면 피드백 부탁드리고 싶습니다.inline void Set(T* ptr) { _ptr = ptr; if (ptr) { ptr->AddRef(); } }
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
placement new 질문!
안녕하세요.placement new 문법에 궁금한 게 있는데요.1.new(header) MemoryHeader(size)를 해석하면new(이미 할당된 메모리 주소)생성자(매개변수)인 것 같은데 맞나요?2.new 문법은 힙 메모리에 영역을 할당하고 생성자를 호출하는 거고,placement new는 이미 할당된 메모리에 생성자를 호출하는 거 같은데 제가 이해한 게 맞을까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
17분 20초 경 예외체크 질문입니다.
너무 많은 데이터를 보내면 안되기 때문에 예외 체크를 하여 빠져나온다고 하셨는데, 왜 그렇게 하는 지 알 수 있을까요??ex) 굉장히 많은 아이템을 가지고 있는 캐릭터의 정보를 보낸다고 가정할 때, 컨텐츠 쪽에서 SendBuffer의 버퍼 사이즈를 초과할 것을 예상하여 여러개의 SendBuffer로 쪼개서 ReigisterSend 하는 곳으로 넘겨줄텐데 왜 한번 더 예외체크를 해야되는 지 헷갈립니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
데드락 탐지 건에 대해서 질문이 있습니다.
안녕하세요,데드락 탐지 건에서 질문을 하고 싶습니다.제가 강사님 프로젝트를 다운받아서 코드를 제대로 살펴보았음에도 육안으로 구분한 것이라 제가 간과한 부분이 있을 수도 있습니다.영상 마지막 부분에 std::stack<int32> 부분은 선언하지 않고, 순전히 영상 전의 내용과 고친 부분의 후로 나뉘기는 하지만 결과는 동일합니다.결과적으로는 무한루프가 발생하는데,이게 DFS 내부적인 로직이 꼬여서 무한루프가 발생하는 것인지, 아니면 스레드 끼리의 DeadLock 으로 인해서 생긴 무한루프 때문에 충돌이 난 것인지 제가 확인을 할 방법이 없습니다. (정확히는 디버깅 미숙 숙련도 이슈입니다.)혹시 어디 부분이 제가 빠트렸거나 유추 가능한 원인요인들이 있을까요?https://drive.google.com/file/d/1HYHZMhf6wkkHxvqLIpAU1-SsSNKS4rO3/view?usp=drive_link
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SpinLock 구현 과정에 대해서 질문이 있습니다.
SpinLock 에 사용되는 특의 함수,atomic 키워드와compare_exchange_strong() 메소드를 쓰면서 구현을 하는 과정에 대해서 들었는데,의문점이void Add(), Sud() 메소드에순서상의 lock_guard() 를 먼저 실행하면 되지 않을까 생각합니다.thread1,thread2두 개의 쓰레드가 하나의 locked 부울 데이터를 공유한 상태에서 동시에 lock_guard() 를 할 수 있는 경우에서 locked 부울을 동시 접근하는 경우도 있겟지만,=> 이러면 deadlock 이 발생하겠죠.같은 말로,thread t1(Add);thread t2(Add);같은 경우도 위에 deadlock 발생하는 같은 이치라고 보시면 될꺼 같습니다.결국에는 locked 부울 데이터를 공통적으로 사용한다는 부분에서 생기는 문제니까요.즉, thread 1 또는 thread 2 가 동시적으로 접근하지 않는 이상 deadlock 은 발생하지는 않을 것이며,add 메소드에서 lock_guard() 를 했기에, 모든 작업을 다 끝내고 그 다음 add() 메소드를 실행하지 않을까 하고 생각합니다.하지만 main 에서 Add(), Sub() 를 순차적으로 실행했기에 Add() 에 먼저 thread1, thread2 가 동시에 수행을 한다해도 결국에는 Add() 메소드에서 lock_guard 를 둘 중 하나가 먼저 수행하기 때문에 Add() 메소드를 먼저 접하는 thread 가 수행을 하고,그 뒤의 Sub() 메소드 또한 실행을 하지만,이 또한 thread 1 또는 thread 2 둘 중 하나가 lock_guard() 를 하고 있는 상태이기 때문에 다른 스레드가 _locked 부울에 접근을 하지 못하는 이유로 deadlock 이 발생하지 않고 원하는 값이 출력되지 않을까 생각했고, 실제로도 0 값이 나오기는 했습니다.좀 더 정확하게는,멀티스레드가 순차적으로 수행하지 않고 동시 다발적으로 실행이 된다면 종류는 아마,1. A thread Add() 실행B thread Sub() 실행 2. B thread Sub() 실행A thread Add() 실행3. A, B thread Add(), Sub() 동시 실행같은 경우의 수가 더 있을 수도 있지만 현재는 여기 까지 밖에 볼 수 없었습니다.만약 main() 함수에서 3번 경우에서 두 메소드에서 동시 다발적으로 처리를 수행한다면 deadlock 이 테스트를 하면서 운이 좋게 안 뜬걸로 볼 수있지만,순차적으로 Add() -> Sub() 식이라면, 즉 1번 경우라면 SpinLock 을 처음 방식처럼 구현하는 상태에서,lock_guard() 메소드를 순서를 바꿔서 처리하는 방법도 옳은 방법으로도 되는지 알고 싶습니다.int32 sum;class SpinLock{public:void lock(){ while (_locked){}_locked = true;}void unlock(){_locked = false;}private:bool _locked = false;};void Add(){lock_guard<SpinLock> guard(spinLock);for (int32 i = 0; i < 10'000; ++i){sum++;}}void Sub(){lock_guard<SpinLock> guard(spinLock);for (int32 i = 0; i < 10'000; ++i){sum--;}}void main(){thread t1(Add);thread t2(Sub);t1.join();t2.join();cout << sum << endl;}.. 생략
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MMORPG 초당 패킷에 관하여 궁금한점
안녕하세요.선생님 MMROPG 초당 패킷에 관하여 궁금한 점이 있습니다.지금 현재 Unity 클라이언트를 사용하여, 플레이어 움직임을 동기화 작업을 하고 있습니다.위메x드의 신규 게임인 나이트크로우의 플레이어 움직임을 모방하여 구현하고 있습니다.(나이트크로우는 카메라가 바라보는 방향으로 플레이어의 방향이 결정됩니다.)위,위 오른쪽, 오른쪽, 아래 오른쪽, 아래,아래 왼쪽,왼쪽,위 왼쪽,이렇게 8방향으로 움직입니다. 1초에 패킷이 얼마나 날아가는지 로그를 찍어 보았더니일반 MMORPG 게임을 하는 것처럼 움직이면 초당 평균 6개 정도 날아갑니다.하지만 인위적으로 키보드와 카메라를 엄청 움직이면 초당 최대 40번 까지 패킷이 날아갑니다. 제가 실무 경험은 없어도 MMORPG가 움직임만으로 초당 40번의 패킷을 쏘는건 문제가 있어 보입니다.그래서 나이트크로우에서는 어떻게 처리를 했나 확인하려고 들어가서 인위적으로 마구마구 움직여보니깐제 유니티 화면이랑 똑같이 마구마구 움직입니다.(다른 플레이어가 봤을 때 어떻게 움직이는지는 잘 모르겠습니다.)이러한 상황이고 패킷을 줄이는 해결방안을 모색중입니다. Dead Reckoning 방법을 써서 어느정도 패킷을 줄였는데도 짧은 거리를 마구잡이로 방향을 바꿔버리면서 이동하면 패킷이 그대로 날라가 버리게 되어서 문제입니다... <질문 요약>MMORPG 1초당 패킷 적정 수현업에서는 플레이어가 인위적으로 (앞으로 갔다 뗐다 빠르게 반복) 움직이는 걸 어떻게 처리하는지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CoreGlobal
CoreGlobal을 생성한 적이 없는데 어떻게 모든 전역변수들이 초기화 되는 건가요?