묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
저가 정리한게 맞는지가 궁금합니다
요약한게 맞는지 확인해주실 수 있나요? 1. Pop은 현재 head를 따로 oldHead로 저장하고, 이것이 nullptr이 아니란 소리는 head가 존재한다는 뜻, 즉 1개 이상 스택에 값이 존재한다는 뜻임 2. 스택에 값이 1개 이상이면 oldHead는 nullptr이 아닐 것이고 pop을 한번 했을 때 oldHead에 head가 제대로 값이 들어갔다면 while문을 통과하면서 _head=oldHead->next;가 원자적으로 실행되고, 아래쪽을 쭉 실행하다가 TryDelete 함수가 호출될 것임 2-1. 이때 만약 다른 Pop 쓰레드들이 있다고 하면, 요놈들은 첫 Pop에서 _head가 oldHead->next로 바뀐것으로 인해 while문을 통과하지 못하므로 oldHead=_head가 실행되어 다시 while문이 불려져서 다음 원소를 상대로 pop을 진행함 -------------------- 이후는 TryDelete입니다 3. popCount가 1인 경우 : TryDelete가 실행되는 순간에도 popCount가 1이라면 아직은 Pop이 다른 쓰레드로 호출되지 않은 상태임. 3-1-1. pendingList를 읽어 삭제하려고 하는데, 이걸 읽었는데도 popCount가 아직 1이라면 Pop이 pendingList를 읽는 사이에 한번도 호출되지 않은 것이므로, 읽은 pendingList와 연결된 모든 노드를 이참에 삭제함 3-1-2. pendingList를 읽어 삭제하려고 하는데, 이걸 읽은 사이에 popCount가 증가하여 Pop이 다른 쓰레드에서 호출됐다는 걸 알았으니 읽어들인 pendingList를 다시 돌려놓는다. 3-2. pendingList도 다 삭제햇으니(돌려놨으니) 현재 노드를 삭제해주면 된다. 4. popCount가 1 초과인 경우 : TryDelete가 실행되는 순간에 popCount가 1을 넘어버렷다면, Pop이 다른 쓰레드에서 호출된 상태이므로 지금 당장 삭제하지 말고 삭제 예약만 해놓도록 한다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RegisterSend를 하나의 스레드만 수행하는 이유가 궁금합니다.
큐에서 데이터를 꺼내는 작업 자체가 여러 스레드가 동시에 들어가도 의미가 없거나 wsasend가 스레드 안전하지 않아서 그런건가요? recv도 그렇고 send도 그렇도 하나의 세션에 대한 본질적인 작업은 사실상 하나의 스레드만 수행할 수 있다고 이해하면 되는걸까요?(사실상 여러 스레드가 접근해도 실질적인 세션의 공유자원(버퍼 등등)에 대해 순차적으로 접근할 수 있으므로 )
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
-1리턴이 대부분입니다
최종적에서 Recv가 정상적으로 처리되는것보다 -1로 리턴되는경우가 대부분입니다. 코드를 다운받아서 해봐도 어떨때는 정상적으로 되다가 다시작동하면 -1이 리턴되길 반복합니다. 무엇이 문제일까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷 리시브버퍼 관련 질문이 있습니다.
패킷 리시브 할 때 WSARecv의 작동에 의문이 생겨 질문을 남겨봅니다. [Size][ID][Hello World] 라는 패킷을 수신하다고 가정해봤을 때 Session::ProcessRecv 가 호출된 시점에서 [Size][ID][Hello] 까지의 데이터를 받았다고 가정하면 PacketSession::OnRecv에서 dataSize가 header.size보다 작기 때문에 0바이트를 Return 해 버리고 끝납니다. 이러면 RecvBuffer의 _writePos, _readPos에는 아무 변화 없이 다시 RegisterRecv를 걸어버리는데요 다음 RegisterRecv (WSARecv) 를 걸 때 , 읽다만 데이터의 시작 지점 부터 다시 읽어버리는게 아닌가 싶어서 여쭤봅니다 첫 번째 ProcessRecv를 받았을 때 RecvBuffer이 다음과 같다면 두 번째 ProcessRecv에서는 남은 "World" 데이터가 RecvBuffer 뒤쪽에 쌓이게 되는지, 아니면 변하지 않은 _writepos 위치 때문에 앞에서 부터 다시 작성되게 되는지 의문이 생겨 여쭤봅니다. 제 생각 중 만약 전체 바이트가 아닌 일부 바이트만 수신되는 위와 같은 과정에서 WSARecv는 2번 따로 따로 호출된다고 이해한게 맞으며, RecvBuffer에 문제없이 데이터가 이어서 들어가게 되나요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CRASH에서 cause는 로그를 출력하기 위한 목적인가요?
강의에서는 cause가 실제로 쓰이는 부분이 없는데 용도가 무엇인지 궁금합니다. 그리고 ASSERT_CRASH에서 __analysis_assume을 쓰는 이유는 무엇인가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 커리큘럼 관련되서 질문 드립니다.(커리큘럼 관련되서 질문할 곳을 찾지 못해서 ㅠㅠ 여기다 올린점 양해 부탁드려요 ㅠ)
안녕하세요. 커리큘럼 관련되서 질문드리고자 이렇게 글 올립니다. 저는 일단 C++을 사용하는데 있어 큰 무리없이 사용하는 편입니다. (modern c++포함) 반면 C#은 거의 모르는 상태인데요, 강사님 커리큘럼중에 C#을 이용해서 MMORPG를 만드는 커리큘럼도 있던데 아래처럼 병행해서 커리큘럼을 짜도 될지 궁금해서 문의 드립니다. [C#과 유니티로 만드는 MMORPG게임 개발시리즈] Part1, Part3, Part7, Part9 만 듣고, [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4 이렇게 들어서 일단 Unreal 로 연동하는 강의가 나올때까지, 유니티 2D게임을 C++게임서버에 연동해보고 싶은데요, 굳이 C# 게임서버 제작 강의를 들어야할 필요가 있을까요?? C#으로 게임서버를 만들어야겠다는 생각이 들면 듣겠지만, 지금은 우선 게임 클라이언트 자체를 서버에 연동시키는것(구체적으로 맵을 어떻게 서버에서 처리하고, 스킬이나 hit 판정을 어떤식으로 하는지에 대한 것들)을 목표로 하고 있는데, C#게임서버 강의랑 C++ 게임서버 강의가 겹치는 부분이 많아서 C#게임서버 강의를 통해 들어야할지 고민이 됩니다. 결론으로 C# 강의 Part1, Part3, Part7, Part9 와 C++강의 Part4 이렇게 병행하는데, 무리 없이 커리큘럼을 수행할 수 있는지 궁금합니다. 긴글 읽어주셔서 감사드리며, 항상 좋은 강의 올려주셔서 감사합니다.!!!
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
wstring값에 대해서 질문있습니다.
이전 강의 실습까지는 모두 결과가 잘 나왔는데 이번 강의에서는 Read할때 값이 모두 0으로 바뀌어서 전달되었습니다... imbue를 사용하기 전, 후 모두 0이라 다른 문제 인 것 같은데 어느 부분이 문제인지 잘 모르겠습니다ㅜㅜ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
세션 = 유저, 서버
세션은 user 또는 연결되는 서버라 생각하면 될까요? 세션 하나당 user나 서버 연결 하나 라고 생각하면 될까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Completion Port모델 질문드립니다.
IOCP강의를 듣고 실습을 하는 중에 이상현상?이 생겨서 질문 드립니다. 정상적으로 실행되거나 밑에 현상이 생기거나 반복이 되고 있는데 뭐가 문제일까요... 코드는 올려주신것과 똑같습니다! 1) accept만 뜨고 client connected가 안뜨는 경우 (클라에서 송신은 계속 하고있다.) 2) server에서 break point를 잡고 실행하면 client connected도 잘뜨고 수신도 잘합니다. (처음 한두번은 800, 200 이렇게 한꺼번에 데이터를 수신합니다.) 3) 다시 break point를 해제하면 1번과 같은 상황이거나, 정상적으로 처음부터 100씩 수신받는 상황이 랜덤으로 발생
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
StompAllocator에서 Release 함수 구현시.. Offset을 다시 원래 위치로 복구 해줄 필요가 있나요??
StompAllocator에서, void StompAllocator::Dealloc(void* p) { // 이건 Offset을 처리해줄 필요없지만... 그래도 모르니... int64 addressNo = reinterpret_cast<int64>(p); addressNo &= 0xffffffffffff1000; ::VirtualFree((void*)addressNo, 0, MEM_RELEASE); } 이런식으로 페이지 끝단에 위치했던 p를 다시 페이지 시작 지점으로 offset을 지정 해줄 필요가 있나요?? VirtualFree 는 p가 존재하는 페이지 전부를 해지시켜주는데 해당 페이지 끝단에 있던, 시작주소에 있던.. 그 페이지가 날라가는건 똑같은걸로 아는데요 ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
coreMacro xalloc 관련 질문입니다.
제가 현재 비주얼스튜디오 2019를 사용하고 있습니다. macro에 xalloc이라고 작성하면 오류가 나서 Xalloc으로 이름을 변경하고 사용하니깐 빌드가 잘 되더라구요. 혹시 이름 변경하고 실습을 진행해도 될지 질문드립니다!
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Type변환이 가능 하다는 기준에 대해서 질문드립니다.
강의를 듣다가 확신이 없어서 질문드립니다. 타입변환을 할 때 가능한지를 판단하는 기준이 각각의 클래스 사이즈를 보고 판단하는 것이 맞나요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스레드에 대해서 여쭤보고 싶습니다.
스레드마다 개별적으로 코어를 할당받아 자신이 관리하는 영역을 실행하도록 하니 실제로는 하나의 프로그램이지만 실행흐름으로 본다면 다른 프로그램인 것같이 보는게 맞는걸까요 ?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LNK2019와 LNK2001 에러
LNK2001과 LNK2019가 대량 발생합니다. 프로토 버퍼 라이브러리 문제인가 싶어서 다른 강의에 있는 라이브러리를 옮겨 보고, 프로토 버퍼 솔루션열어서 라이브러리를 다시 빌드해서 교체도 해보았으나 마찬가지입니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
coreMacro.h 에 define xalloc을 할 경우
CoreMacro.h 에서 xalloc을 define해줄 때 std::ios_base에서 xalloc이라는 이름의 함수가 있어서 오류가 나는 것 같습니다. 올려주신 코드를 내려받아서 빌드해봐도 같은 오류가 생기던데 뭔가 다른 문제가 있어서 오류가 계속 생기는 것일까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
컨텍스트 스위칭에 관해서 질문이 있습니다.
하나의 프로그램은 기본적으로 하나의 스레드를 가지고 있지요. 해당 스레드가 실제로 코어를 할당받아 코드를 실행한다고 알고있습니다. 선점형 운영체제인 윈도우에서는 어쩔 수 없이 타임 슬라이스 만큼 스레드에 CPU 코어를 할당하고 회수해 간다는 것으로 알고있는데요. 그렇다면 스레드는 현재까지 실행한 코드 프로그램 카운터와 같은 다양한 레지스터 값을 저장하는 자료구조 정도로 이해하는 것이 옳은것인지요 ? 각 프로그램 마다 코드를 실행하는 스레드에서 각 코어를 할당받았을 때 실행해야 할 주소 번지를 저장하고 있어야 되니까 이렇게 추론을 해봤는데... 어떻게 접근하는게 옳은지 알고싶습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
빌드 에러
프로젝트 다운받아서 실행시키면 위와 같은 에러가 발생합니다. pre-build event 때문에 발생한 에러인가 싶어서 pre-build event를 없애면 아래와 같은 에러가 발생합니다. 서버 코어 라이브러리는 정상적으로 빌드 되는것을 확인했습니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
원자적 연산 질문
atomic연산에 한해, 모든 쓰레드가 동일 객체에 대해서 동일한 수정 순서를 관찰하는 말이.. 0,2,3,39,9,10,7 순서로 다중쓰레드를 이용해서 바뀔 A데이터가 있을때 마지막 A데이터를 이용했을때가 2인상황에서 몇프레임지난후 현재상황에서 A데이터를 변경해준 쓰레드들중 마지막에 9라는 값을 넣어줬주고 A데이터의 값을확인하면 무조건 9라는 값이 나오는것이 아닌 2이후 3,39,9중 하나가 나올수있다는 건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
mutex 라이브러리는 busy waiting이 기본인가요?
제목과 같습니다. mutex 라이브러리를 이용한 강의 내용의 mutex m은 기본적으로 busy waiting이라고 말할 수 있나요? 뒷 강의 내용에서 나오는 mutex 변수를 Spinlock 구조로 되어있다고 이해해도 문제가 없는걸까요? (강의내용 11분 50초경) 이번 강의에서 t1과 t2가 Push를 하게 될때, 만약 t1이 lock을 붙잡고 있으면, t2는 Context Switching 이라거나 Event 방식으로 기다리지 않고 Busy waiting 하는것인지 궁금해서 문의 남깁니다. 제가 구글링을 통해 찾아본 해외 자료 느낌에서는 윈도우 환경과 VS에서 코딩하는 경우 Busy waiting을 하지 않는것처럼 나오는데, 만약 그렇다면 이것이 뒷 강의에서 설명하는 Lock 구현 방식중 2번의 Context Switching인건지 3번의 Event 방식인지도 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
send 에 lock걸어 주는 것에 질문있습니다.
wsasend가 멀티쓰레드환경을 보장하지 않아 lock을 걸어준다고 하셨는데 어떤부분을 보장하지 않는 건가요? 버퍼문제라면 혹시 이번 수업의 코드는 임시로 event마다 독립적인 버퍼를 가지게 했으니 lock을 안걸어주어도 되나요? wsarecv 는 멀티쓰레드환경에서 문제가 발생하지 않나요?