묻고 답해요
150만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
순위 정보를
불러오고 있어요
-
미해결[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 고르신 이유가 궁금합니다. !
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업중 궁금한 점이 있어서 질문드립니다.
#include "pch.h" #include <thread> #include <atomic> #include <mutex> #include <windows.h> mutex m; queue<int32> q; HANDLE handle; void Producer() { while (true) { { unique_lock<mutex> lock(m); q.push(100); } ::SetEvent(handle); std::this_thread::sleep_for(100ms); } } void Consumer() { while (true) { ::WaitForSingleObject(handle, INFINITE); ::ResetEvent(handle); unique_lock<mutex> lock(m); if (!q.empty()) { int32 data = q.front(); q.pop(); cout << data << endl; } } } int main() { handle = ::CreateEvent(NULL, TRUE, FALSE, NULL); std::thread t1(Producer); std::thread t2(Consumer); t1.join(); t2.join(); ::CloseHandle(handle); return 0; }에서 WaitForSingleObject이후에 signal이 auto가 아니라면 ResetEvent를 따로 적어주어야 한다 하셨는데, ResetEvent가 호출되기 전에 다른 쓰레드에 있는 SetEvent가 호출되면 어떻게 되는건가요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
M1의 어드레서블 리소스 관리 방식에 대하여 질문있습니다.
m1에서는 처음시작할때 모든 preload리소스들을 타이틀씬에서 로드했는데이건 씬이 하나이고 다 쓰여서 이렇게 한건가요?일반적으로 씬이 여러개이거나 씬이하나여도 전혀 다른 에셋들의 구성으로 씬이 구성되는 경우라면 그 해당하는 에셋이 필요할때만 로드시키는게 일반적인 걸까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
M1의 리소스매니져 클리어 타이밍에 대해 여쭤보고싶습니다.
강의에서는 Clear()를 사용하시지 않았는데일반적으로 규모가 있는 게임이면 Clear 타이밍이 어떻게 될까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
C1 일정은 어떻게 되는건가요?
C1 일정은 어떻게 되고있는건가요? 벌써 3월인데... T1은 내부 사정상 취소되고 C1으로 변경해서 진행할거란 소식은 꽤 오래전에 들었습니다. 일정 공유좀 해주세요... 2개 프로젝트에 대한 강의를 들으려고 구매한건데, 너무 딜레이되는거 아닌가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IOCP 워커 스레드 순서 보장 질문 드립니다.
루키스님 안녕하세요?C#서버 강에서 넘어와서 C++서버 공부하고 있습니다. C# 서버와 비교하면서 공부하다 워커 스레드 순서 보장이 궁금해서 질문 드리게 되었습니다. C# 서버에서는 Room.Flush()따위를 메인 함수의 와일루프에서 호출해서 단일 스레드로 처리하기 때문에 순서보장이 되는 것을 직관적으로 이해했습니다. 여기 예시에서는 워커스레드를 5개를 배분해주셨습니다. C# GameRoom으로 빗대면, 긴~~ 작업 Job A와, 짧은 B가 있는데 A->B 순서로 진행이 되어야 한다고 하면, 1번 워커 스레드는 먼저 들어온 A를 처리중..2번 워커 스레드가 이어서 들어온 B 작업을 처리.. A보다 먼저 처리 완료.1번 워커 스레드가 처리중인 A 처리 완료..이렇게 B->A 순서로 처리가 될 것 같다는 생각이 들었습니다. Q1. IOCP 워커 스레드가 순서 보장이 되는지?Q2. 그럼에도 불구하고 워커스레드를 N개 하신 이유가 있을 것 같은데 C#도 그렇게 할 수 있을지? 예를 들어 Room의 처리를 1, 2, 3, 4, 5번 스레드를 파서 동시에 처리 할 수 있을지?Q3. C# 서버에서는 Room에 1개의 스레드를 배분한 특별한 이유가 있는지?궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
.
.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
화살 처리 관련 질문이 있습니다!
안녕하세요.제가 겪은 오류 관련해서 이미 예전 질문 글이 있었고 그와 관련해서 잡 캔슬이 얼마나 중요한지 알게 되면서 이것저것 정리하면서 생각해보다 보니까 문득 화살을 파괴할 때느 잡 캔슬을 하지 않았던 게 생각 나더군요.사용자가 상호작용을 할 때만 발사되는 거라서 몬스터나 비전큐브랑 같지 않다는 건 아는데요. 문득 이런 의문이 들었습니다. Arrow.Update()가 다음과 같습니다~public override void Update() { if (Owner == null || Room == null || Data == null || Data.projectile == null) return; int tick = (int)(1000 / Data.projectile.speed); Room.PushDelayed(tick, Update); Vector2Int destination = GetFrontCellPosition(); if (Room.Map.ApplyMove(this, destination, applyCollision: false)) { GameRoom room = Room; S_Move movePacket = new(); movePacket.ObjectId = Id; movePacket.PosInfo = PositionInfo; room.Broadcast(CellPos, movePacket); } else { GameObject target = Room.Map.Find(destination); if (target != null) { // 피격 target.OnDamaged(this, Data.damage + Owner.TotalAttack); } // destroy Room.Push(Room.LeaveGame, Id); } }제가 상상해낸 버그의 해결 방법은 이미 알고 있습니다. 다만 그런 상황이 가능할까 궁금하더라고요.화살을 파괴하는 일감인 (Room.LeaveGame, Id)가 잡큐에서 실행되기 전에 Update() 함수 초기에 예약해둔 일감 Room.PushDelayed(tick, Update)이 잡큐에서 먼저 실행되면 한 화살이 아직 파괴되기 전이므로 대미지가 두 번 이상 발생할 수 있는 상황이 올까? 싶었습니다. 저희가 GameLogic에서 일감들을 flush 하고 Job 클래스를 보면 JobTimer를 먼저 flush하니까요. 타이밍 이슈로 충분히 그럴 수 같은데? 생각이 들더라구요. 아직 재현된 이슈는 아닙니다. 가끔씩 화살이 몬스터를 뚫고 지나가기도 하는데 이런 타이밍 이슈와 관련이 있을까 하는 생각도 같이 들었습니다. 제 부족한 경험으로는 명쾌한 해답을 찾기가 어렵네요ㅠ
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
part1~9 모두 완료하였습니다.
루키스님 강의들 보게 된 지 꽤 오래 되었군요.2024년 1월 경인가 쯤에 언리얼 블루 프린트 강의로 처음 시작하게 되었고 이후 게임프로그래머 올인원(C++)을 보고 그 다음에 유니티 시리즈를 쭈욱 봤습니다. 전공도 아니고 개발 경험도 없어서 그런가 와 너무 어렵더라구요. 어떤 것들은 나름 무난무난 했는데 파트4 서버 부분이나 패킷 부분이나 클라이언트 쪽 UI 자동화 하는 부분이나 데이터베이스 연동하는 부분이나.. 멘붕 오는 순간들이 한 두 번이 아니었던 것 같습니다. 한 번 보면 이해가 잘 되지 않아 두 번 세 번 보고, 파트 9까지 다 수강하고 아 이제 만들어 봐야겠다! 했는데 또 기억이 가물가물해서 다시 보고,,, 아무튼! 다시 한 번 또 복습을 하고 나니 대충 어떤 느낌으로 개발을 하면 될 지 느낌적인 느낌으로는 알 것 같습니다. 이제는 혼자서 만들어 보고 헷갈리거나 모르는 부분들이 있으면 다시 강의들 참고하면서 인내심을 가지고 프로젝트 진행해 보려고 합니다. 완강하기 쉽지는 않았지만 루키스님 강의가 워낙 고퀄리티여서 많은 것들을 배우고 가는 것 같습니다. 올해 출시를 목표로 한 번 달려 보도록 하겠습니다. 건승하십쇼!
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
강의는 끝인건가요?
강의가 더이상 업로드 안되는 것 같은데끝이 난 건가요? 라이브 및 대응도 보고싶은데 너무 아쉽습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
이번 수업 특히 좋았습니다
브로드캐스팅에 관해서 늘 미심쩍은(?) 부분이 있었는데 이렇게 해소가 되는군요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
화살과 몬스터 버그와 관련한 질문입니다
몬스터, 화살 이동 전부 독립적인 갱신 주기를 갖게 한 이후로 버그가 생긴 것 같습니다. 화살을 쏘는 동안에는 캐릭터가 안 움직여요.원인은 화살이 50ms 단위로 일감을 예약하고 몬스터는 200ms로 일감을 예약하다 보니까 화살이 날아가는 중에는 화살의 Update만 호출될 수밖에 없더라고요. 최소 힙으로 예약 일감을 처리하니까요.이를 쉽게 해결하는 건 몬스터랑 화살 둘 중에 하나를 TickRoom의 room.Update()에 넣어놓는 것인데 이건 임시방편 같고요. 헤딩해봐야 하겠지만 각 화살, 몬스터에 각각 잡큐를 두는 방식밖에 없는 것 같은데, 이런 식의 해결이 일반적인 방법에 가까울까요? 각 오브젝트마다 잡큐를 두는 것이? 실무에서 더 복잡하고 많은 오브젝트들이 처리돼야 할 때 해당 Zone에 하나만 잡큐를 두는 건 굉장히 비효율적인 것 같습니다.뭐 어떻게든 돌아가면 되긴 하지만 정답은 없어도 오답이란 건 있으니까요. 지금처럼 GameRoom에 잡큐를 두었을 때는 투사체랑 다른 오브젝트들을 순차적으로 처리하는 건 무조건 문제가 생길 것 같고, room.Update()에 빼놓으면 갱신 주기를 조절하기 어려우니, 각각 잡큐를 두는 게 이상적인 것 같아서요.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MemoryPool Pop 락여부
아래 박스 쳐진 코드 부분에서 header 부분은 생성하는 부분입니다. 생성자를 호출한다는 것은 "메모리쓰기"를 한다는 것인데 멀티쓰레드 환경에서 락을 걸어야 하는 것 아닌가요?제가 정확하게 몰라서 이렇게 질문 남깁니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
DummyClient cpu스펙 질문있습니다.
역시 게임 로직을 단일 쓰레드 하나가 처리하려고 하다보니 제 PC환경에서는 몬스터가 300마리 플레이어가 300마리 때부터 엄청나게 느리거나 잡큐가 밀려서 패킷이 안올때도 있는데요. 역시 AStar가 가장 무거운 함수이더라구요. 일단 300,300도 UpdateMove를 async함수로 만들어서 PathFind하는 부분만 Task await로 던지는 식으로 함수 수정하고 멀티 쓰레드 환경에서 새롭게 크래쉬나는 부분들은 널체크 및 lock으로 안정성을 올려놨더니 일단 크래쉬는 안나는것 같습니다만... 그래도 너무 궁금한것은 제 cpu가 인텔 i7-14700k인데, 루키스님환경에서는 1000명도 버티던데 왜이렇게 차이가 나는 건지 모르겠습니다. 단일 쓰레드가 약한 모델이라서 그런건지...혹시 촬영당시 cpu사양이 어떤 제품으로 사용하셨을지 궁금합니다 ㅠㅠ...
주간 인기글
순위 정보를
불러오고 있어요