월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[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() , ~~)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WSASend
좋은 강의 감사드립니다.::WSASend(_socket, wsaBufs.data(), static_cast<DWORD>(wsaBufs.size()), OUT &numOfBytes, 0, &_sendEvent, nullptr))전체적인 소스에서 데이터가 일부만 보내진 경우에 대한 처리가 안되어 있는것 같은데요,일부만 보내지는 경우가 거의 희박하여 구현하지 않으신건지, 아니면 구현되어 있으나 제가 잘못 이해하고 있는건지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
JobQueue Push 부분관련해서 질문이 있습니다
Push 부분에서 LCurrentJobQueue가 nullptr이면 Execute를 하고 있는데, else 부분으로 떨어지는 경우가 어떻게 생기는지 이해가 잘 가지않습니다.LCurrentJobQueue는 쓰레드마다 고유하게 가지고있는 큐인데, Execute를 할때는 LCurrentJobQueue가 this가 되면서 nullptr가 아닐 수 있지만 while 반복문이 끝나야만 nullptr가 되고 Push가 실행될 수 있는데, 다른 쓰레드가 접근 불가능한 LCurrentJobQueue가 Push 실행 시 nullptr가 아닐 수 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라에서 서버 전향
안녕하세요 루키스님, 언제나 좋은 강의 감사합니다. 강의와 관련된 질문이 아니라 죄송하지만 따로 여쭤볼만한 곳이 없어 이렇게 질문 드립니다. 저는 4년차 클라이언트 프로그래머입니다. 쥬신 아카데미 출신으로 운 좋게 취업에 성공했지만 어쩌다보니 유니티로 커리어를 시작하게되어 지금까지 유니티 엔진을 사용하는 모바일 게임 프로젝트에서만 일하고 있습니다. 어렸을때부터 주로 온라인게임을 플레이 해왔었고 이직하고 싶은 팀도 MMORPG팀이지만 그런 곳은 주로 언리얼 엔진을 사용하다 보니 이직이 쉽지 않더군요 ㅠㅠ이러다 평생 모바일 수집형 게임만 만드는게 아닌가란 걱정도 들고 지금 있는 회사보다 좀 더 좋은 회사로 가고 싶다는 생각도 있다 보니 어느 순간 서버에 생각이 닿았습니다.남의 떡이 더 커보인다는건 알지만 저희 팀에서도 반년째 서버 개발자가 구인이 되고 있지 않고 있다 보니(나름 규모 있는 회사입니다 ㅠㅠ) 더 그런 생각이 들었던 것 같습니다. 여튼 그렇게 루키스님 강의와 시중에 있는 서버 책을 보며 공부도 하고 서버를 연동해 게임도 만들어 보고 있지만 회사 일과 병행하며 전향을 준비하기에는 조금 벅찬감이 있는것같아 퇴직 후 1년정도 학원(프로카데미)을 다닐까 고민하고 있습니다. 1년이 짧은 시간은 아니다 보니 회사 일을 병행하면서 준비를 계속할지 아니면 학원에 들어갈지 망설여지고 있는데 조언 부탁 드립니다 ㅠㅠ나이는 27살이고 연봉이 높은 편은 아니다 보니 이직 후 신입 연봉을 받게되더라도 크게 아쉬움은 없을 것같습니다..