묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
UniqueLock과 Lock의 차이점이 궁금합니다.
uniquelock은 lock_guard와 달리 std::unique_lock<std::mutex> uniqueLock(m, std::defer_lock);를 통해 명시해놓고 자신이 원하는 순간에 uniqueLock.lock 을 할 수 있다고 이해하였습니다. 일반적인 Lock과의 차이점은 자신이 원하는 순간에 lock을 거는 것은 똑같지만lock_guard와 같이 unlock과 같이 명시를 해주지 않더라도 일정 부분이 끝나게 되면 자동으로 unlock이되는 것이라고 이해해도 괜찮을까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadManager::Join 관련 질문입니다.
void ThreadManager::Join() { LockGuard guard(_lock); for (thread& t : _threads) { if (t.joinable()) t.join(); } _threads.clear(); }for문 후에 _threads에 들어와서 실제로 join 되지 않고 clear되는 thread가 존재 할 가능성이 있어 보입니다. 그래서 Lock이 필요하다는 생각이 듭니다. 근데 강의 코드에서는 없이 사용하셔서 Lock이 없어도 괜찮은지 질문드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
send 함수 질문이 있습니다
send를 사용할 때 블로킹 모드는 모든 데이터를 다 보내고 논블로킹은 일부만 보낼 수가 있다고 하셨는데 이 보낸다는 게 send를 사용한 사용자 커널에 있는 송신 버퍼에 보낸다는 건가요? 아니면 받는 사용자 커널에 있는 수신 버퍼에 보낸다는 건가요?그리고 논블로킹 모드에서 데이터를 일부만 보낼 수가 있으면 UDP에서는 데이터 경계의 대한 개념이 있으니까 논블로킹을 사용할 수 없는 건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LEndTickCount를 중복검사 하는 이유가 궁금합니다.
요즘에도 답 달아주시는지 궁금하네요.ㅎㅎDoGlobalQueueWork()랑 JobQueue::Execute()에서 LEndTickCount를 검사하는데 굳이 DoGlobalQueueWork()에서도 검사해야 할 특별한 이유가 있을까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
본 강의 코드에서 Event와 CV간의 논리적 순서 차이
Event는 커널 레벨에서 다른 쓰레드와 통신하기 위해 사용하는 것이고 (이런 점에서 IPC와 유사하다고 생각됩니다. 하지만 프로세스와 달리 쓰레드는 메모리를 공유하므로 더 효율적이겠구요...) Condition Variable은 유저 레벨에서 직접 구현하는 것이라 생각하면 굳이 OS API 및 커널의 도움을 받지 않고 조건을 체크한다는 것으로 이해하였습니다.CV에서...일단 락 받아조건 맞아? 조건 안 맞으면 락 풀어. 다음 기회에...다른 thread에서 신호 줄때까지 blocked위 처럼 설명하신 것 같은데, 이해가 가지 않는 부분이 몇 군데 있어 질문드립니다.Q1. unique_lock<mutex> lock(m)은 생성자에서 이미 락을 잡았을텐데, 왜 cv.wait()에서 "1) Lock을 잡고" 부분에서 다시 락을 잡는건지 궁금합니다. 100% 락을 잡았다는 보장이 없는 것인가요?? 생성자에서 락을 잡지 못하면 어차피 다음 코드 실행이 안되지 않나요? (혹은 조건을 불만족했을때 cv.wait()에 대한 루프를 돌아야 하기 때문에 락을 다시 잡는 것인가요?)Q2. 왜 예제 코드에서는 Event 방식보다 CV 방식이 효율적이라고 하신건지 궁금합니다.결국 CV방식에서도 Blocking된 쓰레드를 깨우려면 커널의 도움을 받아야 하는 것 아닌가요?로직 상으로도 둘 다 바쁜 대기가 존재하지 않고 같은 순서로 동작하는 것 같은데 코드의 길이가 줄어서 효율적이라고 하신 건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReleaseRef 질문이 있습니다!
WraightRef wraight(new Wraight());wraight->ReleaseRef();wraight = nullptr;wraight 에 nullptr을 넣어서 ReleaseRef가 수행하는 도중에 위처럼 (중간에 개입)을 써 놓은 부분에서 다른 WraightRef가 wraight를 참조를 시도한다면 reftCount는 0이 되지만_refCount는 1이 되어서 delete this가 실행이 되면 문제가 발생하지 않나요??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
API 종속에서 자유로워지기
강의 초반부에 windows.h같은 헤더를 사용하게 되면 추후 바꿔야 될 부분이 많아 표준인 thread를 사용한다고 하셨습니다.강의가 window os기반으로 구성되어 있고, 제가 window os는 잘 사용해 보지 않아 막연한 걱정이 있는데, 그럼 window에서 작동하는 IOCP로 서버 구성시, 추후 리눅스로 옮겨갈때 epoll로 바꿔주는 과정에도 엄청한 자원이 소모되지 않나요? 현업에서는 대부분 window os로 서버를 구성하나요? epoll에 대해서도 꼭 공부가 필요한지, IOCP에 비해 중요도가 떨어지는지도 궁금합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코어와 쓰레드의 매핑관계가 잘 이해가 가지 않습니다.
10:30부근에 말씀하시는 내용을 들어보면,쓰레드의 개수 = 코어의 개수 일때 가장 이상적이라고 하셨습니다.CPU가 4코어일때 하나의 프로세스(MMO서버)에 4개의 쓰레드가 가장 이상적이라는 의미인가요?멀티코어 프로세서에서 같은 프로세스여도 서로 다른 쓰레드이면 각 코어마다 같은 프로세스의 서로 다른 쓰레드 작업이 가능하다. 이게 가능한 이유는 유저모드 쓰레드가 아닌 커널 모드 쓰레드 이기 때문이다.제가 이해한 위 내용이 맞는지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 내용 깃허브 또는 블로그 정리 관련 질문
안녕하세요.강의 들은 내용을 전반적으로 깃허브에 정리하려고 합니다.강의 캡쳐본이나 강의 예시 코드를 정리하고 작성을 하면서 이해하는 방식으로 학습하려고 하는데, 공개된 공간에 출처를 남긴 후 강의 캡쳐본이나 예시 코드를 함께 작성하여 정리해도 되는 지 여쭤봅니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
shared_ptr을 사용해도 되지만 소멸자에서 pool에 있는 애들을
shared_ptr을 사용하는 이유가 Pop한 오브젝트나 메모리 청크를 반납하지 않을까봐 걱정되어서라고 이해했습니다.그런데 MemoryPool 클래스 소멸자에 이미 풀에 있던 애들을 모두 메모리 해제해주고 있는데 이것을 굳이 걱정할 필요가 있는지 궁금합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
파트 6 서버연동에 대해 질문합니다.
파트4에서는 5장에서 간단하게 다루고 파트 6에서 연동에 대해서 제대로 다루는 것으로 알고 있는데 혹시 파트 6는 언제 나올까요?부트캠프로 하신다고 하셨는데 제가 대학생이라 부트캠프를 참가할 여력이 안되는데혹시 온라인 강의로는 언제 공개될까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 분산 처리 에 대해서는 혹시 다룰 예정이 없으신가요?
게임서버만 제작하셨는데 DB 서버나 채널 등등 scale-up 관련으로 혹시 다룰 생각 없으신가요? 그리고 다른 질문에서 "나머지 MMO 컨텐츠는 추후 실전 부트캠프 강의에서나 다룰 생각입니다."이렇게 대답해주신거를 들었는데 부트캠프 강의 일정은 혹시 언제쯤 가능할지 알수 있을까요?끝으로 좋은강의 너무 감사합니다 다른 강의도 너무 잘듣고 있습니다.,
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 7:42 에 해당하는 내용에 대해서 질문입니다
안녕하세요. 강의 7:42 부분에 대해서 질문이 있습니다.말씀해주신 내용처럼 _popCount 가 1인지 체크하고 oldHead를 delete 하는 사이에 다른 쓰레드에서 TryPop() 함수를 참조하게 되는 상황이 헷갈리는데요. 만약 1번 쓰레드가 TryDelete 함수 내부에서 oldHead를 delete 했는데, 2번 쓰레드가 compare_exchange_weak 함수를 콜하게 된다면 이미 지워버린 oldHead 에 대해서 참조를 하게되는 상황이 문제가 될 듯 하여 질문드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
언리얼엔진과 IOCP 서버 연동시
서버에서 언리얼엔진의 네비메시나 비헤이비어트리 같은건 사용을 할 수 없나요?아니면 언리얼엔진 내부 코드를 분석하고 뜯어와서 C++서버에 이식을 하는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티스레드 프로그래밍에서 디버깅하면서 문제 추적하려면 어떻게 해야하나요?
멀티스레드 병렬 프로그래밍은 싱글 스레드와 다르게 디버깅하기가 매우 까다롭더라구요 ㅠㅠI/O 출력을 하거나 로그 파일로 따로 빼서 로깅을 확인하는건 싱글스레드까지만 가능하고 멀티스레드에서는 별 도움이 되지 못하더라구요이 외에 다른 방법으로는 디버깅 모드로 실행 시 문제가 발생했을 때, memory를 확인하면서 역추적하면서 문제를 해결하는 방법밖에 떠오르질 않는데, 이 방법이 맞을까요?예를 들면 여러 스레드를 실행하면서 call 횟수, 작업하는 변수의 주소값, 수행 시간 등을 list에 저장한 다음에 조사식에 해당 list를 끌어와서 확인해보려고 하는데...현업에서는 멀티스레드 로깅 및 문제 역추적할 때 어떤 방법을 사용하나요..?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C++ 인스펙터 기능 문의드립니다.
C#개발을 주로 개발하는 개발자입니다. C#만가지고는 안될 것 같아서 C++을 공부하고있는데 함수나 변수 뒤에 . 찍어서 어떤 기능이 있는지 보여주는 인스펙터 기능이 C#에 비해 너무 불편해서 혹시 편리한 어떤게 있는지 궁굼해서 문의 드렸습니다. ㅠ ;빠진 부분도 오류가 안나와서 함참찾아야하는게 너무힘들어요 ㅠ .찍어도 나올 때도 있고 안나올때도있고 ㅠ 어렵습니다.!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요! 서버 연결 관련 질문드리고 싶은게 있습니다!
안녕하세요 강사님!강사님의 수업을 듣고 서버를 넣은 개인 포폴을 제작 중인 학생입니다서버와 클라이언트 연결문제가 있어서 질문드리고 싶은게 있습니다 같은 공간에서의 서버와 클라 연결에서는 문제가 없습니다 하지만 다른 공간에서 연결이 되지않는 문제가 있습니다 기본 게이트웨이가 다르면 연결이 되지 않는것 같아요 그래서 하마치 같은 프로그램을 사용하면 연결이 됩니다.. 이런 문제는 라우팅이 안돼서 발생하는 문제인가요? 제가 수업에서 놓친부분이 있는건지.. 이런 문제는 어떻게 해결할 수 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
연산자 정렬시 어떤 단축키를 이용하시는건가요?
31분쯤에 operator를 정렬 해줄때 어떤 단축키나 설정을 눌러서 하시는걸까요? 그리고 보통 이런 패턴으로 정렬을 많이 하시나요 업무에서?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
AcceptEx, ConnectEx 사용에 도움을 받고 싶습니다.
안녕하세요,비동기, 논블록 환경의 IOCP 서버를 구현하고 있습니다.문제는 AcceptEx, ConnectEx 호출 후 GetQueudCompletionStatus 를 호출하면 정상적으로 TRUE 의 값이 출력됩니다.하지만 서버에서 AcceptEx 를 호출하고, 완료 통보를 받았다면 서버가 클라이언트 소켓을 받아야 하는데 정상적으로 처리 되지 않는거 같습니다. 위 문제에 대한 코드에서 어떻게 해결 방안을 받거나 선생님의 도움을 받을 수 있을까요?왜냐하면 AcceptEx -> GetQueudCompletionStatus -> setsockopt 에서 AcceptEx 에 들어오는 소켓의 옵션을 설정해 주어야 한다고 마이크로 소프트 공식 문서에 써져 있는 것을 확인했습니다.하지만 옵션을 바꿔주기 전에 accept 소켓이 연결되어야 하는 상태인데 WSAENOTCONN 의 오류를 반환 받았습니다.하단 링크는 구글 드라이브 공유 링크입니다.문제가 있는 솔루션입니다.참고한 문서들은,소켓 오류 : https://learn.microsoft.com/ko-kr/windows/win32/winsock/windows-sockets-error-codes-2Github C 로 구현한 IOCP 비동기 논블록 서버 : https://github.com/YDYDWang/libiocpsocket/blob/master/sock.c#L335기본적인 IOCP 내용 블로그 : https://narakit.tistory.com/m/category/Computer%20Science%20%EA%B8%B0%EB%B3%B8%20%EC%A7%80%EC%8B%9D/%EC%86%8C%EC%BC%93%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DAccpetEx 에 대한 마이크로 공식문서 : https://learn.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptexLink : https://drive.google.com/file/d/1s8na3xe-o5nPPb8W6xuLMdl27XRfNChQ/view?usp=drive_link감사합니다 :)
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unreal과 연동
안녕하세요. 감사하게도, 좋은 서버 강의 잘들었습니다.끝으로 교육해주신 서버소스를Unreal엔진에 연동하기위해서 참고할 자료나 가이드가 있을지 여쭙고자 질문 남겨드립니다.확인 한번 부탁드리겠습니다. 감사합니다. 김준한 드림.