월 66,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
헤더파일에 관해 질문드립니다!!
LockQueue랑 LockStack 에서 자료구조 queue랑 stack 헤더파일을 따로 include 해주시지 않았는데도 어떻게 사용이 가능한지 궁금합니다.아마도 미리 컴파일된 헤더에서 가져온것이라 추측이 되는데, cpp 파일엔 #include "pch.h"가 들어가있어서 자료구조를 꺼내쓰는구나 하겠지만 헤더파일에선 어떻게 사용이 가능한걸까요...?구글에 검색해서 혼자 해결해보려다 못찾아서 여쭤봅니다.. ㅎㅎ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
락프리 스택 Push 코드 중에서
Node* node = new Node(value); "node 포인터는 스택에 존재해서 멀티스레드여도 문제가 없다" 고 하셨는데, node 포인터는 스택에 존재하지만, new Node 부분은 계속 힙에서 메모리 할당 받는 거 아닌가요? 그럼 다른 스레드가 접근할 때마다 메모리를 계속 할당 받을텐데, 해제를 안하면 나중엔 결국 문제가 되는 거 아닌지. 제가 배운 내용으론 이해가 잘 안돼서 질문 드립니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
환경설정 관련 질문 있습니다.
강의를 듣다가 똑같이 코드를 쳐도 빌드가 되지 않아서 코드를 수업자료로 받아서도 해보고 환경설정 수업자료도 받아서 다시 타이핑토 해봤는데도 빌드가 되지 않습니다. Lock_Free 부분에서 다시 돌아왔는데요. 해당 강의에서 ConcurrentStack.h 파일에 구현을 모두 해주시고 계신데 위에서는 mutex만 include해주고 있음에도 불구하고 직접 정의한 int34나 atomic등이 아무 문제 없이 사용하시고 또 빌드도 되던데 어떤부분의 설정이 미스가 생긴지 도저히 못찾고 있습니다. 이전에 비쥬얼스튜디오 2017을 사용하다가 이후에 2019를 설치한 상황인데 완전히 싹 지우고 2019를 설치를 해야하는건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
락프리스택은 락이 없다기보단..
락 객체같은걸 안써서 락만 안걸었다지 사실상 스핀락 스택인것으로 이해되는데 얘도 std::move처럼 이름을 헤깔리게 지은녀석이라 생각해도 무방할까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
저는 해당 코드가 멈추지않아서 다음 강의까지 보고왔는데요
코드 자체는 강사님이 작성해주신것과 같고 해당코드에서 둘다 0이되는경우는 cpu나 컴파일러에의해 코드의 실행 순서가 바뀌거나 cpu가 램에 기록에 안하고 캐시에만 기록을 했다거나 램에서 안긁어오고 이전에 램에서 긁어온 캐시에서 가져오는등 이런일이 한번에? 일어나서 두 r1, r2값이 0이 되어야만 나오는것같은데 어셈코드는 제가 볼수 있으니 확인해봤으니 얘는 순서가 바뀌지 않았네요. 밖으로 빠져나오지 못하는이유는 그냥 제 컴퓨터 시스템이 순차적으로 실행을 잘 해주고 있어서라 판단하면 되는건가요? 어후 .. 이렇다면 내 컴퓨터에는 문제없이 돌아갔는데 어떤 시스템에서는 안돌아가고 하는 문제가 발생하면 잡기가 더더욱 어렵겠네요..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
원자성자체는 이해한것 같습니다만 가시성이 어떤건지 이해가 잘 안갑니다.
가운데 책뭉치(동일 객체)가 있고 그 책을 들었다가 다시 놓는 작업을 한다 했을때 이 책을 들었다가 놓는 작업이 원자적이라면 들었다가 놓는동안 다른 작업이 끼어들 수 없기때문에 당연히 맨 위에 있던 책이 바뀌지 않을겁니다. 만약 원자적이 아니라면 내가 책을 들고있고 놓고있지 않는 동안 다른 쓰레드에서 책을 가져가고 내가 놓은 뒤에 그 쓰레드가 놓게 된다면 책뭉치의 맨 윗책이 바뀔 수 있겠죠. 다른분이 질문에 주신건데. 하나의 메모리값을 여러 쓰레드에서 2 4 6 8 순서로 수정을 한다고 했을때 이 각각의 작업이 원자적이라면 관찰자 입장에서 4를 관측했으면 그 이후로는 2가 관측안되는게 작업 순서를 보장한다 라는건 이해를 한것 같습니다. 다만 가시성 문제를 해결 해준다라는거는 2 4 6 8 작업이 끝난 상태에서 관찰을 했을때 8로 관측이 되게 해준다는 말인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Bitflag 질문
안녕하세요 루키스님! bitflag에 대해 질문있어서요. LThreadId는 32비트 [][][][]이고 _lockFlag도 32비트[][][][] 인데, 그러면 _lockFlag가 64비트여야 되는거 아닌지요??? LThreadId가 [32][32][0][1]인 스레드가 Write중에 LThreadId가 [64][64][0][1]인 스레드가 WriteLock을 호출하면 뒤의 16비트를 깡그리 날리니깐 [0][1] == [0][1] ? 가 되는데 그럼 같은 스레드로 인식하여 Lock을 잡게되는 것 아닌지 궁금합니다. 아니면 제가 LThreadId에 대해 놓친게 있는지요 ㅠ 감사합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
세션에도 CreateIoCompletionPort를 해주는 이유가 뭔가요?
bool IocpCore::Register(IocpObjectRef iocpObject) { return ::CreateIoCompletionPort(iocpObject->GetHandle(), _iocpHandle, /*key*/0, 0); } Listener의 StartAccept 에서 이미 GetIocpCore()->Register를 통해 CP에 지정을 하는데 RegisterAccept()의 CreateSession()에서 iocpCore->Register(session)를 통해 또 한번 CP에 지정해주는 의미가 있나요?? 제가 봐온 다른 예제들에선 CreateIoCompletionPort는 전 프로그램 통틀어서 딱 2번(생성, 연결)만 있었거든요
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강사님 환경에 관해 궁금한게있어요
수업에 관한 질문은 아닌데, 강사님 코드를 보시면 main 같은 함수가 기울임꼴로 작성이 되는데 어떻게하면 강사님같이 바꿀수 있을까요? 글꼴 설정에 들어가봐도 기울이는 항목은 보이질 않네요... ㅎㅎ;
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 관련 서적 추천
강의 잘보고있습니다 선생님 서버공부가 특히 힘들다하여 책과 함께 공부하려고하는데 C++ 책과 같이 볼만한 서버 관련 서적 추천해주실 수 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
unlock 시점 질문이 있습니다.
Producer 함수에서는 중괄호 안에서 락을 잡고 push를 해줘서 중괄호를 나가면 unlock이 될 것 같은데 Consumer 함수에서는 그냥 while문안에 락을 잡는데, 어느시점에서 락이 풀리는건지 궁금합니다. 감사합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
sendEvent 객체 메모리 해제 문제 재질문입니다!
안녕하세요. sendEvent 객체 메모리 해제 관련해서 질문드렸었는데요. 강사님 코드에서도 똑같은 지점에서 오류가 나더라고요. 클라이언트에서 500ms 시간 단위로 보내면 오류가 더 빨리 생깁니당.. 강의가 계속 진행되면서 자연스럽게 잡힐 문제 같지만 알고 계셔야 알 거 같아서 공유드립니다. 감사합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GThreadManager 이전에 Accept하는건 무슨 의미가 있나요?
GameServer.cpp 메인에서 GThreadManager 부분을 주석처리 해보니 service->Start() 이 부분이 내부에서 100개 RegisterAccept만 호출하고 바로 종료해버리더라구여 정작 Accept 하고 서버 기능을 제공해주는 부분은 GThreadManager 인거같은데 그럼 위에 service->Start() 이부분의 역할은 무엇인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스토어프로시저 질문
스토어 프로시저 작성중 SELECT문만 썼을때에는 ouput값이 제대로 나오는데 if를 사용하여 update 또는 insert를 사용할경우 아웃풋값을 제대로 받아오지 못합니다. (코드에서 output ret의 벨류를 받아오지못합니다.) (SELECT만 사용할경우에는 잘받아옴.) 혹시 어떤 문제가있는지 알 수 있을까요? ALTER PROCEDURE [dbo].[spLogin] @accountid text, @password text, @ret int OUTPUT AS DECLARE @userIdCount int; SELECT @userIdCount = COUNT(*) FROM [dbo].[Accounts] WHERE account like @accountid; if (@userIdCount = 0) BEGIN SELECT @ret = 0; END else BEGIN DECLARE @LOGIN_OK int = 1; DECLARE @LOGIN_ID_FAILED int = 2; DECLARE @LOGIN_LOGGEDIN int = 3; DECLARE @checkCount int; DECLARE @loggedin tinyint; SELECT @checkCount = COUNT(*) FROM [dbo].[Accounts] WHERE account like @accountid AND password like @password; SELECT @loggedin = loggedin FROM [dbo].[Accounts] WHERE account like @accountid AND password like @password; if (@checkCount > 0) BEGIN if (@loggedin > 0) BEGIN SELECT @ret = @LOGIN_LOGGEDIN; END else BEGIN SELECT @ret = @LOGIN_OK; UPDATE [dbo].[Accounts] SET loggedin = 1 WHERE account like @accountid; --이곳이 실행되면 output값을 코드에서 받지못함. END END else BEGIN SELECT @ret = @LOGIN_ID_FAILED; END END RETURN @ret
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
sendEvent 객체가 해제되어 버립니다.
안녕하세요! 이런 종류의 질문은 답을 거의 못 들을 것을 알지만.. 그래도 질문드려봅니다. 디버그 모드에서 오랫동안 켜둔 적은 없어서 언제부터 생긴 오류인지는 정확히 모릅니다만. 클라이언트가 보낸 걸 받아서 OnRecv()에서 Send 함수를 호출하면 RegisterSend 함수를 호출하잖아요~? sendEvent 포인터가 날아가 버리기 때문에 WSASend 함수에서 죽어버립니다. 이 오류는 바로 일어날 때도 있고 1분 정도 지나서 일어날 때도 있습니다. 레퍼런스를 add해주고 release 해주는 곳의 실수는 없는 것 같은데....분명 어딘가에 문제가 있겠지요🥲 혹시 메모리 pool 관련한 오류일 수도 있을까요? xnew가 제대로 안 됐을 가능성도 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CRASH에서 cause는 로그를 출력하기 위한 목적인가요?
강의에서는 cause가 실제로 쓰이는 부분이 없는데 용도가 무엇인지 궁금합니다. 그리고 ASSERT_CRASH에서 __analysis_assume을 쓰는 이유는 무엇인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
수업자료로 시간 단축 해보는 중에 궁금한게 생겨 질문드립니다.
안녕하세요 수강생입니다. 연습문제 보던중 재미있는 생각이나서 테스트중이었는데요. 수업자료에서의 방법으로 작업하면 총 100의 일이 있을때 코어가 4개면 1~25/26~50/51~75/76~100 이렇게 나누어진다 생각하였고 상대적으로 1~25이 빨리끝나고 76~100이 늦게 끝나니 시간적으로 손해가 생긴다 생각하였습니다. 그리하여 저는 CountPrime 함수 부분을 수정하였는데 start=i ,end=Max_NUMBER로 받아오고 (i는 main함수부의 for(int i=0;i<coreCount;i++)의 i입니다.) 추가로 coreCount를 받아와서 for ( int number = start; number<end; number+=coreCount) 로 구현하였습니다. 이러면 제 생각으로는 100개의 일을 4개의 코어가 나누어 일한다고 치면 코어1 : 1 5 9 13 17~~ 코어2 : 2 6 10 14 18~~ 코어3 : 3 7 11 15 19~~ 코어4 : 4 8 12 16 20~~ 이런 방식으로 나누어서 작업하고, 상대적으로 오래걸리는 76~100번대 일을 코어들이 골고루 나눠받은만큼 소요시간 역시 적게 걸릴것이라 예상했습니다. 그러나 결과적으로 소요시간은 같게나왔으며 생각하지못한 CPU 이용률에서 차이가 났습니다. (기존방식 cpu 100% 수정시 cpu 60%) 참고로 Max값은 100,000,000으로 잡고 진행하였고 소요시간은 33초 ~ 34초 근처로 나왔습니다. 질문드리고 싶은것은 위 상황에서 소요시간 차이가 거의 나지않는 이유와 CPU 사용량에 차이가 나게되는 이유를 알고싶습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문드립니다
컨텍스트 스위칭에서 질문드립니다. 1. 컨텍스트 스위칭은 쓰레드간에 일어나는것이고 컨텍스트 스위칭이 일어나기전 진행하던 모든작업들이 프로세스 제어블록에 저장되어 다음것을 실행시키는것으로 아는데 다른책을 통해 공부할땐 프로세스간의 컨텍스트 스위치은 무겁고 쓰레드간의 컨텍스트 스위칭은 스택만을 별도로 메모리를 가지기에 가볍다. 라고 공부를 했는데 이 이야기는 한 프로세스내의 한쓰레드에서 다른 쓰레드의 컨텍스트 스위칭 비용은 가볍고, 다른 프로세스의 쓰레드로 컨텍스트 스위칭은 무겁다고 보면 될까요? 2. 커널모드 동기화기법인 강의에서나온 랜덤메타,갑질메타를 사용하게되면 결국 한번은 커널모드로 들어가야하기에 기존에 실행중이던 유저모드의 프로세스의 쓰레드는 대기상태로 돌아가 스케쥴러에 의해 다시 선택받길 기다리는 상태이기에 느리다.가 맞는걸까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
MemberJob에 대한 인수목록을 찾지 못하고있습니다.
Job.h에 있는 코드를 그대로 복붙을 하였는데도 위와 같은 에러가 계속 발생하고있습니다.. 올려주신 파일도 MemberJob부분에서만 계속 에러가 발생하고 있더라구요,,,뭐가 문제인지 잘 모르겠습니다..ㅠㅠ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 포폴 관련해서 질문이 있습니다
채팅 + 순차접속서버 포트폴리오를 준비 중입니다 다른게 아니라 포트폴리오를 어떤 방식으로 제출해야하는지 모르겠어서 질문 드립니다.. 프로젝트를 직접 제출해야하는건지 코드를 캡쳐하여 ppt파일을 만들어야 하는지 실행 화면을 제출해야 하는지 모르겠습니다 클라이언트는 실행 화면을 녹화하여 유튜브에 올리라고 하셨는데 한 컴퓨터에서 클라 여러개+서버가 동시에 돌아가다 보니 실행 화면을 제출하기엔 너무 지저분해보이고 이해도 잘 되지 않을것 같아서요 그리고 제가 이해하려고 코드에 주석을 주렁주렁 달아놨는데요 그대로 제출해도 되는지 궁금합니다 (코드를 제출해야 한다면) 이런 질문이 이 강의에 맞을지 모르겠으나.. 죄송한 마음을 무릅쓰고 질문 남겨봅니다