월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock-Based Stack / Queue 강의 관련 질문입니다.
안녕하세요. 선생님.항상 좋은 강의 만들어주셔서 감사합니다.다름이 아니라 강의 영상을 보면 queue의 TryPop(OUT data)와 같이 OUT이 TryPop 함수 다음에 붙어있는데요.visual assist에서 제공해주는 기능인 것인가요?찾아봐도 C++ 관련 OUT 키워드 문법이 없는 것 같고, 해당 키워드를 입력해도 저는 컴파일이 되지 않아서 질문드립니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Push의 LCurrentJobQueue관련 질문입니다.
현재 JobQ에 Push하는 과정에서LCurrentJQ를 확인하여 GlobalQ에 넣을지, 스스로 실행할 지를 결정하는 것으로 보입니다. TLS는 각 Thread마다 별개의 주소 공간으로 소유하고 있는 것처럼 동작한다고 이해하고 있습니다.한 thread에는 실행 흐름이 하나인 것으로 알고 있는데LCurrentJobQueue가 nullptr이 아닌 상황에서 Push가 발생할 수 있나요?Execute를 실행하는 thread의 LCurrentJQ만 nullptr이 아닐 것 같은데 Execute가 실행 중인 thread라면 Push를 동시에 실행할 수 없을 것으로 생각됩니다. ㅜㅜ
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SendBuffer Pooling 관련 질문있습니다.
여기서 다 썼으면 버리고 새거로 교체할 때 교체하지 않고 그냥 Reset만 호출해서 _usedSize를 0으로만 해줘도 되지 않을까 했었는데 WSASend를 호출하는 과정에서 아직 예전 버퍼가 날아가면 안되는 상황이 있기 때문에 새로 할당해준다. 가 맞게 이해한 부분인가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ACQUIRE_TIMEOUT_TICK에 관해 질문이 있습니다.
여기서 ACQUIRE_TIMEOUT_TICK 보다 작업 시간이 길어질 때도 일반적인 경우 엄청난 문제가 있다고 생각하지만... 여기서 CRASH를 때려서 서버를 죽이는 것이 맞는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Job 생성자 관련 질문입니다.
위의 생성자를 이용하여 아래와 같은 코드로 job 객체를 따로 생성해보려고 하였습니다.맞는 생성자 instance가 없다고 하며 코드가 정상 동작 하지 않았습니다.JobSerializer::PushJob의 과정을 똑같이 따라한 것 같은데 동작이 안되는 이유를 모르겠습니다.원인을 알고 싶어 찾아보았으나 제가 template 에 대한 이해가 미숙하여 어떤 이유로 객체 생성이 되지 못하는 건지 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷 데이터 크기를 유동적으로 바꾸고싶습니다.
안녕하세요. 선생님지금 탑뷰 PVP게임 슈팅게임을 포폴로 만들고있습니다.서버에서 현재 월드에 올라와있는 객체들의 데이터를 클라이언트한테 보내있습니다. ex)모든 객체Update패킷{객체[10];}예시로 이런식으로 패킷내부에 최대 객체배열의 크기를 10개로 잡고 데이터를 전달하는 형식으로 하고있습니다. 이때 현재 존재하는 객체의 갯수 만큼 크기를 잡아 패킷을 전달하고싶습니다. 아 또 추가로 질문이 있습니다.보통으로 패킷의 최대량을 몇으로 설정하시나요? 구글링을 해보니까 네트워크 전송과정 때문에 1460바이트를 되도록 넘지 말라고 되있더라구요. 그래서 저는 1024바이트로 맞춰놨습니다.
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TLS와 공유자원
제가 강의를 시청하고나서 TLS 같은 경우에는 각 스레드 별로 사용할 수 있는 extern 변수를 따로 만들어 준 느꼈습니다. (실제 강의에서도 그렇게 말씀하셨구요) 근데 이걸 서로 다른 스레드에서 읽거나 수정할 수 없다고 하면, 서로 다른 스레드에서 읽고 수정할 수 있는 공유 자원과는 좀 거리가 먼 느낌이 있어 활용도가 낮을 것 같다는 개인적인 생각이 드는데... 강의에서 예로 드신 사례 외에 게임쪽 과 관련해서 추가적인 예가 있을까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TLS의 물리적 저장소 위치가 어디인가요?
TLS는 쓰레드마다 가지고 있는 고유한 저장 공간인데메모리 모델 강의에서 나온 CPU코어 마다 가지고 있는 고유 캐시 영역에 저장이 되는 것인지아니면 RAM에 쓰레드 갯수만큼 공간이 할당되는 것인지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
저연차 프로그래머 공부 방향성 질문입니다.
안녕하세요. 강의에 많은 도움을 받고 있는 저연차 게임 프로그래머입니다. 코드 리뷰만 받으면 설계나 코드 구조로 매번 지적받는데, 공부 좀 하라는 소리을 들어도 언어 문법이나 프로그래밍 기술 이론과 달리 어떻게 공부해야 하는지 감이 잘 잡히지 않습니다. ㅠㅠ나름대로 클린 코드나 리팩토링같이 근본(?)이라 하는 책들도 읽어 봤지만 읽을 땐 그렇구나 하면서 술술 읽다가도 실제 코드에 적용하려 하면 잘 와닿지 않는 것도 사실입니다.코드 설계나 좋은 구조를 짜는 능력은 어떻게 쌓는것이 좋을까요? 혹시 도움받으신 강의나 책이 있는지 궁금합니다.강의 내용과 직접적인 관련이 있는 질문은 아니지만… 궁금증이 생겨 남겨봅니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session의 RegisterSend 의 wsaBufs 관련해서 질문드립니다
Vector<WSABUF> wsaBufs; wsaBufs.reserve(_sendEvent.sendBuffers.size()); for (SendBufferRef sendBuffer : _sendEvent.sendBuffers) { WSABUF wsaBuf; wsaBuf.buf = reinterpret_cast<char*>(sendBuffer->Buffer()); wsaBuf.len = static_cast<LONG>(sendBuffer->WriteSize()); wsaBufs.push_back(wsaBuf); }강의의 코드는 위와 같이 작성되어 있습니다.이렇게 할 경우 wsaBufs.push_back(wsaBuf) 가 복사 연산으로 수행되는 건가요?만약 그렇다면 복사 연산을 거치지 않고 바로 객체를 벡터에 넣을 수 있는 방법은 없을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
wait이 끝나면 어떻게 되나요?
안녕하세요queue가 비어있어서 잡았던 lock을 풀고 대기하다가 notify_one함수가 알려주면 다시 wait함수부터 실행이 되는건가요? 만약 그렇다면 다른 Consumer 스레드(있다면)와도 wait함수를 통해 lock을 잡으려고 race를 할 텐데 그럼 unique_lock 선언을 while문 밖에서 해줘도 상관이 없을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
event 관련 질문 있습니다.
동일한 내용으로 동일한 코드를 쳤는데 디버그로 cpu 점유율 확인시 저는 똑같이 8% 가 나오는데 혹시 어떤 부분에서 이러한 차이가 나는지 알 수 있을까요? mutex m; queue<int32> q; HANDLE handle; void Producer() { while (true) { { unique_lock<mutex> lock(m); q.push(100); } ::SetEvent(handle); this_thread::sleep_for(10000ms); } } void Consumer() { while (true) { ::WaitForSingleObject(handle, INFINITY); unique_lock<mutex> lock(m); if (q.empty() == false) { int32 data = q.front(); q.pop(); cout << data << endl; } } } int main() { handle = ::CreateEvent(NULL/*보안속성*/, FALSE/*bManualReset*/, FALSE/*bInitialState*/, NULL); thread t1(Producer); thread t2(Consumer); t1.join(); t2.join(); ::CloseHandle(handle); }
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
STOMP Allocator 미사용시 에러가 발생해 문의드립니다
JopQueue 강의의 소스코드를 내려받아 테스트중입니다.다음과 같은 변경 사항을 시행했습니다ServerCore 의 Types.h 의 #define _STOMP 를 주석처리위와 같이 할 경우 발생하는 GSessionManager, GRoom 생성 관련 에러를 해결하기 위해 실제 객체를 Main 에서 생성하도록 수정DummyClient 에서 대량의 클라이언트(3000 개)를 만들도록 변경이후 서버를 켜면, 잠시 후 MemoryPool::Pop 에서 익셉션이 발생합니다.다음과 같은 환경에서 실행중입니다비주얼 스튜디오 2019Release, x64혹시 강사님도 동일한 문제가 발생하는지, 발생한다면 원인과 해결 방법을 알려주실 수 있을까요? 감사합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트 이동키 입력시 처리방법
안녕하세요 선생님동영상 강의를 다보고 탑뷰, PVP, 논타겟 슈팅 게임을 만들고 있습니다.그러다 이동키 관련되서 궁금한점이 생겨 질문드립니다.w,a,s,d를 이용하여 캐릭터의 이동처리를 하는데 클라이언트 프레임이 60프레임이라고 했을때 프레임마다 패킷을 서버에 보내는것은 아닌것 같았습니다. 이거에 대한 여러가지 시도를 해봤는데 결과적으로 만족스럽지않았고 삽질만 하게 되었습니다. 이거에 대한 해결방법이 있을까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
제가 RW락을 제대로 이해한 건지 질문드립니다.
write-lock은 락을 건 스레드를 제외한 모든 스레드가 블로킹된다.write-lock 후에 read-lock을 잡는것은 허용된다.그 반대는 불가능하다.read-lock상태에서 값의 변경은 없어야 한다.제가 제대로 이해한 것인지 모르겠네요..ㅎㅎ
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 관련해서 고민이 있습니다.
안녕하세요.현재 게임 서버를 지망하고 있는 대학생 3학년 학생입니다. 아마 내년 여름? 부터 프로카데미라는 학원에 다니게 될 것 같습니다. 현재 반년동안 시간이 남는데, 그 동안 rookiss님의 게임 서버 강의와 그 외의 cs이론지식들을 공부하려고 계획을 하고있습니다만,제가 우려되는 점은, 강의를 통해 기술을 습득하게되어, 답을 알아버리면 개인이 문제를 직면하고 헤딩하는 이러한 과정이 없어지지는 않을까?라는 점입니다. 원장님의 무료 수업을 들었는데, 이러한 부분을 강조하셔서 고민입니다. 그렇다고 반년동안의 시간이 있는데, 아무것도 안하고 있기에는 스스로 불안하고, 그렇다고 아예 독학하기에는 막막하고 이러한 상황입니다..프로카데미에 다녀본 선배님으로써, 학원가기전에 Rookiss님의 c++ 서버 강의를 듣는 것이 도움이 될지, 조언부탁드립니다.작년부터 Rookiss님 강의 정말 잘 듣고있습니다. 작년에 군 복학하고 C++강의부터 듣기 시작했는데 벌써 시간이 빠르게 지나 취업을 고민할 시기가 되어버렸네요. 항상 좋은 양질의 강의를 올려주셔서 감사합니다!
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
packaged_task를 이용한 잡큐
안녕하세요 루키스님잡큐를 공부하면서 궁금사항이 있어서 질문드립니다.https://modoocode.com/285우연히 packaged_task와 future를 이용하여서 쓰레드 풀을 구현하는 글을 보게 되었는데흥미로워서 참고하면서 공부를 하고 있는데이런 방식으로 잡큐를 구현하였을 때 접속자 수가 많은 mmorpg에서는 문제가 되나요??또,멤버함수를 받을때 Ret(T::*memFunc)(Args...)를std::function<Ret(T&, Args...) memFunc 이런식으로 변경하면 오류가 나는데똑같은 함수를 받는 포인터인데 왜 오류가 나는지 궁금합니다!감사합니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
기존 쓰레드 - Oh my god (Select모델 강의)
예전에 작업할 때, 소켓 접속마다 쓰레드 만들어줬었는데그렇게하면 안되는거였군요.구글에 찾아봐도 대부분 소켓마다 쓰레드 만들던데 (물론 국내 사이트)
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스마트포인터 관련 질문입니다
현업에서는(클라,서버) raw ptr 대신shared_ptr로 많이 쓰는 추세인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CreateIoCompletionPort 사용 문의
좋은 강의 감사합니다. 이전 Completion Port 강의와 비교하며 이해하는 과정에서 물음의 생겨 질문드리게 되었습니다. Listener내 StartAccept에서 CP 등록을 하는 부분에서 물음이 있습니다.이전에는 listenSocket을 accept한 결과 값인 clientSocket을 CP에 등록한 반면,현재는 listenSocket 자체가 CP에 등록되는데, 이러한 차이가 발생한 이유를 알수있을까요 ?현재 코드에서 AcceptEx 동작이후 session->GetSocket() 에 대해 CP에 등록을 하지 않은 이유는 무엇인가요 ??[이전 Completion Port 강의]1. listen Socket 생성 , bind(), listen()2. accept() SOCKET clientSocket = ::accept(listenSocket, (SOCKADDR*)&clientAddr, &addrLen);3. 소켓을 CP 등록 ::CreateIoCompletionPort(clientSocket , ~ ~)[현재 강의]1. listen Socket 생성2. listenSocke을 CP 등록 ::CreateIoCompletionPort(listenSocket , ~ ~)3. bind(), listen()4. clientSocket 생성 (session() 생성자)5. AcceptEx(_listenSocket, session->GetSocket() , ~~)