묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[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사양이 어떤 제품으로 사용하셨을지 궁금합니다 ㅠㅠ...
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요. CV Producer() 내부의 lock 스코프 안에서 cv.notify_one()하는 것 질문드립니다.
CV Producer() 내부의 lock 스코프 안에서 cv.notify_one()하는 것 질문드립니다.그 안에서 notify_one()을 하게 되면 확실히 큐에 푸시한 후에 다른 스레드가 가로채기 전에 notify_one을 호출하니 Consumer()의 wait()에서는 확실하게 q에 값이 있는 상태가 되는 것 아닌가요? notify_one()을 한 후 Producer를 호출한 스레드는 스코프를 바로 빠져나올거고, 빠져나오면서 lock을 놓아줄 거고 그러면 놓아주는 순간 Consumer()의 wait는 누가 가로채기 전에 바로 들어오니 가짜 기상 문제가 해결되는 것 아닌가요. 아리달송합니다..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
InventoryManager 클래스에서 사소하지만 꼭 알고 싶은 사항이 있습니다
안녕하세요.강의 들을 땐 그런가 보다 하고 넘겼는데 혼자 리뷰하면서 보니까 의도가 있는 건지 아닌지 확인이 필요하다 생각했습니다. InventoryManager 클래스를 정의할 때 Item 객체를 Add() 하거나 Get() 할 때 itemDbId를 Key로 사용한 이유가 있을까요? TemplateId도 고유하다 생각하는데, 메모리 상에서 아이템 관리를 할 때 반드시 db id가 key이어야 하는 이유가 있는 건지, 실은 TemplateId도 상관 없고 고유한 식별자이기만 하면 되는 건지 알고 싶습니다.이게 사소하면서도 작지 않다고 느낀 게, 초보자가 대충 작성한 코드가 아니라, 수많은 경험이 있는 사람이 작성한 코드이기 때문입니다. 수강자 입장에서 혹시 놓친 부분이나 생각지 못한 의도가 있는지도 알아내는 것도 중요하다 생각합니다.감사합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
VS 2022 기준 ServerCore의 .lib 파일을 못찾을 수 있나요?
루키스님 안녕하세요?vs 2022에 맞춰서 IOCP 구축연습 밑바닥 부터 하고있습니다. 역시 환경 설정부터 난관이었는데요,ServerCore의 .lib파일을 GameServer가 못찾습니다 (ServerCore 빌드까지는 됩니다)강의 몇번을 돌려봐도 안되길래 좀 찾아보니까pch.h에 절대 경로를 넣어서 찾아주거나(근데 이건 아니다 싶어서)#ifdef _DEBUG #pragma comment(lib, "C:\\CppGameServer25\\CppGameServer25\\GameServer\\Libraries\\Debug\\ServerCore.lib") #else #pragma comment(lib, "Release\\ServerCore.lib") #endif강의에서 더해서 GameServer의 추가 라이브러리 디렉토리를 설정해줘야지만 .lib 파일을 찾고 GameServer가 빌드할 수 있었습니다. 일단 되니까 다행이긴 한데,됐으니까 장땡인지, 아니면 제가 경로 설정? 환경 설정?등 알아둬야 하거나 놓친 것이 있는지 조언 구하고 싶습니다.왜 강의대로만 하면 안되고 추가 라이브러리 디렉터리를 설정해줘야지만 빌드가 되는지 원리에 대해 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
FANTASTIC UI STARTER PACK이 없네요..
최근에 강의 들으시는 분 없나요? 애셋이 없는데 관련 질문이 없군요. 어떻게들 해결하셨는지 궁금하네요.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterRecv()가 멀티스레드 환경에서 안전하다는 게 이해가 가지 않습니다.
안녕하세요 선생님. 선생님 강의 덕분에 요즘 서버 개발이 너무 재밌습니다. 감사합니다. 다름이 아니라 이해가 안가는 부분이 있어서 질문드립니다.1:20 초에 RegisterRecv()는 멀티스레드 환경에서 안전하다고 하셨는데 이 부분이 이해가 가지 않습니다.AcceptEx()를 걸고 나서 만약 클라이언트가 5개 붙으면 ProcessAccept()는 5번 호출될 것이고, 호출될 때마다 ProcessConnect()를 내부에서 호출하여 WSARecv()는 연결된 클라이언트마다 1번씩 호출하게 되는 것으로 코드를 이해했습니다. 그렇다면 클라이언트가 5명 붙는다면 WSARecv()는 5번 호출될텐데, 각 클라이언트가 동시에 send한다면 서버는 GetQueuedCompletionStatus()를 통과하여 동시다발적으로 ProcessRecv()를 호출할텐데 이 때 멀티스레드 critical section 문제가 발생할 것 같은데 제가 잘못 이해한 부분이 있을까요?혹시 client 별로 한 개 씩 RegisterRecv()를 등록해 놨으므로 각 client들은 각자 등록한 WSARecv()에만 연결되는 것이라서 멀티스레드 문제가 안 생긴다는 뜻일까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
게임 클라이언트 개발에서 테스트 코드 작성이 도움이 될까요?
게임 클라이언트 개발을 진행되면서 코드 관리가 어려울 것 같은데, 테스트 코드를 작성하는 것은 클라이언트 개발에서는 도움이 되지 않는 편인가요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
아이템 강화 테이블 관련
안녕하세요~ 강의 잘 듣고 있습니다 ㅎㅎdb상에서 각 아이템별로 강화수치가 달라질때마다 인스턴스를 따로 두셨던데만약에 장비 아이템이 많으면 천개까지 늘어날텐데 그때마다 +1, +2 .. +10 까지 관리하기에는 너무 많아서이걸 만약에 인스턴스로 관리하지 않고강화를 해서 능력치가 +될 경우 해당 장비에 +된 강화수치를 메모리상에 저장하는 식으로 바꾸면 어떤 문제가 생길지 궁금합니다 ㅎㅎ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadManager.h 관련 질문있습니다.
제 ThreadManager.h 소스코드입니다.이 부분과 Types.h 소스코드를 포함하여 다른 모든 코드가 강사님의 코드와 같습니다.근데 저는 이상태로 빌드하면 이러한 컴파일오류들이 발생합니다.해결방법을 찾다가 제 ThreadManager.h 소스코드부분을std::functionstd::mutexstd::vecotr<std::thread>로 바꾸면 해결이 되긴합니다.하지만 강사님의 소스코드와 같이 std를 붙이지않았을때는 왜 제 코드에선 빌드오류가 나는지 원인을 모르겠습니다.types.h에 강사님이 작성하신 using을 이용한 코드들 똑같이 작성되어있고 CorePch.h에 using namespace std; 문장또한 존재하며 CorePch.h와 Pch.h include도 빼먹지 않았습니다.. 이유를 몰라 잠이안옵니다 ㅠㅠ..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
1:48 초에 패킷의 수 말씀하셨는데
일반적인 포트폴리오는 10~20개라이브에서는 100~200개면너무 적은 거 아닌가요? 스킬만 처리해도 되게 많은 패킷이 필요할 것 같은데일반화를 잘해서 패킷 구조 하나로도 많은 부분을 처리한다던지?.. 그런 건가요
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
강의 관련 질문 드립니다.
섹션 6 결제 까지 올라와 있고 그 이후 날짜에는 강의 파일이 없는데 이후에 추가로 올라오나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
면접 질문 드립니다.
루키스님 안녕하세요?이번에는 면접 질문 들고 왔습니다.마침 여기서 P2P 얘기가 나와 여기에 질문 드립니다. 서버관련 질답 받는 중, P2P 통신은 어떻게 하겠냐고 질문 받은적이 있어 질문 드리게 되었습니다. (당시에는 대답 못했지만) 키워드를 '포트포워딩'과 '나트 트라버설' 위주로 조사좀 해보면 면접관이 원하는 대답일까요?