묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WaitForSingleObject의 Auto reset 처리는 원자적인가요
auto_reset가 설정된 event를 SetEvent()할 때, WaitForSingleObject()로 sleep 중인 스레드들을 실행시켜주고 다시 Signal이 리셋되는 것으로 이해했습니다.여기서 Signal을 확인하고 리셋하는 과정이 CAS같이 원자적으로 동시에 작동하나요? 아니면, 중도에 WaitForSingleObject()를 호출한 스레드 측에서 리셋이 되지 않아 통과할 가능성이 있나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷직렬화 암호
간결하게 얘기하자면 패킷직렬화하고 클라나 서버로 보낼떄 패킷을 암호화처리를 하여서 보내야하는것으로 알고있는데 Protobuf에서 자체적으로 암호화처리를 하고 보내는건가요? 아니면 Protobuf와 별개로 암호화처리를 해줘야하는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MAX_NUMBER를 1'000'000까지 하면 답이 안나오는데 혹시 어떤게 문제인지 봐주실 수 있나요?
1,000번이나 100'000번까지 하면 바로 답이 나오는데 100만번으로 설정하면 계속 기다려도 감감무소식이라서 문제를 잘 모르겠습니다 ㅠㅠ. #include "pch.h" #include "CorePch.h" #include "CoreMacro.h" #include "ThreadManager.h" #include <iostream> // 소수 구하기 // 1과 자기 자신으로만 나뉘면 그것을 소수라고 함. Mutex m; bool CalculateRepeatToSelf(int32 selfNum) { int8 count = 0; for (int32 i = 2; i <= selfNum; i++) { if (count > 2) return false; if (selfNum % i == 0) { count++; } } if (count == 1) return true; return false; } int32 PreCalcuate(int32 order, int32 devision, int32 interval) { // 1, 10, 100'000 // 2, 10, 100'000 // 3, 10, 100'000 // ... // 10, 10, 100'000 int32 startNum = (order - 1) * interval + 1; int32 endNum = order * interval; int32 count = 0; for (int32 i = startNum; i <= endNum; i++) { if (CalculateRepeatToSelf(i)) count++; } return count; } int main() { const int MAX_NUMBER = 1'000'000; //const int MAX_NUMBER = 10'000; // 1229 //const int MAX_NUMBER = 1'000; // 168 // 1~MAX_NUMBER까지 소수 개수 // 멀티스레드로 병렬로 구해서 덧셈한다. /*for (int32 i = 1; i <= 20; i++) { if (CalculateRepeatToSelf(i)) count++; } cout << count << endl;*/ // ------------------------ vector<thread> threads; int32 devision = thread::hardware_concurrency(); int32 interval = MAX_NUMBER / devision + 1; atomic<int32> totalCount = 0; for (int32 i = 1; i <= devision; i++) { threads.push_back(thread([&totalCount, i, devision, interval](){ totalCount+= PreCalcuate(i, devision, interval); })); } for (thread& t : threads) { t.join(); } cout << "Total: " << totalCount.load() << endl; }
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GetTickCount64() 의 정밀성
#include "pch.h" #include "CorePch.h" #include <iostream> #include <atomic> #include <thread> #include <mutex> #include <Windows.h> #include <future> int32 buffer[10'000][10'000]; int main() { memset(buffer, 0, sizeof(buffer)); // 배열을 전부 0값으로 초기화 //! [i][j] 순으로 더하기 { uint64 start = GetTickCount64(); //~ 시작 시간 측정 int64 sum = 0; for (int32 i = 0; i < 10'000; i++) for (int32 j = 0; j < 10'000; j++) sum += buffer[i][j]; uint64 end = GetTickCount64(); // ~ 종료 시간 측정 cout << "Elapsed Time [i][j] : " << (end - start) << endl; } //! [j][i] 순으로 더하기 { uint64 start = GetTickCount64(); //~ 시작 시간 측정 int64 sum = 0; for (int32 i = 0; i < 10'000; i++) for (int32 j = 0; j < 10'000; j++) sum += buffer[j][i]; uint64 end = GetTickCount64(); // ~ 종료 시간 측정 cout << "Elapsed Time [j][i] : " << (end - start) << endl; } }해당 코드를 7900 CPU 에서 테스트하는데, 경과시간이 둘 다 0,0 이 나오더군요.. 분명 그럴수가 없는데, CPU클럭이 너무 빨라서 gettick64() 의 정밀도로 측정이 불가능해서그런건가요? 분명 두번째 스코프에 있는 경과시간이 더 느리게 나와야 정상인데, 둘 다 틱이 0 0 이 나와서 당황스럽습니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
uses가 0이 될 때 객체 부분이 삭제가 어떻게 일어나나요?
make shared로 shared_ptr를 만들게 되면우리가 예제에서 만든 것처럼우리가 포인터로 가르키는 객체가 RefCountingBlock을 상속해서메모리에 할당 될 때 같이 된다는 이점있다고 이해했습니다Refcount_obj2(_Type&&... Args) : Ref_count_base를 예시를 드시며21:11 에서 설명 해주셨습니다 만약 uses가 0이 되고 weak는 아직 1일 때객체 부분은 구현에 따라 삭제 될 수도 있고RefCountingBlock은 남아있게 된다고 말씀해주셨는데RefCountingBlock을 상속해서 하나의 객체로 만들어진 상태에서객체의 부모(countringBlock)을 남긴채로 자식(객체부분)만 메모리 해제를 할 수 있는건가요? 아니면 이게 불가능 하기 때문에 그냥 구현에 따라 다른건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소수를 나열하는 방법에 대한 질문
안녕하세요 연습문제를 풀어보다가 궁금한 점이 생겨 질문 드립니다.atomic<int> primeCount에 thread들이 cnt++하는것 까지는 이해를 했습니다.궁금한 점은 vector나 배열에 구해진 소수를 push_back해서for(int i : vector) 하려면 CountPrime할때 writeLock을 잡아서 push_back을 해줘야 하나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Atomic 변수와 Lock을 둘 다 사용하는 이유가 궁금합니다
Atomic 변수를 사용함으로써 Distribute 함수에 하나의 쓰레드만 들어오는게 보장된 것 같은데 굳이 Lock 또 다시 사용하는 이유는 Distribute 함수 말고도 다른 곳에서 items 라는 컨테이너에 접근할까봐(지금은 아니지만) 이렇게 작업하신걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
게임 서버 몬스터 ai에 관해 궁금한게 있습니다.
게임 서버에서 몬스터 ai(state machine)를 돌린다고 했을 때 제가 생각한 방식은 서버에서 일정 주기마다 랜덤으로 상태변화가 일어나게 구현하는 것인데, 더 좋은 방식이 있을까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
투사체 서버 판정 질문입니다
서버가 보통 10 ~ 20 프레임으로 돈다고 들었는데 그렇다면 서버 내의 오브젝트(투사체, 아이템)도 아무리 빨라야 10 ~ 20프레임이 될 것 같습니다.그렇다면 RPG기준으로 몬스터가 논타겟 총알을 발사했을 때 플레이어를 통과하는 경우도 있지 않나요?1인게임 만들 때 처럼 딱 맞았을 때 판정하면 좋겠는데 그게 안되니 언제 판정을 해야할지 모르겠습니다..
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
포트폴리오 작성 Pimpl Pattern 사용
현재 포트폴리오를 작성하면서 각종 라이브러리 및 .h파일을 작성하고 있습니다.개발중 한가지 고민이 생겼습니다.나는 listener.h를 불러왔는데 왜 .h파일을 불러와져야할까?그래서 찾아보니 Pimpl 패턴으로 클래스를 전방선언하고 .cpp에 구현함으로써 .h 파일에는 다른 include.h가 되는걸 최소화 할 수 있다는걸 알게 되었습니다.해당 패턴에 장 단점또한 정확하게 파악하고 있습니다.하지만 Pimpl패턴을 사용하는것이 포폴에서 좋은 영향을 줄지는 걱정이 됩니다. 괜히 읽는 사람입장에서 불편하게 만들지 않을까라는 것 입니다.어떻게하는게 좋을까요...
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PacketSession
혹시 PacketSession만들떄 프로토콜같은경우는게임을 만들다보면 공격, 스킬, 이동, 퀘스트, 물약처리, 말고도 DB처리, AI서버가 있으면 AI관련된 프로토콜도 있을테고 기타 등등 엄청 많아질거 같은데 그러면 처리해야할 모든 프로토콜을 enum class로 처리해서 모든 각각의 서버와 클라가 공용으로 사용을 해야하는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티 캐주얼 모바일 MMORPG (M2) 강의 질문 드립니다. / 다른 강의 질문 양해 말씀 드립니다.
루키스님 안녕하세요.먼저 다른 강의에 대해 문의 드리는 점 양해 말씀 드립니다. [Rookiss 켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)해당 강의 구입을 고민중인데, M1과는 완전히 다른 강의 인가요?M1과 이어지는 강의인지 아닌지를 고민하고 구매를 결정할 생각입니다. 답변 미리 감사합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
makeshared에 대해
복습차원에서 다시 듣느데 혹시 자체적으로 만든 makeshared를 쓰는 이유가 메모리풀을 적용시켜서 sharedptr로 만드는건데 요즘은 그냥 new delete성능이 좋아서 그냥 써도 상관없다는것을 들었는데 그러면 그냥 지원해주고 있는 make_shared함수를 써도 성능상에서 아무문제 없는거 맞는거죠?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Session의 수명 관리를 위한 Ref 카운트 관리 부분
안녕하세요. 수업 잘 듣고 있습니다. 감사합니다. Session 수업 부분에서Register함수들에서 owner = shared_from_this(); 를 Process함수들에서 owner = nullptr 를 해주는 방식을.한 군데에서 관리하는게 좋지않을까 하는 생각이 들었습니다.Session이 생성될 때 Init함수 같은 것을 하나 둬서멤버 변수로 들고 있는 각Event들의 owner에 shared_from_this()를 넣어주고(계속 들고 있는 상태로 유지)나중에 문제가 생겨서 Disconnect()를 호출해야 할 때,ProcessDisconnect함수와 소멸자 같은 부분에서nullptr로 밀어주는 식으로 한다면 비동기 함수에 걸어놓는 동안 session의 생명은 계속 유지가 될 것 같고, 매번 참조횟수를 늘렸다 줄였다 하지 않아도 되니 괜찮을 것 같다 생각했는데요.혹시 제가 잘못 생각하고 있거나미처 생각을 못한 부분이 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
네트워크 궁금한점이 있습니다.
서버개발 내용에 대해 궁금한것이 있어서 질문드려요.메인 서버가 있고접속한 클라이언트 1,2가 있을때 메인서버를 통해클라이언트 1,2를 서로 연결만해주고 연결후에는 메인서버를 통하지 않고 연결이 가능할까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RWlock
Reader-writer Lock 잘 시청하였습니다.그런데 인터넷 글 구경중 SRWLock라고 지원해주는것이 있던데 이거는 오래된된것이라 안쓰는 추세인가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LLocalStack 을 main 밖에서 쓰면 에러가 나는 이유??
이런저런 실험 도중에 발견한 에러입니다 CoreGlobal::CoreGlobal() { GThreadManager = new ThreadManager(); GMemory = new Memory(); GSendbufferManger = new SendBufferManager(); GDeadLockprofiler = new DeadLockProfiler(); SocketUtils::Init(); LlockStack.push(1); LlockStack.pop(); // 에러 지점 } main 안에서는 문제 없었는데 코어글로벌 cpp 파일에서저 부분이 문제더라구요 push 까지는 통과되고 size 도 1로 늘어나는것을 확인했는데 pop() 하는 도중 크러시가납니다 혹시 이유를 알고 계신가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
마이크로소프트 제공 SList 는 use-after-free 에 대하여 안전한가요??
마이크로소프트 제공 SList 를 모방하는 과정에서SList 는 여전히 use-after-free 에 대하여 취약하다고 말씀하셨는데 마이크로소프트에서 제공하는 SList를 사용 할 때도일반적인 상황에서는 안전한 것인지 궁금합니다제 생각에는 수업의 경우 메모리 풀이라는 특수 상황에서는 free가 일어나지 않으니 일단 안전한다고 생각하는데 메모리 풀이라 안전한 것이지? 그렇지 않은 경우는 또 어떨지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라연동 질문드립니다.
안녕하세요 루키스님 강의를 따라하면서 클라를 콘솔이 아니라 winapi를 이용해 연동에 성공했는데요.(싱글톤으로 서버 세션을 만듬)일단 연결이 된걸 확인했으나 클라에서 창을 닫고 나가면 deque헤더에서 액세스위반 크래쉬가 나더라구요.그래서 디버깅을 열심히 해보니 클라가 나갈때 CoreGlobal의 소멸자가 호출되고 그중에 SendBuffer매니저를 지워줄때 문제가 생기더라구요. 그래서 혹시몰라 CoreGlobal 에 delete 하는 부분을 없애봐도 프로그램이 종료 되면SendBufferManager::PushGlobal함수 호출 ->SendBufferManager::Push 함수 호출 되고 나가는 과정에서 Lock이 문제가 발생했습니다..아무리 제가 찾아도 문제를 못찾겠어서 기존에 만들어주신 더미클라이언트에선 콘솔을 닫을때 코어글로벌 소멸자호출을 확인하니까 아예 호출이 안되는걸 확인했고 이 문제를 해결하려고 여러방면으로 시도를 해봤는데 잘 되지않아서 질문드립니다..서버를 열지않은상태에서 클라를 닫을때 크래쉬가 안나는걸 봐선 클라문제는 아닌거같은데 어떻게 해결하는게 좋을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
UE MMO 콘텐츠 구현은 언제쯤 출시 예정이실까요?
C# 서버 듣고 돈이 안아까워서C++서버랑 게임도 붙여보고 싶습니다.UE MMO 콘텐츠 구현은 언제쯤 출시 예정이실까요?올해 말까진 출시됐으면 좋겠는뎅