묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ReaderWriterLock 부분 질문입니다.
void Lock::WriteLock()부분에서 제가 실수로 expected = EMPTY_FLAG;이 부분을 while(true) 밖에 선언했습니다.CAS과정에서 expected가 갱신되는 것을 깜빡하구요. 그럤더니, 당연히 크래시가 났는데 저는 expected가 다른 ReadLock이나 WrtieLock으로 잘못된 값으로 갱신되면 EMPTY_FLAG랑 비교하는 CAS과정을 통과할 수 없게 되어 yield를 반복하다가 TIME_OUT 크래시가 날줄 알았습니다. 그런데 ReadUnlock쪽에서 Multiple Unlock 크래시가 뜨더군요.행여나 쌍을 맞춰주지 않았을까, 코드까지 다운로드해서 비교헀더니 딱 저 부분만 수정하니 잘 동작해서왜 Multiple Unlock이 나타나는지 의문입니다. 아무래도 RAII 객체의 LockGuard부분에서 소멸자를 호출하는과정에서 Multiple_Unlock이 뜨는 것 같은데, TIMEOUT -> 스택 풀기 과정에서 (소멸자 호출)로 Multiple_Unlock이 뜨기에는 10초의 시간이 있음에도 실행하자마자 바로 크래시가 나서, 어느 부분에서 ReadUnlock까지 가는지를 모르겠습니다. 아무리 생각해도 READ_LOCK에서 lock을 잡지 못하면, Unlock까지 도달할 일이 없지 않나요?디버깅을 찍어봐도 어디서 Unlock에 도달하지는지 모르겠습니다 디버깅 정보 올립니다. 혹시 이럴때 CRASH를 낸 주체를 정확히 모르겠으면 어떤식으로 디버깅 하면서 풀어나가면 좋을까요?ChatGPT는 어디가 어떻게 에러를 내는지 명쾌한 해답을 못주네요
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
8주차 ExtralCell 추가됐을 때 서로 공격 못하는 상황 공유드립니다.
루키스님 따라 공격범위 수정전에 Creature들의 범위가 현재 cell에서 어떻게 됐을지 근본적으로 궁금했었습니다. 기지모로 표현해보니까 이해가 잘 돼서 공유드립니다.빨간 원이 CellPos이며노란 원이 사자와 곰에 ExtraCells를 1씩 했었을 때 모습입니다.
-
해결됨[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
Interpolation & Server Tick Frequency
Hey,I have a question server in main loop dont limit execution time, everything happen withouth deltatime only base on JobSerializer Timer. So in the end we dont really know if server is working with 200 ticks per second or 15. Does this approach isnt affecting player objects latency? Does _lastSendTick = System.Environment.TickCount64; is enough to interpolate beetween player last postion and current? static void GameLogicTask() { while (true) { GameLogic.Instance.Update(); Thread.Sleep(0); } }
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Job 내부 Execute에서 Lock을 잡지 않는 이유에 대해서
안녕하세요. 양질의 강의 감사합니다. 다름이 아니라, Room Job내부 Execute를 구현하실때 Enter, Leave, BroadCast가 _players에 대한 락을 잡지 않는데, 이것은, main스레드에서 혼자 Flush함수를 실행하기 때문에 어차피 경합이 없어서 인가요? 만약 일감을 처리하려는 스레드가2개 이상일때부터는, 이런 공유데이터에 대해 작업을 하려는 경우 Execute 내부에서도 락을 잡도록 구현하게 될까요? 혹시, 이렇게 n개 이상의 Flush를 하려는 구조에서, Lock을 잡는게 맞다면, Lock때문에 자신의 Execute가 더이상 진행되지 않을때, 그 락을 잡은 스레드에게, 자신의 Job을 던져버리고, 다른 일감을 찾으러 가는 구조도 구현되게 될까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reference Count of ServerSession
안녕하세요. 강의 항상 즐겁게 보고 있습니다.강의 중 ClientService 내에서 발생하는 ServerSession의 레퍼런스 카운트 관리에 대해 궁금한 점이 있어 질문드립니다.제 이해로는, ClientService의 Start 함수에서 session을 명시적으로 hold해주지 않는다면, Session의 ProcessConnect 함수에서 connect event의 owner를 release한 이후에는 해당 session의 레퍼런스 카운트가 0이 되어야 정상이라고 생각했습니다.그런데 샘플 코드에서는 레퍼런스 카운트가 2 이상으로 유지되고 있는 것을 확인하여, 이에 대한 설명을 부탁드리고 싶습니다.감사합니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
rider에서 new editor config 설정
제가 vs가 아니라 현재 rider를 사용 중입니다. 여기서 강의에서 하신대로 프로젝트에 New editorConfig 설정을 하고싶은데 rider에선 어떻게 해야할지 방법을 계속 찾아보아도 나오지 않아 질문을 남깁니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트만 실행 했을 때 연결 성공이 나오는 이유
안녕하세요. 우연히 발견한 건데요,서버 미 실행이고 클라이언트만 실행된 상태에서, 연결 대상이 없는데 조금 있다가 OnConnect가 호출되는데 이건 왜 그러는 건가요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
Reward csv 파일이 없고 EquipmentChart는 열이름 문제로 업로드가 안됩니다.
C1 뒤끝서버설정 파트입니다.Reward csv가 없고차트 파일에 열(column) 이름은 영문 대소문자, 숫자만 가능하며, 공백을 포함할 수 없습니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
강의 영상코드랑 강의 자료 코드가 다릅니다.
왜 다운로드 받은 자료의 BackendManager의 코드랑강의에 나온 코드랑 다를까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Memory Pool을 관리할 때 혹시 스레드별로 따로 Pool을 관리하기도 하나요?
Memory Pool을 관리할 때 혹시 스레드별로 따로 Pool을 관리하기도 하나요? Lock Free 라고는 해도 스레드가 많을 수록 경합이 발생할 것 같은데,스레드 별로 따로 Memory Pool을 관리하면 이 문제가 해결이 되는 것은 아닐까 싶었습니다. 물론 이 경우 해당 스레드에서 Alloc을 해왔다면 무조건 Release도 동일 스레드에서 실행할 수 있도록 구조를 만들어야 해서 문제가 있을 것 같습니다. 혹시 그럼에도 스레드 별로 별도의 Memory Pool을 사용하는 경우가 있었나요? 항상 양질의 강의에 감사드립니다.
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
서버에서 디스커넥트되시는분들 JWT 관련 참고하셔요
루키스님이 말씀하신대로, 서버와 클라이언트의 jwt를 맞춰줘야 합니다. 강의자료에는 서버폴더내 config.json 파일에 secretkey가 없기 때문에 "secretKey": "this is my custom secret key for authentication" 이 줄을 추가해서 넣어주시면 잘 작동되실겁니다. 그리고 게임서버 및 어카운트서버 돌리고 클라 접속하면 잘 됩니다. 개발단계에서만 쓰시고 나중에 키는 다른걸로 바꿔야하겟죠
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 서버 취준생 고민입니다.
안녕하세요 작년 8월에 인서울 하위권 수준 컴공을 졸업한 26살 취준생입니다. 요즘 진로 관련 고민이 많아, 현실을 객관적으로 파악하고 선택을 해야 할 것 같아서 질문드립니다.게임 서버 프로그래밍 분야에 늦게 관심이 생겨서 작년부터 공부를 시작했습니다.작년에 루키스님 C++ 게임 서버 강의를 보고 채팅 서버를 만들었습니다. 6개월 정도가 걸렸는데 저의 C++ 실력이 너무 부족하다는 생각을 많이 했습니다.그래서 이후에 C++ 관련 공부 (간단한 2D 게임, asio 네트워크 프로그래밍, 알고리즘 등) 등을 했습니다. 공부를 끝내고 올해 2월 정도부터 게임 서버 강의를 다시 보면서 2D MMO 서버를 목표로 프로젝트를 진행하고 있습니다.현재 고민은 다음과 같습니다.취준 기간이 너무 길어지고 있는 것 같아서 지금 제가 잘 하고 있는 건지 의문이 듭니다.요즘 채용 공고를 보니 게임 서버 신입, 특히 C++ 쪽은 정말 절망적일 수준으로 공고가 없어서 계속 준비하는 게 맞나 생각이 듭니다.서버 신입은 보수적이라 학교 같은 기본적인 스펙이 중요하다고 하셨는데 뛰어난 스펙을 가진 상황이 아니라서 열심히 해도 경쟁력이 있을까 의구심이 듭니다.지금이라도 방향을 바꿔서 그나마 수요가 있는 웹 개발쪽으로 가는 것도 방법일까요?취준 기간이 길어지니 이런 부정적인 생각만 늘어나네요. 확실한 정답은 없겠지만 루키스님이 의견 주시면 도움이 많이 될 것 같습니다. 현실적인 답변 부탁드립니다. 감사합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
protobuf string
protobuf를 이것저것 연습하는 중에 문제가 생겨 질문드립니다. 위처럼 int32만 사용했을 경우에는 정상적으로 빌드가 되지만, 이런식으로 string으로 바꾸었을 때에만 이러한 오류가 발생합니다. 버전도 일치하고 링크도 제대로 되어있는 듯 한데 심볼이 없다라고 하는데 어떤 이유인지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
싱글코어일때 멀티 스레드 작업시 문제
노트북 환경이 싱글코어라 궁금해서 멀티스레드 환경으로 코드를 돌리니까 값이 매번 다르게 나오는데싱글코어 환경에서는 멀티스레드 테스트가 불가능 한건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스마트 포인터부분에서 궁금한게 있습니다.
클래스 객체 내부에 shared_ptr가 있을 때, 객체가 소멸되면 shared_ptr이 가리키는 값은 nullptr로 자동으로 변경되서, shared_ptr가 가리키는 refCount가 자동으로 줄어드는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의에서 이해가 안되는 부분이 있습니다.
#include "pch.h" #include "AccountManager.h" #include "PlayerManager.h" AccountManager GAccountManager; void AccountManager::AccountThenPlayer() { WRITE_LOCK; //GPlayerManager.Lock(); } void AccountManager::Lock() { WRITE_LOCK; } #include "pch.h" #include "PlayerManager.h" #include "AccountManager.h" PlayerManager GPlayerManager; void PlayerManager::PlayerThenAccount() { WRITE_LOCK; //GAccountManager.Lock(); } void PlayerManager::Lock() { WRITE_LOCK; } int main() { for (int32 i = 0; i < 1; ++i) { GThreadManager->Launch([=] { while (true) { cout << "PlayerThenAccount" << endl; GPlayerManager.PlayerThenAccount(); this_thread::sleep_for(100ms); } }); } for (int32 i = 0; i < 1; ++i) { GThreadManager->Launch([=] { while (true) { cout << "AccountThenPlayer" << endl; GAccountManager.AccountThenPlayer(); this_thread::sleep_for(100ms); } }); } GThreadManager->Join(); return 0; }위에처럼 AccountManager에서 PlayerManager의 lock을 잡는 코드를 주석처리하였고 반대도 마찬가지로 주석처리 하였는대도, debug모드시 deadLock으로 처리가 되는데, 원래 이렇게 떠야하는게 맞는건가요? 이거는 데드락 상황이 아니지 않나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
오늘 강의중에서 이해가 안되는 부분이 있습니다.
//잡고 있는 락이 있다면 if (_lockStack.empty() == false) { // 기존에 발견되지 않은 케이스라면 데드락 다시 확인 const int32 prevId = _lockStack.top(); if (lockId != prevId) { // 재귀호출은 deadLock이 아님 싸이클 확인할 필요 없음 set<int32>& history = _lockHistory[prevId]; if (history.find(lockId) == history.end()) { history.insert(lockId); CheckCycle(); } } }위의 코드는 쓰레드 1이 lock a를 먼저 잡고 쓰레드 2가 lock b를 잡으면 a의 history에 b가 들어가게 되지않나요? 제가 생각한 history는 쓰레드 1이 lock a를 잡은상태에서 lock b까지 잡으려고 할 때 a의 history에 b가 들어간다고 이해하고 있었는데, 제가 어떤걸 놓치고 있는지 잘 모르겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업 코드에서 Debug에선 동작하지만 Release 모드에서는 동작하지 않습니다.
올려주신 섹션 2. 멀티쓰레드 프로그래밍 Reader-Writer Lock 수업 자료를 다운 받고 실행 해보니 Debug 모드에서는 잘 동작했습니다. 하지만 Release 모드에서는 실행이 안되던데 방법이 없을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요. 이직 질문이 있어 드립니다.
안녕하세요. 루키스님 강의듣고 열심히 배우고 있는 현직자 입니다.회사에서는 묻기가 그래서.. 선생님이신 루키스님께 여쭤보고 싶어요. 경력 3년 정도 되는 서버 개발자인데,이직 경험이 없어서.. 루키스님 강의 보면서 배운 내용을 토대로 포트폴리오로서버 프로젝트를 만들어야 할 지 의문입니다. 누구는 경력기술서만 작성해도 된다고 하고, 누구는 포트폴리오를 신입때처럼 만들어야 한다고 하더군요..언젠가 이직을 할 수도 있으니 미리 준비하고 싶어 루키스님 의견을 듣고 싶습니다.감사합니다!
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
aws 와 microsoft azure 중 aws 선택하신 이유가 궁금합니다.
클라우드 서비스로 aws와 microsoft azure 둘중 비쥬얼 스튜디오랑 호환이 잘되있는 microsoft azure도 괜찮은 선택지일수 있을거같은데, 루키스님이 aws 고르신 이유가 궁금합니다. !