묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[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: 게임 서버
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이 추가로 들어왔는지 못찾겠네요..
-
미해결[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: 게임 서버
클라에서 서버 전향
안녕하세요 루키스님, 언제나 좋은 강의 감사합니다. 강의와 관련된 질문이 아니라 죄송하지만 따로 여쭤볼만한 곳이 없어 이렇게 질문 드립니다. 저는 4년차 클라이언트 프로그래머입니다. 쥬신 아카데미 출신으로 운 좋게 취업에 성공했지만 어쩌다보니 유니티로 커리어를 시작하게되어 지금까지 유니티 엔진을 사용하는 모바일 게임 프로젝트에서만 일하고 있습니다. 어렸을때부터 주로 온라인게임을 플레이 해왔었고 이직하고 싶은 팀도 MMORPG팀이지만 그런 곳은 주로 언리얼 엔진을 사용하다 보니 이직이 쉽지 않더군요 ㅠㅠ이러다 평생 모바일 수집형 게임만 만드는게 아닌가란 걱정도 들고 지금 있는 회사보다 좀 더 좋은 회사로 가고 싶다는 생각도 있다 보니 어느 순간 서버에 생각이 닿았습니다.남의 떡이 더 커보인다는건 알지만 저희 팀에서도 반년째 서버 개발자가 구인이 되고 있지 않고 있다 보니(나름 규모 있는 회사입니다 ㅠㅠ) 더 그런 생각이 들었던 것 같습니다. 여튼 그렇게 루키스님 강의와 시중에 있는 서버 책을 보며 공부도 하고 서버를 연동해 게임도 만들어 보고 있지만 회사 일과 병행하며 전향을 준비하기에는 조금 벅찬감이 있는것같아 퇴직 후 1년정도 학원(프로카데미)을 다닐까 고민하고 있습니다. 1년이 짧은 시간은 아니다 보니 회사 일을 병행하면서 준비를 계속할지 아니면 학원에 들어갈지 망설여지고 있는데 조언 부탁 드립니다 ㅠㅠ나이는 27살이고 연봉이 높은 편은 아니다 보니 이직 후 신입 연봉을 받게되더라도 크게 아쉬움은 없을 것같습니다..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
책 추천 문의드립니다.
우선 좋은 강의 감사합니다. 강의 초반 Modern C++ Design 책 추천을 주셨는데요, 이 외에 추천 해주실 책이 있으신지 문의 드립니다. (개인적으로 추천해주시는 top5책을 알고싶습니다.) 코드를 짜면서 생소한 패턴를 만날때다마 블로그에 떠도는 글을 보면서 알음 알음 알아가고 있는데요, 혹시 이러한 지식들을 체계적으로 쌓고 싶은데, 해당 책 외에 추천 가능하실까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Memory Pool#2 삭제 Lockfree stack 과의 값 교환 차이가....?
이전에 Lock free stack 에서는 ABA problem 이 발생하지 않는다고 별도로 들고 있었기 때문이라고 하셨는데 이전에도 링크드 리스트 처럼 포인터를 들고 있던 방식이고 현재 이것도 그것과 유사한 방식인데 왜 이전에는 ABA 가 발생하지 않았다고 하는건지 잘 이해가 가질 않네요 이전 lock free stack 에서 삭제 할때의 로직과 크게 달라보이진 않는것 같은데요..이전 lock free stack 에서도 ABA Problem 이 발생하지 않나요?차이점이 명확하게 어떤 부분인지 모르겠습니다..답변좀 부탁드려요! Memory Pool#2 시간은 26:55 초에서 정도에서..
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 수강 후 개인 프로젝트 적용
수강 후, 대학 동아리 수준에서 내용을 제대로 습득했다는 전제 하만든 게임과 서버를 연동할 능력을 갖출 수 있나요?동아리에서 mmorpg를 만들어 보려 하는데 서버를 담당하게 되어 미리 공부하려 합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
리눅스에서 이벤트 사용
쓰레드 강의파트에서 리눅스 영역을 고려해 <windows.h>를 사용하지 않고 <thread>를 사용한다고 하셨는데 이벤트는 <windows.h> 헤더를 대체할만 것이 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
신규 강의 질문
안녕하세요 루키스님! 유튜브에 온라인 출판사 영상을 보고 궁금하게 생겨서 이렇게 질문드려요! 유튜브 영상에서는 WinAPI-D2D-D3D 커리큘럼, UE 커리큘럼, Unity 커리큘럼 이렇게 3개를 구상중이라고 하셨는데 C++ IOCP + UE5 연동 강의는 일정이 어떻게 되는지 알 수 있을까요? ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
생각을 해봤는데 이해가 잘 되지않습니다. 질문 드립니다
안녕하세요. 지금 ReadLock WriteLock 강의듣고 혼자서 구현해보는 연습중에 궁금한점이 있어서 문의드립니다. Main부분에서 for (int i = 0; i < 2; i++) { threaManger->Luncher(ThreadWrite); } for (int i = 0; i < 5; i++) { threaManger->Luncher(ThreadRead); } 고유 스레드 아이디를 부여해서스레드 2개는 Write("스레드 아이디" 1,2)스레드 5개는 Read ("스레드 아이디" 3,4,5)일을 시키는데이렇게 되면 Read만 하는 스레드는 ReadLock만 잡고Write만 하는 스레드는 WirteLock만 잡게 되어서1번 아이디의 스레드(Write)가 Read Lock을 잡을 수 없지 않나요?아래 코드에서 Readlock 함수를 보면WRITE_THREAD_MASK를 씌어서 threadId를 비교하는데 이 부분은 실행 안될 거라고 생각되는데 맞나요?실제로 디버그에서 ReadLock에 포인트를 잡고 봤는데 브레이크 포인트에 걸리지는 않았습니다.제가 궁금한 걸 글로 쓰려니 잘 정리가 안돼서 죄송합니다.질문을 요약하자면1.ReadLock을 잡는 스레드의 id는 WriteLock을 잡는 스레드 id와 똑같을 수가 있나요? // ReadLock const int lockThreadId = (_lockFlag.load() & WRITE_THREAD_MASK) >> 16; if (lockThreadId == SharedThreadId) { _lockFlag.fetch_add(1); return; } // WriteLock const int lockThreadId = (_lockFlag & WRITE_THREAD_MASK) >> 16; if (lockThreadId == SharedThreadId) { _writeCount++; return; }
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
하나의 쓰레드에만 일감이 몰리는 현상이 왜 안좋은가요?
하나의 쓰레드가 여러 개의 JobQueue를 점유하는 현상이 안좋은 이유는 알겠습니다. 다른 쓰레드가 다른 JobQueue의 Job들을 처리하지 못하게 되니까요. 그런데 모든 쓰레드가 모든 일감을 처리할 수 있는 만능 일꾼이 된 상황에서, 하나의 쓰레드가 하나의 JobQueue를 오래동안 잡고있는 현상이 왜 안좋은지는 잘 이해가 안갑니다. 어차피 하나의 쓰레드가 붙잡고 해야할 일이 아닌가요? 동시에 여러 쓰레드가 처리 가능한 것도 아닌 것 같구요... 예를 들어, 쓰레드 A, B, C가 있다고 해봅시다. 쓰레드 A가 JobQueue 'ㄱ'를 점유하고 계속 작업을 하고 있습니다. 쓰레드 B와 C는 'ㄱ'과 관련된 일은 모두 A에게 몰아주고 나머지 작업들을 처리하고 있습니다. 그런데 A의 'ㄱ'점유가 너무 길어져서 'ㄱ'의 점유를 B에게 넘겨주었습니다. 그리고 A는 B와 C가 하던 것 처럼 나머지 작업들을 처리하게 되었습니다. 그럼 결국 'ㄱ'의 점유가 A에서 B로 넘어갔을 뿐 달라진 것이 없지 않나요? 오히려 쓸 데 없는 스위칭 비용만 발생한 것이 아닌가요?