묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
성능 테스트 결과
SList로 구현한 코드와 Lock을 걸며 큐에 pop push를 하는 코드의 실행시간을 스레드의 수와 일의 반복수(for문의 반복횟수)를 늘려서 시간을 측정해보았더니 Lock을 걸어 실행한 시간이 더 짧게 나오는데 둘다 어쨋든 CAS연산을 해주기 때문에 그런것일까요? 그렇다고 하면 굳이 LockFree로 구현하는 이유가 뭔지 궁금합니다Lock을 쥔 스레드가 데드락이 되어 다른 스레드들도 통과를 못하는 경우가 있어서 그런건가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 서버 Stateful, Stateless 진로 고민
먼저 강의 재밌게 보고 있습니다. 감사합니다.이 강의를 사면서 좋아하는 게임 개발을 위해 어떤 장르든 만들 수 있는 능력을 키우는게 목표였습니다.강의를 공부하면서 진로를 생각해보니, Stateless로 취직을 하게 된다면 (예. C#을 사용하는 수집형 게임) 경력의 문제 때문에 Stateful로 갈 수 없다는 생각이 들게 되었습니다. 또한 요즘은 Stateless 공고도 많이 없어서 이쪽으로 갈 경우 나중에 경력이 망할 수도 있는게 아닌지 불안합니다. (실력이 아닌 기술 스택에 의한 경력을 안쳐준다든지...)제가 만들고 싶은 게임이 아니라도 Stateful로 경력을 시작해서 원하는 곳으로 이직을 할 기반을 만드는 것이 맞는지, 그냥 Stateless여도 이직할 곳이 꽤 있으니 원하는 회사로 지원하는게 맞는지 너무 어렵습니다.공부만 생각하고 싶은데, 집중이 안되서 질문 드립니다...
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WaitOnAddress와 Sleep의 차이 질문
Sleep()은 현재의 타임 슬라이스를 모두 포기하고 인자로 들어온 값 만큼 스케쥴링을 포기하는 것은 맞지만 여전히 'Ready 상태'인 반면 WaitOnAddress()는 아예 'Blocked 상태'로 빠져 버려서, 스레드가 깨어나는 상황이라면 Dispatcher가 직접 Ready Queue로 스레드를 넣어줘서 Ready 상태가 됨에 따라 다시 스케쥴링이 되는 상황으로 이해했는데 올바른 방향으로 이해한 것일까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
질문 있습니다.
안녕하세요. 강사님.이전 강의에서 VisionCube::Update 함수에서Spawn패킷 처리할 때 MergeFrom으로 복사를 하셨습니다.이번 강의의GameRoom::EnterGame 에서는Spawn패킷을 참조형식으로 Add 했습니다. 제 생각에는현재 잡방식이기 때문에 비동기로 처리되어 있고,2) EnterGame보다 빈번하게 발생하는 VisionCube::Update에서는 복사로 Add를 진행한 것이고, 3)자주 발생하지 않는 EnterGame 함수여서참조 값으로 Add 한것 인가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
심리스 존 방식 난이도
심리스하고 존 방식 난이도에 비교 할때심리스를 100이라고 한다면 존 방식은주관적으로 몇이라고 생각 하세요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
궁금한거 있습니다.
ClientSocket 즉 Session 의 소켓을 CreateIoCompletionPort 를 이용하여 등록해주어야지만 IOCP 큐로 부터 통지가 오지않나요? WSARecv 만 걸었는데 어떻게 통지가 오는지 궁금합니다.
-
해결됨[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
학습 전 커리큘럼 관련 질문 드립니다
안녕하세요강의 커리큘럼에 대해 알고 싶은 게 있어 질문 드립니다 저는 현직 웹개발자인데1인 방치형 rpg 게임을 만들고 싶어서작년에 M1+C1 강의를 구매했다가 다시 듣기 시작했습니다 그런데 학습 전 수강평을 살펴보는데 M1 강의가 무산됐다는 글이 많더라구요그래서 무산된 프로젝트를 참고하는 것보단 완성된 프로젝트를 참고하고 싶어서컨셉이 MMO RPG라서 구매를 하지 않았던 M2 강의를 구매했습니다 그런데 이 프로젝트도 제 기억엔 작년 하반기나 올해 상반기쯤 마감 예정이었던 듯한데마지막 업로드가 얼마 전인 12월 17일이더라구요 그래서 강의 시작 전 조금 더 확신을 갖고 싶어서 질문 드리고 싶습니다바쁘시겠지만 긴 답변을 원하는 게 아닌 만큼퀄리티 떨어지는 AI답변 말고현 시점에서의 강사님의 직접적인 답변을 받아보고 싶습니다 강의 구매목록M1 + C1M2C# 개발시리즈 part1(C# 기초)C# 개발시리즈 part3(유니티 엔진)C# 개발시리즈 part4(게임서버)C# 개발시리즈 part7(Unity + C# 서버 연동 기초) 현재 언어는 다르지만 개념이 겹치는 걸 제외하고 위 강의들을 구매하였고 따로 unity 에셋 정도를 구매한 상태인데강의 금액도 금액이고 제가 이 강의를 수강하려면 적지 않은 시간이 들 거 같아서시작 전 강사님의 시선에서 제 학습 방향이 가능한 것인지 답변을 들어보고 싶습니다 질문 1위 강의들을 완강하고 기획과 아트 리소스를 변경할 수 있게 되면게임을 출시할 수 있을 정도의 완성 구조 소스코드를 제공받을 수 있는 것 맞을까요? 질문 2unity 에셋스토어에서 캐릭터 등의 리소스를 구매하여 사용하려는데가능할지 여부와 만약 그렇게 할 경우 주의 또는 참고해야 될 사항이 있을지 궁금합니다
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
강의 커리큘럼 질문 드립니다
안녕하세요강의 커리큘럼에 대해 알고 싶은 게 있어 질문 드립니다 저는 현직 웹개발자인데1인 방치형 rpg 게임을 만들고 싶어서작년에 M1+C1 강의를 구매했다가 다시 듣기 시작했습니다 그런데 학습 전 수강평을 살펴보는데 M1 강의가 무산됐다는 글이 많더라구요그래서 무산된 프로젝트를 참고하는 것보단 완성된 프로젝트를 참고하고 싶어서컨셉이 MMO RPG라서 구매를 하지 않았던 M2 강의를 구매했습니다 그런데 이 프로젝트도 제 기억엔 작년 하반기나 올해 상반기쯤 마감 예정이었던 듯한데마지막 업로드가 얼마 전인 12월 17일이더라구요 그래서 강의 시작 전 조금 더 확신을 갖고 싶어서 질문 드리고 싶습니다바쁘시겠지만 긴 답변을 원하는 게 아닌 만큼 강사님의 직접 답변을 부탁드립니다 강의 구매목록M1 + C1M2C# 개발시리즈 part1(C# 기초)C# 개발시리즈 part3(유니티 엔진)C# 개발시리즈 part4(게임서버)C# 개발시리즈 part7(Unity + C# 서버 연동 기초) 현재 언어는 다르지만 개념이 겹치는 걸 제외하고 위 강의들을 구매하였고 따로 unity 에셋 정도를 구매한 상태인데강의 금액도 금액이고 제가 이 강의를 수강하려면 적지 않은 시간이 들 거 같아서시작 전 강사님의 시선에서 제 학습 방향이 가능한 것인지 답변을 들어보고 싶습니다 질문 1위 강의들을 완강하고 기획과 아트 리소스를 변경할 수 있게 되면게임을 출시할 수 있을 정도의 완성 구조 소스코드를 제공받을 수 있는 것 맞을까요? 질문 2unity 에셋스토어에서 캐릭터 등의 리소스를 구매하여 사용하려는데가능할지 여부와 만약 그렇게 할 경우 주의 또는 참고해야 될 사항이 있을지 궁금합니다
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
JobTimer 구동 스레드
모든 스레드가 distribute하지 않고, 메인 스레드만 담당하게 해주면 락을 잡을 필요도 없지 않나요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
수업질문은 아닌데요^^
켠출 수강생 리뷰 이벤트] M1, M2, D1→ 여기에 이메일 주소 남겼는데 한번 확인해주시면 감사드리겠습니다^^ rookiss@naver.com 여기로도 보내드렸습니다^^ 감사합니다!
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
수업질문은 아닌데요^^
켠출 수강생 리뷰 이벤트 M1, M2, D1 → 여기에 이메일주소 남겼는데, 한번 확인해주시면 감사드리겠습니다^^ rookiss@naver.com 여기로도 보내드렸습니다^^ 감사합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TryPop() 동작 관련 질문
0이 아닌 -countIncrease와 비교하는 이유가 다른 쓰레드들에 의해 internalCount가 이미 음수가 되어있는 경우 countIncrease의 증가로 인해 정확히 0이 되는 상황일때, 삭제 할 수 있도록 처리하기 위함이 맞나요? compare_exchange_strong에 의해서 oldHead가 최신 _head로 갱신되므로, 이미 pop된 객체에 대해 다시 접근한다거나, 쓰레드가 함수의 무한 루프에 빠지는 경우가 배제되는 것으로 이해했는데 맞을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
로드맵 C#서버 C++서버 방향성 질문
안녕하세요 강사닙 C++ IOCP강의 정말 감탄하면서 잘 들었습니다. ( 되새김질 50번은 한거같네요 ) 양질의 강의 제공해주신 점 정말 감사합니다.현재 저는 대학교 3학년 복학 준비중이고, 졸업작품 제작을 염두에 두고 있는 상태입니다.로드맵 관련해서 질문하고 싶은게 있습니다. Unity의 part4 C#목차를 보면 C++서버와 동일하더라고요.근데 굳이 후순위에 배치하신점이 궁금합니다.( C++서버와 구조가 같아보이는데 들어야할까요? ) ( JobQueue같은 스레드 배치항목만 이해했다면 굳이? 싶어서요 ) 또한 unity시리즈의 데베쪽 강의와 연동쪽 (part 5~9 )를 듣고 싶은데, unity엔진에 대한 경험이 없어도 될까요?UE로 포폴을 작성할 생각인데, C++연동 강의를 듣고 UE공부를 할려고 합니다. (GAS 등 ) 이 때, 공부 순서를 어떻게 해야할지 감이 안잡혀서요...C#으로 데베연동쪽으로 컨텐츠 구현감을 잡고나서 하는게 좋을까요?분산서버의 경우 C#과 C++을 혼용해서 개발할 수 있을거 같은데, 이걸 위해서라도 C#을 공부하는게 좋을까요? ( 인증서버는 C#으로 구현하는 경우가 많으니 )
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
메인스레드가 1번을 먹는것까지는 이해했는데 그 이후에 원래 1부터 6까지 전부 출력되는것이 맞나요? 루키스님 화면에서는 2에서 6까지만 출력이 되는걸로 보여서 질문드립니다 해결했습니다 감사합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
생명주기를 위한 의도적 복사
안녕하세요 강의 정말 감탄하면서 잘 수강하고 있습니다. Job에서 보편참조로 받았는데 forward로 하지 않은 것은 Ref들의 생명연장을 해주기 위해 의도적으로 복사하기 위한 의도일까요?JobSerializer로 인터페이스를 제공한 쪽에서는 어차피 Job내부에서 복사를 일으키고 있으니 forwad로 전달하는 의도가 맞을까요?강의 코드를 매일 복기하면서 보고 있는데 정말 감탄이 나오네요 항상 감사드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
락프리의 실무에서 사용 질문
락프리 구조를 사용하지않는다고 하셨는데 락프리를 써야 서버의 성능이 제대로 나오는것 아닌가요? 오히려 너무 어려워서 제대로 만든것이 아니라면 서버가 죽거나 오류가 날수 있기때문에 안쓰는 건가요?락을 사용해서 데이터 하나에 접근을하면 싱글 스레드보다 성능이 낮을것같아서 질문드려요멀티스레드를 사용하는 경우가 실무에선 많이 없을까요? 아니면 boost.asio에 있는 lockfree자료구조를 사용하나요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
게임 로직 루프에서 게임 틱 누락으로 인한 높은 CPU 사용 문제
수업에서는 게임 로직 루프에서의 게임 틱(game tick)에 대해 다루지 않아 CPU 사용률이 항상 높게 유지되는 문제가 발생한다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
RewardPlayer함수 에 대해서
강사님 안녕하세요. Slot 번호가 중복되는 것을 방지하기 위해서이런식으로 HashSet을 사용하려고 합니다.이렇게 해도 괜찮은 해결방법인가요?여기서 SlotKey 는 HashSet<int> 입니다.
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
선 이동과 히트 판정에 대해 질문 드립니다.
안녕하세요. 루키스님!M2 코드를 분석하면서, 약간 다른 게임을 (브롤스타즈같은 모바일 탑뷰 슈팅게임) 만들고 있습니다.선 이동으로 구현하고 있는데, 서버 판정 이후 해결되지 않는 부분이 있어 질문 드립니다. 현재까지 구현한건 키보드 기반 간단한 이동 동기화 입니다. 이동 방법은 키보드나 조이스틱 기반의 선 이동으로 구현하려 합니다.지금 이동 코드는 루키스님 질의응답과 해외 커뮤 글을 토대로 아래 방식으로 구현 했습니다.0.1초마다 동기화를 시도함키보드 입력이 있으면 desirePos를 그 방향으로 0.1초동안 갈 수 있는 pos 를 찍음클라 판단으로 갈 수 있는 곳(벽X, 장애물 X) 이면 destPos를 갱신서버로 전송서버에서 정당한 이동 요청인지 판정맞으면 브로드캐스트각 클라에서 이동 패킷 수신 후 캐릭터 갱신 여기까지 하면 어느정도 자연스럽게 작동은 합니다.하지만 이동을 보낸 클라 입장에서 서버로 부터 받은 판정을 적용하는 부분에 어려운 부분이 있습니다.아무래도 선 이동이 예측 이동 후 보정이라 네트워크 지연으로 예측과 판정이 너무 많이 틀어지는 경우가 있을 것 같습니다.예를들어, 클라에서 단순 우측으로만 움직인다고 가정하고, x 축으로 10 -> 11 -> 12 -> 13 선 이동을 했다는 가정으로 시작하겠습니다.네트워크 지연으로 13에 도달했을 때 서버에서 10 이동 동기화가 왔다면, 선 이동 클라는 10으로 튕겨 버립니다. 그 후 방향을 바꿔 왼쪽으로 움직이면 10 -> 9 -> 8 -> 7 로 먼저 움직이겠지만, 이미 서버로 보낸 이동 좌표로 인해 11, 12, 13이 또 오기 때문에 캐릭터는 퉁퉁 튀면서 움직이지 못하는 상태가 될 것 같습니다.또한, 다른 클라에서 공격을 해도 히트 판정이 다 꼬여 게임이 이상해질 것 같습니다. 이 문제를 해결하기 위해 고민해보니, 클라에서 선 이동 버퍼(기록)을 둔다고 합니다.이 버퍼는 아래 문제가 생겼을 때 서버 판정을 다시 replay 하고, 서버 판정을 완료하면 다시 저장된 선 이동 버퍼를 replay 해 클라에서 너무 앞서나가지 않도록 하더라구요.선이동 버퍼의 index와 서버 판정의 index가 n 이상 벌어지면, 서버 판정 index의 pos 로 플레이어 위치를 되돌리고 클라 선 이동 판정을 다시 실행시킴. 서버 판정으로 이동할 수 없는 pos 라면, 해당 pos 로 되돌리고 그 그 이후 선 이동 버퍼를 replay 여기서부터 질문입니다만,이런 방법이 쓰이는 이유는 게임 전체의 공정성 때문 일까요?네트워크 문제가 있는 일부 클라는 계속 롤백되는 경험을 하지만, 다른 유저들은 서버에서 허가한 상태만 보니까요.보통 선 이동 버퍼와 서버 판정은 어느정도로 갭을 두나요?0.1초마다 동기화 한다고 가정 하고 이동 패킷은 ++1 인 정수형 인덱스로 구분한다고 했을 때, 저는 한 4 정도로 생각했습니다.선 이동과 서버 판정이 약 0.4초이상 벌어지면 롤백하고 다시 동기화 한다 입니다.히트 판정의 경우 클라들, 서버가 같은 ticktime을 공유하고 있고 서버에서 내려준 히트 시작 시간을 보내주면, 클라에서 timejob queue에 넣어두었다가 해당 시간이 되면 애니메이션을 시작하면 되지 않을까? 라는 생각 입니다.고민을 많이 해보았는데, 이 이상 생각이 안되어 질문 드립니다.바쁘시겠지만 답변 주시면 감사히 학습에 사용하겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
32bit threadID와 16비트 상위 WriteFlag에 대해
32비트짜리 threadID를 비트 연산으로 16비트 옮겨준뒤 짤라준 것을 WriteFlag에 담는 과정에서 손실이 일어나는거 아닌가요? 그래서 현재 ThreadID와 _lockFlag의 WriteFlag를 다시 16비트 옮겨준 값이랑 비교했을 때 일치하지 않는 문제가 발생할 수 있지 않나요? 강의 18:40초입니다. ( ThreadID를 16비트로 관리하지 않는 이유는 또 무엇인가요??? )