묻고 답해요
144만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WriteUnlock을 잘 못 호출하는 경우에 대해서
일반 Lock을 쓸 때 Unlock을 한번 더 호출해버리는 실수는 크래시가 뜨기에, 디버깅으로 알아채기 쉬운 부분이라고 생각합니다. void Lock::WriteUnlock() { if ((_lockFlag.load() & READ_COUNT_MASK) != 0) // Thread id를 체크하지 않음. Read가 없는 상황에서 WriteUnlock()이 통과할 수 있음. CRASH("INVALID_UNLOCK_ORDER"); const int32 lockCount = --_writerCount; if (lockCount == 0) _lockFlag.store(EMPTY_FLAG); }하지만, WriteUnLock() 에서는 아래와 같은 경우에 문제가 있을 수 있다고 생각합니다. // 실수로 호출 WriteUnlock(); // _writerCount = -1 // 크래시 없이 작업 진행 WriteLock(); // _writerCount = 0, 스레드 id 등록 WriteLock(); // _writerCount = 1 WriteUnlock(); // _writerCount = 0, 스레드 id 해제 WriteUnlock(); // _writerCount = -1 /***** 오랜 작업 뒤 ******/ WriteLock(); // _writerCount = 0, 스레드 id 등록 WriteUnlock(); // _writerCount = -1 // 타 스레드 접근 ReadLock(); /*or*/ WriteLock(); // 틱 시간 초과로 CRASH의 드문 경우에 한해서 수많은 코드 작업이 이뤄진 뒤라, 어디서 실수가 발생했는지 디버깅이 어려워질 것 같습니다.크게 신경 쓰지 않아도 되는 건지, 아니면 놓치고 있는 부분이 있는 것인지 궁굼합니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
어드레서블 Sprite 관련해서 질문이있습니다.
안녕하세요개인 프로젝트에 적용하는 과정에서 문제가 발생해서 질문드립니다. 제 스프라이트 중 하나가 SpriteMode가 Multiple로 설정되어 있어서, 해당 스프라이트를 리소스매니저 Get호출할 때 아래와 같은 오류가 발생하고 있습니다. System.Exception: Unable to load asset of type UnityEngine.Sprite from location Assets/03.Resources/Sprites/UI/Game_Main/ico_misc 1.png[ico_misc 1].UnityEngine.ResourceManagement.Util.DelayedActionManager:LateUpdate () (at ./Library/PackageCache/com.unity.addressables@1.21.21/Runtime/ResourceManager/Util/DelayedActionManager.cs:162) 이 오류를 어떻게 해결할 수 있을까요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock-Free Stack #2 강의 질문
TryPop에서 compare_exchange_weak를 지난 시점에서 oldHead에 저장된 노드는 나만 가지고 있는게 아닌가요? 다른 애들은 접근하려고해도 이미 head가 바뀌어서 compare_exchange_weak를 통과하지 못하고 다음 것을 가져오는게 아닌가요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
여유가 되신다면 mmorpg의 꽃, 레이드관련 강의 요청드려도 될까요
용가리가 브레스 쾅발구르기 낙석 쿠과광마지막 발악패턴 비늘탄막 슈슈숭난관을 넘어 던전에서 쌓여가는 우정!상상으로도 가슴뛰는 컨텐츠인데너무 무리한 부탁이겠지유
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
Data #2 까지 들었는데 빌드를 해보고싶은데, 어느 강의에서 확인할 수 있나요?
아무래도 어드레서블의 에셋로드가 안되고 있는것 같은데..글을 찾아보니 5월 강의에서 다룬다고 되어있더라구요.어느 강의를 봐야 이부분을 해결할 수 있나요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 정책 Release와 Acquire의 사이의 코드 재배치의 경우 어떻게 작동하나요?
Release는 이전 코드들이 뒷 줄로 코드 재배치되는 것을, Acquire은 뒷 줄 코드들이 이전으로 재배치되는 것을 막아준다고 배웠습니다.#include <atomic> #include <iostream> atomic<bool> ready; int value; void Producer() { value = 10; ready.store(true, memory_order::memory_order_release); value = 7; // ready.store() 위로 코드 재배치 가능 or 불가능 } void Consumer() { value = 0; // ready.load() 아래로 코드 재배치 가능 or 불가능 while (ready.load(memory_order::memory_order_acquire) == false) ; cout << value << endl; } int main() { // 스레드 실행 코드... 생략 }이런 value = 7과 value = 0 코드의 경우에는 코드 재배치가 일어날 위험이 있는 건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TLS 는 데이터를 힙영역에서 가져갈때 깊은복사가 일어납니까 얕은복사가 일어납니까?
TLS 는 데이터를 힙영역에서 가져갈때 깊은복사가 일어납니까 얕은복사가 일어납니까?점유를 해야하니 느낌상 얕은복사일것같긴한데, lock을 하는거면 깊은복사를 하는것같기도하고... 어떻게 작동하는지 여쭙고싶습니다
-
미해결[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)을 남긴채로 자식(객체부분)만 메모리 해제를 할 수 있는건가요? 아니면 이게 불가능 하기 때문에 그냥 구현에 따라 다른건가요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
에러해결방벙을 찾고싶어요
public T Load<T>(string key) where T : Object;//ResourceManager.Load<T>(string)은 abstract, eatern또는 partial로 표시되어 있지 않으므로 본문을 선언해야 합니다 라고 뜨는데 어떤 선언문을 써야 하나요?{ //','와' )'가 필요하다고 오류가 뜨는데 어디가 필요한 건지 궁금합니다 그리고 TryGetValue 와 key가 현재 컨텍스트에 없다고 에러가 뜨는데 어떻게 해결해야 하나요? if (_resources.TryGetValue(01Key, out Object resource)) //';'가 필요하다는 에러가뜨고 T도 현재 컨텍스트에 없다고 에러가 나옵니다 return resource as T; return null;}GameObject Instantiate(string key, Transform parent = null, bool pooling = false){ GameObject prefab = Load<GameObject>(key); if (prefab == null) { Debug.LogError($"Failed to load prefab : {key}"); return null; } //if (pooling) // return Managers.Pool.Pop(prefab); GameObject go = Object.Instantiate(prefab, parent); go.name = prefab.name; return go;}심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS1031 형식이 필요합니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 17 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS8124 튜플에는 요소가 두 개 이상 있어야 합니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 17 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS1519 클래스, 레코드, 구조체 또는 인터페이스 멤버 선언에 잘못된 토큰 '{'이(가) 있습니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 16 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS1519 클래스, 레코드, 구조체 또는 인터페이스 멤버 선언에 잘못된 토큰 '{'이(가) 있습니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 16 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS1519 클래스, 레코드, 구조체 또는 인터페이스 멤버 선언에 잘못된 토큰 'as'이(가) 있습니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 18 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS1519 클래스, 레코드, 구조체 또는 인터페이스 멤버 선언에 잘못된 토큰 ';'이(가) 있습니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 18 활성 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태 세부 정보오류 CS8803 최상위 문은 네임스페이스 및 형식 선언 앞에 와야 합니다. Assembly-CSharp C:\Users\Administrator\Desktop\taein]\MMO\mmorpg\Assets\@Scripts\Managers\Core\ResourceManager.cs 23 활성 그리고void LoadAsync<T>(string key, Action<T> callback = null) where T : UnityEngine.Object{ //Cache if (_resources.TryGetValue(key, out Object resource)) { callback?.Invoke(resource as T); return; } string loadkey = key; if (key.Contains(".sprite")) loadkey = $"{key}[{key.Replace(".sprite", "")}]"; var asyncOperation = Addressables.LoadAssetAsync<T>(loadkey); asyncOperation.Completed += (op) => { _resources.Add(key, op.Result); _handles.Add(key, asyncOperation); callback?.Invoke(op.Result); };앞에와 마찬가지로 resources 와 handles가 계속 이름이 현재 컨텍스트에 없다고 에러가 뜹니다 어떻게 해결해야 하나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소수를 나열하는 방법에 대한 질문
안녕하세요 연습문제를 풀어보다가 궁금한 점이 생겨 질문 드립니다.atomic<int> primeCount에 thread들이 cnt++하는것 까지는 이해를 했습니다.궁금한 점은 vector나 배열에 구해진 소수를 push_back해서for(int i : vector) 하려면 CountPrime할때 writeLock을 잡아서 push_back을 해줘야 하나요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
GameServer 빌드 오류
수업자료를 다운받고 처음에 GameServer콘솔앱을 빌드하는 과정부터 오류로 실행이 안되네요 ㅠㅠbat 파일이 윈도우 보안에 걸려서 그런가 생각되어서 bat파일을 새롭게 직접 생성해줘도 문제가 해결되지 않네요.cmd 창에서 직접start GenProto.bat %cd% \Server\GameServer\Packet\Generated\ 1 과 같이 오류가 난 2줄의 명령어를 실행해서 진행해 보았는데, 자동생성되야하는 패킷매니저.cs파일도 자동생성이 안되는 걸로 보아 cmd 창에서 실행하는 방법도 안되는 것 같습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
아이템 슬롯 선적용에 대한 질문입니다
강의의 코드에서는 Inventory에 아이템을 저장할 때 Dictionary의 key값으로 ItemDbId를 사용하고 있습니다.ItemDbId는 DB에 저장될 때 생성되므로 미리 그 값을 알 수 없어 선적용이 불가능한데, 만약 Dictionary의 key값으로 Slot Index를 사용한다면 굳이 별도의 구조체를 관리하지 않아도 해결되지 않을까 생각됩니다. (빈 슬롯에 ItemDbId가 없는 임시 아이템 정보를 우선 넣는 방식)기획에 따라 다르겠지만 통상적으로, 그리고 강의에서 구현하는 게임의 기획 의도상 Slot은 하나의 Item만 등록되는 것이 보장되는 Unique한 값이기 때문에 key값으로 충분히 사용할 수 있을거라고 생각됩니다.혹시 저렇게 했을 경우 발생할 수 있는 이슈가 있다거나 제가 생각하지 못한 어떠한 이유가 있는지 조언 부탁드립니다.
-
해결됨[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
(UI_SelectCharacterPopup) 히어로 선택창에서 클릭과 관련된 코드에서 질문이 하나 있습니다.
안녕하세요 루키스님^^ 요세 루키스님 강의 덕택에 매일매일이 너무 즐거운 하루를 보내고 있는 수강생입니다. 이번에도 강의를 복습하던 중 궁금한 점이 하나 생겨서 질문올리게 되었습니다. 히어로 목록창에서 하나를 클릭하게 되면 1. UI_CharacterSlotItem.cs에서 OnClickSelectHeroImage()가 실행 2. OnClickSelectHeroImage() 실행시 onHeroSelected에 등록된 UISelectCharacterPopup.cs의 OnHeroSelected()가 실행 3. OnHeroSelected()에서 UISelectCharacterPopup.cs의 RefreshUI()실행 4. RefreshUI()가 실행되면 각 slots를 순회하면서 UICharacterSlotItem.cs의 SetInfo()가 실행 5. SetInfo()에서 UICharacterSlotItem.cs의 RefreshUI()실행 6. OnClickSelectHeroImage()에서 다시 UICharacterSlotItem.cs의 RefreshUI()실행 이런 순서로 RefreshUI()가 2회 실행이 되는 것으로 이해했습니다. 위 코드에서 SetInfo() 내부에 RefreshUI()가 들어 있음에도, OnClickSelectHeroImage()에도 RefreshUI()가 들어있습니다. OnClickSelectHeroImage()에 RefreshUI()를 주석처리 해도 코드는 작동이 되는 것 같습니다. 혹시 OnClickSelectHeroImage()에 RefreshUI()를 넣어두신 다른 이유가 있으신가요?
-
미해결[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
(해결) 맥북 사용하시는 수강생 분이 계시다면 rider, protobuf 조언을 구합니다.
개발환경은 맥북, rider 사용중 입니다.rider 패키지 구성과 protobuf 구성에서 해결 방법을 찾고 있습니다.rider 패키지 구성 현황[구성완료]ServerGameServerServerCore[미구성]ToolsPacketGenerator : 솔루션은 만들었으나 bin 폴더 구성 못함CommonProtocol해결 방법을 알고계시다면, 레퍼런스 또는 조언 부탁드립니다.감사합니다.@추가 내용protobuf 설치는 homebrew 로 설치하였습니다.protoc --version : libprotoc 27.1protobuf 버전 변경 - 3.27.2
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
튜토리얼 시스템
안녕하세요.우선 좋은 강의 만들어 주셔서 감사드립니다.덕분에 원래 생각만 하고 있었던 인디게임개발을 시도해 볼수 있게 되었습니다.회사를 다니면서 튜토리얼 부분이 엄청 중요하구나 지표를 통해 확인하게 되는 계기가 항상 있어. 내가 인디게임을 만들면 튜토리얼을 신경써야 겠다 생각했습니다.허나 아트 출신이라 올라온 강의를 이해하기에도 급급한 실정이고프로그래머 분들에게 구현이 너무 단순한 부분 일수도 있어 글 올릴까 말까 고민을 좀 했지만저 같은 사람도(거의 없겠지만;;;) 있지 않을까 해서 메세지 올려봅니다.생각해 보면 답은 이미 올려주신 강의에 다 있는 것 같은데 가령 퀘스트, UI, 웹서버를 엮어구현하면 될것 같은데 전체적으로 시스템을 관통하고 있는 부분이 있어 가르쳐주신 깔끔한 프레임 워크를 거의 스파게티로 만들... 물론 이렇게 공부하는게 확실하게 이해가는 것이지만.. 뭔가 등대가 될만한 약간의 힌트를 추후에라도 검토해 주신다면 감사하겠습니다!
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
주차 소스코드를 다운받고 보면서 수강해야할까요?
안녕하세요 강의를 이제 보기시작했는데 코드를 보통 확인하면서 따라치는식으로 이때까지 강의를 시청해왔습니다.이번강의는 소스코드를 미리 다운받고 봐야하는걸까요 ?코드 확인도 못할정도로 빠르게 넘기셔서 문의드립니다!추가로 제가 평소에 사용하지 않는 기능들을 많이 사용하시는거 같은데 이런건 제가 기능들 찾아서 따로 공부해야할까요 아니면 추후에 설명이 따로 해주시는지 궁금합니다.강의 영상에서는 보충학습이 있다고 했는데 어디서 하는지도 궁금합니다!