묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[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 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
17분 30초 부분 질문드립니다.
안녕하세요 선생님, 항상 좋은 강의 감사드립니다.다름이 아니라 강의 17분 30초경에S_CreatePlayer newPlayer = new S_CreatePlayer() { Player = new LobbyPlayerInfo() };newPlayer.Player.MergeFrom(lobbyPlayer);부분에서 질문드립니다.여기에서S_CreatePlayer newPlayer = new S_CreatePlayer() { Player = lobbyPlayer}; 와 같이 위에서 만들어 놓은 lobbyPlayer를 바로 사용하여 코드를 작성하지 않고, 새롭게 LobbyPlayerInfo 객체를 생성해 MergeFrom(LobbyPlayerInfo)를 하는 방식으로 해야 하는지가 궁금합니다.
-
해결됨[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을 생성한 적이 없는데 어떻게 모든 전역변수들이 초기화 되는 건가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 연동 질문드립니다
벌써 루키스님 강의를 보기 시작한지 2년이 넘었습니다.항상 좋은 강의 감사드립니다 특히 요즘 다이렉트 강의보면서 혼자 공부할 때는 많이 힘들었는데 엔진 구조 개발 부분에서 많이 얻어가고 있습니다.이 강의를 공개하신 시점도 벌써 2년이 지나게 되었는데 혹시 언리얼과 게임서버 연동 하실 때 이 서버를 그대로 사용 하실 것 인지 아니면 다른 방식으로 업그레이드 후 서버 개발 후 연동하실지가 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
내장 SQL Server
SQL Server 2022에서는 SQL Server Native Client 드라이버가 제거된 것 같습니다. 이 경우에는 ODBC Driver 17 for SQL Server 드라이버를 활용하면 되나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업자료 다운로드 후 빌드 오류
첨부파일을 다운받아 그대로 빌드를 실행했는데, 다음의 부분에서 에러가 생깁니다.#if 3017001 < PROTOBUF_MIN_PROTOC_VERSION #error This file was generated by an older version of protoc which is #error incompatible with your Protocol Buffer headers. Please #error regenerate this file with a newer version of protoc. #endif이상한 점이 protoc 3.17.1 버전으로 생성한 Enum.pb.h인데 PROTOBUF_MIN_PROTOC_VERSION의 값이 3021000으로 뜹니다. 혹시 Visual studio 2022를 사용해서 ide때문에 에러가 생기는 것일까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
의사코드 질문입니다.
while 루프 내부에서 expected = false 를 굳이 왜 해야하는 질문이 들었는데요.의사코드를 보면 else 구문에서 expected = locked에 때문에 한다고 말씀해주셨는데결국 if문에서 _locked=true일 때 조건을 만족하는 경우가 생겨서 그런건가요? false로 조건을 통과해야되는 데 말이죠. (잠겼는데 통과하는 경우가 발생) 그렇다면 의사코드에서 else 구문에서 expected = _locked을 왜하는지 의문이 드는데, "그냥 칩회사에서 그렇게 구현했다." 라고 받아들이면 되는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IOCP 관련 질문이 있습니다.
이제 개발을 할때 WSASend함수를 통해 Scatter-Gether 방식으로 전달을 한다고 하면 내부적으로는 해당 데이터들이 하나의 Sendbuffe에 담겨서 가는지가 궁금합니다.WSASend에 요청한 데이터가 너무 커서 2번이상의 걸처 나눠서 전송이 된다면, 모든 데이터가 전송이 완료되어야지만 IOCP GQCS에서 완료되었다는 사실을 알 수 있는지 궁금합니다. 정리)1. Scatter-Gether를 통해서 여러 데이터를 보내면 내부적으로 1개의 Send Buffer에 담아서 보내지는지2.WSASend 호출 -> 데이터가 너무 커서 2개로 짤림이때 1개의 데이터를 전송 완료 후 GQCS OR2개의 데이터를 전부 전송 완료 후 GQCS에 등록 이 되는지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
DisconnectEx
해당함수를 사용하면 기존에 생성했던 Socket을 다시 만들필요 없이 재사용할 수 있다라고 설명하셨는데, 해당 코드를 보면 Disconnect가 될 시 Service에서 Session을제거하기 때문에 해당 Session은 메모리에서 해제가 되는것으로 알고 있습니다. 그럼 다시 CreateSocket함수를 통해서 socket이 생성되면 사실 의미가 없는게 아닌가 궁금합니다. 그냥 SocketPool을 만들어서 제가될떄 넣고, 생성될때 꺼내쓰는게 효율적일 것 같은데 혹시 어떻게 생각하시는지 궁금합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 설명란의 포폴이요
혹시 강의 설명란에 나와있는 mmorpg 3d 게임 포폴을 완성하려면 어디까지 들어야 하나요? 현재 part4까지 나와있는데 여기까지 들어도 만들 수 있는가요? 없다면 5,6 은 언제쯤 나올지 궁금합니다..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
오브젝트 풀에서 스마트포인터를 반환하는이유
안녕하세요오브젝트 풀을 사용하는 이유가 객체의 동적할당/해제의 회수를 줄이기 위함이라 생각하는데요return std::shared_ptr<T> ptr {pop(), push};을 사용하게되면 shared_ptr 내부에서 객체를 관리하기 위한 공간이 동적으로 할당되게된다고 생각되는데요. (refcount 같은것들)그렇게되면 동적할당된 객체는 재사용이되지만 동적할당 비용을 줄이기 위함은 딱히 의미가 없어진다고 생각되는데요그럼에도 쓰는게 의미가있는가요?오히려 make_shared를 쓰는게 더 나은건 아닌지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
언리얼 클라와 실습 IOCP 서버를 연동
항상 좋은 강의 감사합니다!다름이 아니라, 추후에 언리얼 클라랑 서버를 연동하는 강의가 나중에 나온다고 하셨는데 혹시 언제쯤 나오는지가 궁금해서 질문드립니다!!