inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

여기서 만약 복사 시작지점 + len 이 array 범위 밖이면 sendBuffer->Close(len) 안에서 ASSERT_CRASH(_allocSize >= len); 으로 체크하기 전에 array 정적배열에 memcpy를 하니까 이 부분에서 문제가 생길 것 같습니다. OnRecv로 들어온 buffer가 6001바이트짜리 라면 Open(4096)이 성공하고, 6000크기의 배열에 6001크기를 memcpy 하니 오버플로우가 일어날 것 같습니다. 아니면 Open(4096)으로 chunk로부터 사용할 수 있는 공간을 할당 받을 때 len이 4096보다 반드시 작을거라는 확신이 있기 때문에 memcpy 전에 확인하지 않는건가요?

  • 네트워크
  • MMORPG
  • windows-server
Dodontak 댓글 2 좋아요 0 조회수 147

코드 머지와 관련하여.

미해결

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

안녕하세요. 코드가 업데이트되는 부분이 풀버전이 아니고 변경된 부분들이 폴더 단위로 자료가 올라오는것 같습니다. 이에 따라 코드를 병합할때, Merge tool을 사용해야되는 것인지? 아니면 동일 폴더별로 복사 갱신을 하는 것인지 궁금하여 질문드립니다.

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • asp.net-web-api
Binary Kim 댓글 1 좋아요 0 조회수 125

퀘스트 처리 시 궁금한게 있습니다.

미해결

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

서버에서 브로드캐스트 이벤트 발생 시 퀘스트 클리어 확인 후 보상을 지급하고 DB 갱신을 하는 부분까지 이해했습니다. DB쪽에서 보상처리 라던지 퀘스트 상태저장 시 실패할 가능성도 있을 듯한데 만약 실패했다면 서버의 메모리를 이전상태로 롤백해줘야할듯한데 서버 메모리를 이전상태로 변경하려니 코드가 많이 지저분해지는듯한데 실패가능성은 없나요?

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • asp.net-web-api
봄에핀 댓글 2 좋아요 0 조회수 147

Nagle Algorithm

해결됨

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

Is there a reason why its not switch off in socket? Isnt it a problem with mmo servers and we hold packets on our own?

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • asp.net-web-api
Frontal Achivment 댓글 1 좋아요 0 조회수 122

현재 강의를 이용하여 3D 게임을 만들 경우 변경되야 될 사항들에 대해 궁금합니다.

미해결

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

안녕하세요. 루키스님 강의를 열심히 듣고 있는 초보개발자입니다. 현재 강의는 2D기반의 게임인데, 맵 및 몬스터, 캐릭터를 3D 케릭터로 변경되면, 현재 개발하신 코드들에서 어떤 부분들이 변경되는지.. 그리고 변경될 사항들이 많은지 궁금증이 생겨 문의드립니다.

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • asp.net-web-api
Binary Kim 댓글 2 좋아요 0 조회수 162

메모리 풀 질문있습니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

우선 좋은강의 만들어주셔서 감사합니다. 제가 질문드릴건 메모리풀을 1024까지는 32바이트단위로 만드는데, 그러면 32바이트전용 풀 64바이트 전용 풀 이렇게 만들어질거고 근데 이제 요청하는데 16바이트 요청을 1000번하면, 32바이트 풀안에 메모리헤더 큐가 1000개가 생기는거죠?? 해제안했다는 가정하에

  • 네트워크
  • MMORPG
  • windows-server
pnj991122 댓글 1 좋아요 0 조회수 136

메모리 풀 질문있습니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

우선 좋은강의 만들어주셔서 감사합니다. 제가 질문드릴건 메모리풀을 1024까지는 32바이트단위로 만드는데, 그러면 32바이트전용 풀 64바이트 전용 풀 이렇게 만들어질거고 근데 이제 요청하는데 16바이트 요청을 1000번하면, 32바이트 풀안에 메모리헤더 큐가 1000개가 생기는거죠?? 해제안했다는 가정하에

  • 네트워크
  • MMORPG
  • windows-server
pnj991122 댓글 1 좋아요 0 조회수 93

JobQueue의 Push Execute쪽 코드 질문

해결됨

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

해결 ++ 아래 질문 내용을 글로벌 큐에서 추가로 처리해 주는 거였습니다. 삭제가 안되서 최상단에 남깁니다. 이것저것 건들면서 연습하다 보니 제 환경에서 글로벌 큐 호출을 안해서 문제였습니다. 안녕하세요? 루키스님 강의를 참고하여 더미 프로젝트 하는 중에 문제가 식별 되어 제가 분석한게 맞다면 강의 코드에 문제가 있어 제보 드려봅니다. 문제라고 생각되는 부분은 JobQueue 클래스인데요, 문제 상황은 부하가 있는 상황에서 '워커스레드를 2개 이상 돌릴 때, Execute()함수가 실행되지 않는' 점을 확인하였습니다. jobCount 관련 변수의 조건이 어디서 안 맞는 것 같아서 생각해보건데, 아래와 같은 경우라고 생각됩니다. // JobQueue.cpp void JobQueue::Execute() { ... if (_jobCount.fetch_sub(jobCount) == jobCount) { // 여기서 다른 워커 스레드의 _jobCount.fetch_add 발생?! LCurrentJobQueue = nullptr; return; } ... } } 그렇기 때문의 이후의 잡들이 처리되지 못하고 해당 부분에서 prevCount가 계속 쌓이고 있었습니다. // JobQueue.cpp void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 여기서 prevCount가 계속 쌓여 0이 아님 if (prevCount == 0) { //그러므로 이 부분의 Excute()도 실행되지 않음 ... } 아래는 해당 클래스 cpp 전문입니다. 귀한 시간 내시어 확인해주시면 감사하겠습니다! #include "pch.h" #include "JobQueue.h" #include "GlobalQueue.h" /*-------------- JobQueue ---------------*/ void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 첫번째 Job을 넣은 쓰레드가 실행까지 담당 if (prevCount == 0) { // 이미 실행중인 JobQueue가 없으면 실행 if (LCurrentJobQueue == nullptr && pushOnly == false) { Execute(); } else { // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); } } } // 1) 일감이 너~무 몰리면? void JobQueue::Execute() { LCurrentJobQueue = this; while (true) { vector<JobRef> jobs; _jobs.PopAll(OUT jobs); const int32 jobCount = static_cast<int32>(jobs.size()); for (int32 i = 0; i < jobCount; i++) jobs[i]->Execute(); // 남은 일감이 0개라면 종료 if (_jobCount.fetch_sub(jobCount) == jobCount) { LCurrentJobQueue = nullptr; return; } const uint64 now = ::GetTickCount64(); if (now >= LEndTickCount) { LCurrentJobQueue = nullptr; // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); break; } } }

  • 네트워크
  • MMORPG
  • windows-server
mhyim 댓글 1 좋아요 0 조회수 108

JobQueue의 Push Execute쪽 코드에 문제가 있는 것 같아 말씀 드려봅니다

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요? 루키스님 강의를 참고하여 더미 프로젝트 하는 중에 문제가 식별 되어 제가 분석한게 맞다면 강의 코드에 문제가 있어 제보 드려봅니다. 문제라고 생각되는 부분은 JobQueue 클래스인데요, 문제 상황은 '워커스레드를 2개 이상 돌릴 때, Execute()함수가 실행되지 않는' 점을 확인하였습니다. jobCount 관련 변수의 조건이 어디서 안 맞는 것 같아서 생각해보건데, 아래와 같은 경우라고 생각됩니다. // JobQueue.cpp void JobQueue::Execute() { ... if (_jobCount.fetch_sub(jobCount) == jobCount) { // 여기서 다른 워커 스레드의 _jobCount.fetch_add 발생?! LCurrentJobQueue = nullptr; return; } ... } } 그렇기 때문의 이후의 잡들이 처리되지 못하고 해당 부분에서 prevCount가 계속 쌓이고 있었습니다. // JobQueue.cpp void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 여기서 prevCount가 계속 쌓여 0이 아님 if (prevCount == 0) { //그러므로 이 부분의 Excute()도 실행되지 않음 ... } 아래는 해당 클래스 cpp 전문입니다. 귀한 시간 내시어 확인해주시면 감사하겠습니다! #include "pch.h" #include "JobQueue.h" #include "GlobalQueue.h" /*-------------- JobQueue ---------------*/ void JobQueue::Push(JobRef job, bool pushOnly) { const int32 prevCount = _jobCount.fetch_add(1); _jobs.Push(job); // WRITE_LOCK // 첫번째 Job을 넣은 쓰레드가 실행까지 담당 if (prevCount == 0) { // 이미 실행중인 JobQueue가 없으면 실행 if (LCurrentJobQueue == nullptr && pushOnly == false) { Execute(); } else { // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); } } } // 1) 일감이 너~무 몰리면? void JobQueue::Execute() { LCurrentJobQueue = this; while (true) { vector<JobRef> jobs; _jobs.PopAll(OUT jobs); const int32 jobCount = static_cast<int32>(jobs.size()); for (int32 i = 0; i < jobCount; i++) jobs[i]->Execute(); // 남은 일감이 0개라면 종료 if (_jobCount.fetch_sub(jobCount) == jobCount) { LCurrentJobQueue = nullptr; return; } const uint64 now = ::GetTickCount64(); if (now >= LEndTickCount) { LCurrentJobQueue = nullptr; // 여유 있는 다른 쓰레드가 실행하도록 GlobalQueue에 넘긴다 GGlobalQueue->Push(shared_from_this()); break; } } }

  • 네트워크
  • MMORPG
  • windows-server
댓글 2 좋아요 0 조회수 152

Protobuff is it sufficient for mmorpg?

해결됨

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

I mean that protobuff need serialization, and its not zero copy so it introduce latency to communication. Is it suitable for game servers with 1-5k players? Or its better to use instead https://flatbuffers.dev/quick_start/ ?

  • network
  • MMORPG
  • windows-server
Frontal Achivment 댓글 2 좋아요 0 조회수 225

void IocpEvent::Init() is correct?

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

void IocpEvent::Init() { OVERLAPPED::hEvent = 0; (...) } Isnt this a mistake? hEvent isnt static field and when compiled with gcc its error: 'hEvent' is not a static member of 'OVERLAPPED'. With msvc its compiled but its interpreted as 2 different instruction wich could lead to unexpected behaviour?

  • network
  • MMORPG
  • windows-server
Frontal Achivment 댓글 1 좋아요 0 조회수 153

UI 자동화 관련 문의입니다.

해결됨

[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)

UI_TitleScene.cs StartImage 에 클릭 기능 추가에 관한 문의입니다. GetObject((int)GameObjects.StartImage).BindEvent((evt) =>{ Debug.Log("ChageScene"); Managers.Scene.LoadScene(EScene.GameScene);} , Define.EUIEvent.Click ); 에서 StartImage 의 경우 enum GameObjects 소속에 타입도 GameObject 라서 Extension에 의해서 BindEvent를 바로 사용할 수 있는 것으로 보이는데, 만약 Image라 하더라도 Click등의 액션을 이용하려면 무조건 GameObject로 설정해야 하는 것인가요? 아님 extension에서 뭔가를 설정하면 Image(Object)도 GameObject 같이 사용가능한가요? 이것 저것 해봐도 붉은색 투성이라 문의 드립니다.

  • C#
  • unity
  • MMORPG
Razer 댓글 1 좋아요 0 조회수 139

ResourceManager에서 Multiple Sprite를 로드하는 방법

미해결

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

안녕하십니까? ResourceManager.cs 코드의 어드레서블 에셋 로드 부분에서 스프라이트 로드 관련 질문입니다. 현재 코드는 single sprite에 대한 방식만 제공하고 있는데요. 혹시 Multiple Sprite를 로드하는 방법에 대해 따로 추가로 연구하신 방법이 있는지 궁금합니다. 검색을 해보니 인프런 AI답변으로 Single 스프라이트로 로드 하는걸 추천한다고 했습니다. 개인적인 프로젝트라면 개별 스프라이트로 분리해서 추가하는 것도 가능한데, 실제 현업에서는 Multiple Sprite로 작업이 많을 거 같기도 하고 궁금한 부분이라 질문드립니다. 감사합니다.

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • addressableassets
rurcgm 댓글 1 좋아요 0 조회수 133

DBSynchronizer에서의 XML과 DB 동기화 문제

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

안녕하세요. DB관련 작업중에 이런 문제가 생겨서 어떻게 이런 결과가 생긴 것 인지 궁금해 질문 올려봅니다. 우선 모든 강의를 다 들었다는 전제하에, 다음과 같은 XML 코드는 잘 동작합니다. 이 코드를 기반으로 간단한 로그인 시스템을 만들어 보려고 Account Table과 Register Procedure을 만들었는데요 문제는 기존에 있는 DB를 가져와서 DBSynchronizer의 Synchronize를 실행하는 부분에 Gather 시리즈에 문제가 있습니다. Gather 시리즈를 간략하게 요약하자면, 현재 system에 있는 Table, Column, Procedures들을 모두 긁어서 While(...fetch()) 문으로 DBModel::Table, DBModel::Column 등으로 매핑하는 작업입니다. 여기서 Fetch할때마다 함수 가장위에 정의해둔 여러 변수들이 갱신되는데요 bool값이나 숫자값은 값을 Fetch() 가 값을 덮어씌워 별 문제가 없는데 tableName 이나 columnName 같은 특정 문자열 배열인 경우에 문제가 생겼습니다. 위의 사진의 경우 columnName 을 순서대로 파싱할경우 각 DBModel::Column 별로 name이 accountId, email, pwHash가 되야할게 accountId, emailntId, pwHashtId가 되더라구요 그래도 운이좋게 끝에 tId가 공통됨으로, WChar 부분이 Fetch()시 완전히 초기화되지 않고 앞의 주소값만 넘어가서 len만큼 채우는것으로 결국 len뒤의 값은 남아 그대로 반영이 된것으로 확인 됬습니다. 각 Loop가 끝날때마다 WChar과 Vector 같은 주소값을 가지는 모든값의 초기화를 이런식으로 명시함으로써 해결할 수 있었지만, 예제코드는 잘 동작했던것을 보아하니 뭔가 코드를 빠뜨렸나 싶었습니다. 참고로 예제 코드의 Gold같은 경우 name이 id, gold, name, createDate로 작은값부터 커지기 때문에 위의 문제가 발생하지 않았나 싶기도 합니다. 혹시 이 문제 저만 그런가요? 원본 코드에서 spRegister 의 out Parameter를 처리하기 위해 살짝 바꾸긴 했는데 그거 때문이려나요

  • 네트워크
  • MMORPG
  • windows-server
timesilvergold 댓글 1 좋아요 0 조회수 76

M2는 업데이트가 끝난건가요?

미해결

[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)

안녕하세요! M2 업데이트 끝날 때 몰아서 듣고 싶어서 기다리고 있는데 공지사항과 일정 변동?을 보면 업데이트가 끝났다는 뉘앙스로 말씀하셨지만 본 강의 커리큘럼을 보면 아직 챕터 이름?이 살아 있어서 업데이트가 끝난건지 업데이트 예정인지 궁금합니다!

  • C#
  • unity
  • mysql
  • MMORPG
  • ef-core
  • asp.net-web-api
mhyim 댓글 1 좋아요 0 조회수 168

chrono, thread헤더가 더 필요한것 같아 질문드립니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

GameServer.cpp에서 this_thread::sleep_for(10ms); 이 코드를 위해 chrono 헤더가 main 함수에 thread를 위해 thread헤더가 필요한것 같습니다.

  • 네트워크
  • MMORPG
  • windows-server
배승혁 댓글 0 좋아요 3 조회수 97

포폴 관련해서 질문드립니다.

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

바보같은 질문처럼 느껴지실수도 있겠지만... 게임 서버를 수강 후 배운 코드를 바탕으로 여러가지 컨텐츠를 붙여서 포폴을 만들면 좋지 못하나요? 배운 코드를 바탕으로 반드시 제 방식으로 바꿔야만 하나요? 바꿔야 한다면 어느정도로 바꿔야 할까요. 취업 준비가 너무 어렵습니다. 후배의 방황을 한번만 잡아주시면 감사드리겠습니다.

  • 네트워크
  • MMORPG
  • windows-server
  • 게임서버
  • iocp
엔딩 댓글 2 좋아요 0 조회수 273

9주차 npc 생성 안되는 이슈. Custom Tile 깨짐

해결됨

[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)

9주차 소스를 프로젝트로 열어서 보니까 다른 부분이 있네요. 제 프로젝트는 이렇게 뜨는데 9주차 리소스 프로젝트는 이렇게 뜹니다 또한 Tilemap에서 Info가 현 프로젝트는 안뜨지만 리소스 프로젝트로는 Info가 잘 뜨는 것을 확인했습니다 유니티버그 같은데.. 다시 Tilemap 새팅해봐야 될 것 같은데 해결하신 분 있으면 공유부탁드립니다!

  • C#
  • unity
  • MMORPG
전하늘 댓글 1 좋아요 0 조회수 134

44강 Stage 분할 Cannot Find 에러 관련

해결됨

[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)

3맵으로 넘어가면서 Stage 로드 언로드 봐보려다가 에러 발생하고 있었습니다. 맵 배치가 조금이라도 겹쳐있어야 에러가 안뜰것 같더라고요. 실제로 0번 -> 2번 stage 처럼 2번 -> 3번 stage를 겹쳐서 테스트해보니깐 에러가 안뜨네요 update에서 CheckMapChanged로 stage index를 찾는데 에러면 return -1을 넘기지만 이에대한 예외처리가 안돼서 에러가 많이 뜨다가 유니티가 튕겼던 상황이 있어서 공유드립니다.

  • C#
  • unity
  • MMORPG
전하늘 댓글 1 좋아요 0 조회수 121

DB에 배열을 추가하고 싶은데 어떻게 하면 되나요

미해결

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

아이템 보유 정보를 DB에 배열에 넣어서 관리하고 싶은데 지금 ORM에는 배열을 추가하는 기능은 없는 것 같습니다. 방법이 없을까요

  • 네트워크
  • MMORPG
  • windows-server
김기택 댓글 2 좋아요 0 조회수 149

인기 태그

인프런 TOP Writers

주간 인기글