월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ABA problem가 잘 이해가 안돼요
여기에서, 5000번지->6000번지->7000번지 이렇게 각각 연결되어있는데,interlock을 잡기 이전에 2번의 pop과 1번의 push가 일어났고, 그때 5000번지에 다시 새 데이터가 할당돼서 push된 상황이므로5000번지 -> 7000번지인 상황이 만들어졌다고 하셨는데,애초에 이 상황까지 만들어졌다면 push에서 atomic하게 5000번지가 header에 삽입되는 동시에 5000번지의 next도 7000번지로 바꿔줄텐데그때 expected = header->next;의 주소가 아직 5000번이라면 5000번지가 pop이되고 5000번지의 next가 header가 되는데, 이미 5000번지의 next는 7000번으로 Push부분에서 이미 변경되었으니 정상적으로 header는 7000번지의 주소를 가리키는게 맞는거 아닌가요?어떤 부분에서 생각이 틀린건지 잘 이해가 안됩니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OUT 키워드
Reader-Writer Lock에서Read Lock과 Write Lock을 할 때 compare_exchange에서 OUT 키워드를 사용하는데 이 키워드를 왜 쓰는지 어떨 때 쓰는지 궁금합니다!!if (_lockFlag.compare_exchange_strong(OUT expected, expected + 1))
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
동일한 쓰레드의 소유권 정책에 대해 궁금합니다.
안녕하세요!동일한 쓰레드가 write_lock을 잡고 있을 때는 read_lock을 잡을 수 있지만 read_lock을 잡고 있을 때에는 write_lock을 잡을 수 없다는 것 까지는 이해가 됐습니다.그래서 ReadLock() 메소드에서 같은 쓰레드가 write_lock을 잡고있는지 체크를 해서 잡고있다면 단순하게 read flag를 1 증가해서 통과해주고 있죠.근데 그렇다면 WriteLock() 메소드에서는 동일한 쓰레드가 read flag로 0을 갖고있는지 확인해야 하는 것 아닌가요? R -> W가 허용되지 않는다면, write_lock을 시도 할 때에 동일 쓰레드의 read flag가 0인지 체크하는 코드가 없어도 되는 이유가 뭔지 궁금합니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
iocp server에서 dedicated server
안녕하세요 ! 어렵지만 열심히 반복해서 서버 강의를 듣고있는 학생입니다.다름이 아니라 iocp 서버로 Lobby를 제작하고 dedicated server로 InGame을 제작해서 2개의 서버를 함께 돌리려고 합니다.iocp server로 Lobby Level을 구성하고 3명이 한팀을 이뤄 MatchMaking을 통해 dedicated server로 만들어진 InGame Level로 넘길 생각입니다!iocp server와 dedicated server를 연결해두고, 클라이언트들을 옮기는 방식을 쓰려고 구상을 했는데, 제가 만든 iocp server와 dedicated server를 어떻게 연결할지 감이 안와서 질문드립니다.혹시 이 방법이 불가능한지에 대해서도 여쭙고싶습니다. 감사합니다
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부방법에대한 질문입니다
강의를 한 번 정주행 하였는데 코드는 이해가 어느정도 가기는 하지만 이를 어떻게 활용해야 할지 갈피가 잡히지 않네요 ㅠㅠ강의를 반복해서 들어보는게 좋을까요? 아니면 혼자 프로젝트를 진행해 보는게 좋을까요??
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
compare_exchange_strong 의사 코드에 대해 질문이 있습니다!
expected가 레퍼런스로 들어가서 expected의 값을 while 안에서 계속 false로 초기화해주는 것에 대해 좀 의구심이 듭니다. 그냥 expected 자리에 레퍼런스 대신 boolean 리터럴 값으로 false를 넘겨도 문제가 없을 것 같은데, 왜 굳이 레퍼런스를 넘기도록 강제하고 있는 것일까요? if (mbLocked == expected) { expected = mbLocked; _locked = desired; return true; } else { expected = mbLocked; return false; }이 의사 코드에 보면그냥 return true, return false만 해줘도 될 것 같은데 굳이 expected를 초기화 해주는 이유가 궁금합니다.제대로 알려면 어셈블리 레벨에서 도는 코드를 봐야 하는 걸까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 동적할당 질문 드립니다.
안녕하세요 강사님 동적 할당으로 메모리를 할당해서 패킷을 보낼려고 하는데왜 (int dir, bool wDown) 값을 추가해서 메모리를 동적할당 하게 되면 메모리 엑세스 위반 에러가 나오게 되는건가요?왜 이런 에러가 뜨는건지 감을 못잡겠어서 질문 드립니다...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부방법에 대해서 질문드립니다
공부방법을 어떻게 하면 좋을까요?강의를 듣고 스스로 코드를 구현해보는 방식으로 하면 될까요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
queue의 데이터 이외의 공간?
MemoryPool에서 queue나 vector을 사용하면 데이터 뿐만 아니라, 데이터를 담아두기 위한 공간이 별도로 할당된다고 하셨습니다. 이 별도의 공간이 무엇인지 잘 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
sleep_for과 yield 차이 질문드립니다.
안녕하세요! 멀테스레딩 강의(Lock 구현 부분) 수강 중에 제가 제대로 이해가 안 가는 부분이 있어서 질문드립니다.구체적으로 강의 코드에서 sleep_for와 yield의 내부적 동작?을 저는yield(): lock이 잠겨있는 경우, system time slice에 상관없이 바로 context switching이 발생해, 해당 스레드가 다시 운영체제 스케줄링 큐에 들어가 운영체제가 다시 실행시켜 줄 때까지 대기sleep_for(n): lock이 잠겨있는 경우, yield와 마찬가지로 컨텍스트 스위칭이 바로 발생하는데, n시간동안 해당 스레드가 sleep thread 큐에 저장되어 있다가, 그 다음에 스케줄링큐로 들어가서 이후에 다시 실행될때까지 대기이해했는데, 이게 제대로 이해한게 맞을까요?특히 sleep_for의 동작이 이해가 잘 안가는데, 스택오버플로우에서는 https://stackoverflow.com/questions/17325888/c11-thread-waiting-behaviour-stdthis-threadyield-vs-stdthis-threadsleep_for(n)의 경우 최소 n시간 이상을 block한다는데, 해당 스레드가 블록되었다는 말이 컨텍스트 스위칭이 되어있다는걸까요? 또 sleep thread queue는 운영체제에서 관리하는 개념일까요? (제대로 이해를 못해서 질문이 두서 없는 점 죄송합니다....)
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 릭이 쌓이고 있는지에 대한 체크
안녕하세요 선생님유니티 클라, C++ 서버로 탑뷰 슈팅게임을 만들고있습니다.C++서버가 종료됐을때 메모리 릭이 남는것이 아닌 프로그램이 가동중에 유저, 총알등이 삭제되고 생성되면서 계속해서 릭이 쌓이고있는지 확인하고 싶은데 방법이 있을까요?선생님이 알려주신 메모리기법들은 적용하지 않았습니다.(알려주신것들을 최대한 공부하고 이해는 했기 때문에 어떻게든 써먹을수있겠지만 적용하지 않은 이유는 제가 감당할수없기 때문입니다. 문제가 생겨 필요한 상황이 나왔을때 그때 구현해볼 생각입니다. 사용하는 부분들도 있습니다. 버퍼관리라던지...)
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트 프로그래머 커리어 고민
안녕하세요 루키스님! 저는 4년차 유니티 클라이언트 프로그래머입니다.강의 항상 잘 보고 있습니다! 최근 여러 일을 병행하시느라 바쁘신것으로 알고있는데 이런 질문 드려 죄송합니다. 꼭 답변해주지 않으셔도 괜찮습니다!https://www.inflearn.com/questions/680598/%ED%81%B4%EB%9D%BC%EC%97%90%EC%84%9C-%EC%84%9C%EB%B2%84-%EC%A0%84%ED%96%A5저도 이 글에 질문자분처럼 유니티로 커리어를 시작했고 4년차가 되었고 비슷한 이유로 유니티쪽 프로젝트에 신물이 난 상황이라 언리얼 클라이언트 혹은 게임 서버 프로그래머로 전향을 생각하게 되었습니다.저 질문자분처럼 서버 학원을 다닐 생각은 아니지만 퇴근후에 짬짬히 언리얼이든 서버쪽이든 공부해 이직을 하고 싶은데 루키스님은 저 질문글에서 서버쪽보다는 언리얼 클라이언트로의 전향을 추천해주셔서요.같은 클라이언트지만 언리얼 경력이 없다보니 이직을 하더라도 유니티 경력을 온전히 인정받지는 못할것같은데 언리얼 클라이언트쪽을 추천해주신 이유를 알 수 있을까요?사실 질문자분이랑 엄청 비슷한 상황이고 언리얼이든 서버든 기초는 있는 상태입니다. 둘다 흥미는 있지만 뭔가 서버쪽이 MMORPG에 서포터(힐러)처럼 좀 더 대우받는것같고 큰 기업쪽에 취업이 쉬울것같다는 인상때문에(+ UI 안해도되는) 서버쪽에 마음이 가는데 조언 부탁드립니다 ㅠㅠ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock-Based Queue 병목현상 질문 드립니다.
Lock-Based Queue를 제작하여 테스트를 할 때 waitPop을 사용할 경우 sleep을 지우고 디버깅을 해보면 Queue 사이즈가 무한정으로 늘어납니다. Push를 한 번 Pop을 2번 돌려도 마찬가지입니다. 실제 스레드에서 사용할 시에는 sleep을 사용하지 않고 while문으로 돌리게 될텐데, wait를 쓰면 이렇게 병목현상이 발생하는 걸까요? 이 현상을 해결할 방법은 없나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
할당 범위? 오류? 질문 있습니다. 메모리 매니저 생성자 부분
강의영상 23;29초을 보면 두 번째 루프가 1024부터 시작함0~1024바이트까지는 32바이트 단위로 증가1025~2048바이트 까지는 128바이트 단위로 증가즉 1025바이트가 필요하면 1024+128바이트의 메모리 풀에서 메모리를 가져다 쓴다(메모리 매니저의 pools의 1025번지는 1024+128단위로 할당되는 메모리 풀을 가리킨다.)로 의도하셨다고 생각이 듭니다.하지만 size=1024로 대입하는 구문을 빼면size=1024+32 부터 시작합니다.따라서 사용자가 1025바이트가 필요로 하면메모리 매니저의 pools의 1025번지에는 1024+32바이트의 메모리풀에서 pop해서 사용할 것 같습니다.의도했던것에서 값이 밀렸기에 3번째 루프에서 size는 2080에서 시작하고2080 > 2336>2592 >...>3872 > 4128루프탈출그렇기에 3873~4096번지까지는 NULL이들어갑니다. 루프시작시에 1024, 2048부분이 들어가야 할 것 같습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MemberJob 생성자 부분에서 에러가 발생해 질문드립니다.
아래 질문을 올리신 분과 동일한 문제인데 아래처럼 에러가 발생합니다.강의 중간에 std::apply( )를 사용하기 위해 c++ 17로 변경하셨고, c++17 이전 버전에서 동작하기 위한 xapply 코드를 작성하셨습니다. 저의 생각으로는 std::apply( )를지원하지 않는 이전 버전에서 동작하기 위함이니까 저의 원래 환경인 c++14로 변경해서 빌드를 진행하니 에러가 발생합니다.일단 다시 c++17로 변경해서 진행해보니 에러는 발생하지 않는데 강의에서 설명하신 코드(MemberJob)가 c++17 이전 버전에서는 동작하지 않는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LIst<구조체> 형태의 패킷을 보내는 방법이 있나요?
List<구조체> 형태를 패킷으로 보낼려고 하는데 BufferWriter부분에서 List<구조체> 데이터를 쓸때 엑세스 위반의 오류가 나오게 됩니다.List<구조체> 형태의 패킷을 보내는 방법이 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
기능 구현을 할 때 어떤 생각을 하고 만드시는지요 ?
기능 구현을 하실 때, 어떠한 기능을 구현할 것인지 먼저 결정하고 실제 구현을 하고나면 해당 기능은 특정 이벤트가 발생할 때, 컨트롤러나 이벤트 핸들러단에서 로직을 호출할텐데 이때 궁금한점이... 기능을 구현하실 때 특정 컨트롤러나 핸들러단에서 호출해준다고 가정하고 구현하시는게 맞으신가요 ??(예를들어, AccountManager나 UserManager 객체에서 제공하는 기능들에서도 어디에서 호출되는지는 생략하고 특정 기능을 구현하시는 부분)개발에 대한 이해가 부족한 상황에서 무작정 게임 개발이 궁금해서 도전하게 되었는데... 해당 부분이 자꾸 생각나서 질문 남겨봅니다. 감사합니다 :)
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IOCP 서버 연동 강의 출시 및 프로그래밍 커리큘럼 관련 문의를 드립니다.
안녕하세요. ROOKISS강사님. 강사님의 c++ 과 서버 강의에 연일 감동을 받으면서 공부중인 퇴사한 직장인 취준생입니다. 사실 저는 학부는 전자과를 나와서 대학원을 정보보안쪽을 나왔으나 프로그래밍에 대한 콤플렉스가 있었습니다. c언어 f학점을 받고 프로그래밍과는 담을 쌓았던 웃지못할기억이 있습니다. 그러나 직장을 6년 다니면서 문서작업업무를 주로 하면서 개발을 모르면 it에서 성장하는데 한계가 있음을 느끼고 직장정치등의 여러 사정에 과감히 퇴사를 결심하고 다시 취업을 준비중입니다. 개발역량을 키우고자 프로그래밍 공부를 하던중 강사님 커리큘럼을 알고 주저없이 신청하게 되었습니다. 제가 개발실력은 많이 형편 없지만 강사님의 서버커리큘럼을 보고 우선은 서버 커리큘럼은 무조건 다 뛰고 강사님께서 설명하신 내용을 제가 안보고 코드를 짤 수 있는 역량을 기르기로 마음먹은 상태입니다. 궁금한 점은 제목과 같이 다음과 같습니다.iocp서버 연동강의 출시일 대략 일정은 어떻게 될까요?강사님의 c++과 c# 서버 커리큘럼외에 c#웹개발/DB도 들을 생각입니다. 혹시 추후에 C++로 웹개발이나 DB, 프레임워크와 같은 강의도 출시 계획이 있으신지와 있다면 대략적인 일정이 궁금합니다.WINAPI의 경우 나온다면 언제쯤 출시하실 계획이신지 궁금합니다. 강사님이 만일 어떤 후배가 게임분야가 아니더라도 이건 꼭 공부하면 좋겠다 하시는 분야나 내용이 있다면 추천좀 부탁드립니다. 저는 이 강의 이외에 리눅스시스템 프로그래밍과 컴파일러도 만들어볼 계획을 갖고 있습니다. 실천을 당연히 할 준비는 되어 있습니다. 프로그램과 담을 더이상 안쌓기로 맘 먹었기에 용기내서 길을 가보고자 합니다. 좋은 강의 출시 많이 부탁드립니다. 역량을 키워서 게임분야나 그곳이 아니더라도 IT에서 통할 수 있는 인재가 되어보고자 합니다. 바쁘시겠지만 일정을 알려주시면 감사하겠습니다. 좋은 컨텐츠 너무 감사드립니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IOCP 핸들러 질문 드립니다.
처음에 CreateIoCompletionPort 함수를 통해 INVALID_HANDLE 을 주며 IOCP 핸들 만드는 것에 대한 질문입니다.강의에서는 한개의 IOCP 핸들이 모든 요청을 처리 하는것으로 보이는데단편적인 예로 아래와 같이 AcceptEx 를 담당하는 IOCP 핸들 1개Send/Recv 를 담당하는 IOCP 핸들 1개이처럼 각자 다른 IOCP 핸들이 해당 오퍼레이션만 담당하게 설계 할 수 있을까요 ?이렇게 설계한다면 문제점이 있을까요 ?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
연산자 질문
그 인벤토리와 관련된 예시를 드실 때 (순환 x 예시) 인벤토리의 생성자와 소멸자를 호출해본 결과 k1 = nullptr 후에도 인벤토리의 소멸자가 호출이 안되더라구요 k1->inventory = new Inventory(k1) 이부분에 관련해서 분석을 진행하고 있는데new Inventory(k1)에서 인벤토리의 ref 카운트 1 증가. (refcountable 규칙에 의해)InventoryRef _inventory = new Inventory에서 이동 대입 연산자로 인해 레퍼런스 증가 x메인 스레드 종료 후 k1의 소멸자가 호출되고서 멤버 변수도 초기화되는 과정에서 _inventory = nullptr 로 인해 레퍼런스 감소가 되어 소멸자가 출력되어야 하는게 정상 아닌가요? 제가 어느 부분에서 놓친건지 잘 모르겠습니다.. knight의 소멸자에 inv의 레퍼런스 카운트 값을 감소 시키니 inv의 소멸자가 출력됐는데, 어느 부분에서 레퍼런스 카운트 값이 1이 추가로 들어왔는지 못찾겠네요..