저도 미래에 대한 막연한 고민은 의미가 없다는걸 알지만 게임 업계가 어떻게 돌아가는지를 모르고 각종 미디어에선 AI가 모든걸 대체 할것이라고 겁을 주니 지식을 쌓기보단 당장 기획을 시작하고 바이브 코딩으로 1인 개발을 시작해야하는거 아닐까 고민됩니다. Q1. 현재 게임 업계 채용 시장이 얼어붙은 이유가 AI 인력 대체 영향이 큰지? 업계 자체의 시장 침체가 영향인지? Q2. AI로 인해 기초 지식의 가치가 급격히 떨어질지 루키스님의 생각이 궁금합니다
이전에 강의에서 만든 Lock은 같은 쓰레드가 재귀적으로 Lock을 잡을 수 있다고 기억합니다. (아마 재귀 Lock의 상황을 제가 오해하고 있을 수도 있다고 생각합니다.) 오늘 만든 DeadLock Profiler대로면, 하나의 스레드가 A lock -> B lock -> A lock을 잡으려하면 DeadLock이 발생하는 것 같습니다. 제가 앞 강의의 RW SpinLock의 정책을 잘못 알고 있는걸까요? 항상 강의 잘보고 있습니다. 좋은 강의에 감사드려요!
안녕하세요 RefCounting강의 들으며 RefCountable의 생성자에 기본으로 1로 설정하고 main에서 사용할때 생성 후 ReleaseRef를 호출하는 코드를 봤습니다. RefCountable을 0으로 생성하면 호출하지않아도 될 것 같은데 어떤 문제가 발생하는지 AI의 도움을 받아도 이해하지 못해서 질문드립니다.
프로카데미 3코스를 마치고, 포토폴리오 구성 및 취업 준비에 들어가는 중입니다 프로카데미 덕분에 기본기 및 컴퓨팅적 사고력은 많이 향상된 상태이고, 완전한 형태이진 않지만 네트워크 라이브러리도 직접 만들수 있었습니다, 부족한 부분이 있으면 루키스 님의 강의를 보며 포토폴리오를 구성하려고 합니다 서버 개발자의 포토폴리오는 어떤 점을 중점적으로 구성해야 할까? 단순 어떤 기능 구현.... 어떤 라이브러리 사용 이런 부분은 의미 없는것 같고 뭔가 병목 구간을 잡아 트러블 슈팅하는 과정을 중점적으로 작성해야 할까요? 또한 포폴을 구성했을 떄 최소한의 들어가야 하는 컨텐츠가 궁금합니다. 요즘 신입 공고는 씨가 말라 3년차 공고에 지원을 넣어보려 하는데 변별럭을 가지고 어필을 하기위해선 어떤 점을 중심으로 포폴을 구성해야 하는지 조금이라도 조언 주시면 정말 감사할 것 같습니다 + 최근 게시글을 살펴보니 서버 올인이 상당히 위험하다. 라고 평가해 주셨는데 이유가 궁금합니다
현재 프로카데미 3코스를 수료하고, 포토폴리오 구성 및 취업 준비에 들어가는 중입니다 프로카데미 덕분에 기본기 및 컴퓨팅적 사고력은 많이 향상된 상태이고, 완전한 형태이진 않지만 네트워크 라이브러리도 직접 만들었고, 부족한 부분이 있으면 루키스 님의 강의를 보며 포토폴리오를 구성하려고 합니다 서버 개발자의 포토폴리오는 어떤 점을 중점적으로 구성해야 할까? 단순 어떤 기능 구현.... 어떤 라이브러리 사용 이런 부분은 의미 없는것 같고 뭔가 병목 구간을 잡아 트러블 슈팅하는 과정을 중점적으로 작성해야 할까요? 또한 포폴을 구성했을 떄 최소한의 들어가야 하는 컨텐츠가 궁금합니다. 요즘 신입 공고는 씨가 말라 3년차 공고에 지원을 넣어보려 하는데 변별럭을 가지고 어필을 하기위해선 어떤 점을 중심으로 포폴을 구성해야 하는지 조금이라도 조언 주시면 정말 감사할 것 같습니다
강의에서는 직접 만들어서 쓰기도 한다고 언급하셨는데, 그게 업계에서 대부분이 그렇게 쓰는건지, 아니면 특수한 경우에서만 그렇게 썼던 것인지 궁금합니다. 강의에서 나온 xnew 같은 것들을 만약 디버깅이나 개발의 편의성을 위해서 직접 쓴다면, 제가 개인 프로젝트를 할 때 강의에서 나온 주요 서버 엔진 코드(매크로 등)를 기본 베이스로 깔고 해도 되는건가요? 아니면 만들다가 필요한 부분이 있으면 그때 그때 엔진도 같이 발전시켜 나가는 형태로 개발이 되는건가요? 이 강의를 다 듣고 추후에 포트폴리오를 만들 때 강의에 나온 코드를 이용하여도 되는지 궁금합니다.
SList로 구현한 코드와 Lock을 걸며 큐에 pop push를 하는 코드의 실행시간을 스레드의 수와 일의 반복수(for문의 반복횟수)를 늘려서 시간을 측정해보았더니 Lock을 걸어 실행한 시간이 더 짧게 나오는데 둘다 어쨋든 CAS연산을 해주기 때문에 그런것일까요? 그렇다고 하면 굳이 LockFree로 구현하는 이유가 뭔지 궁금합니다 Lock을 쥔 스레드가 데드락이 되어 다른 스레드들도 통과를 못하는 경우가 있어서 그런건가요?
먼저 강의 재밌게 보고 있습니다. 감사합니다. 이 강의를 사면서 좋아하는 게임 개발을 위해 어떤 장르든 만들 수 있는 능력을 키우는게 목표였습니다. 강의를 공부하면서 진로를 생각해보니, Stateless로 취직을 하게 된다면 (예. C#을 사용하는 수집형 게임) 경력의 문제 때문에 Stateful로 갈 수 없다는 생각이 들게 되었습니다. 또한 요즘은 Stateless 공고도 많이 없어서 이쪽으로 갈 경우 나중에 경력이 망할 수도 있는게 아닌지 불안합니다. (실력이 아닌 기술 스택에 의한 경력을 안쳐준다든지...) 제가 만들고 싶은 게임이 아니라도 Stateful로 경력을 시작해서 원하는 곳으로 이직을 할 기반을 만드는 것이 맞는지, 그냥 Stateless여도 이직할 곳이 꽤 있으니 원하는 회사로 지원하는게 맞는지 너무 어렵습니다. 공부만 생각하고 싶은데, 집중이 안되서 질문 드립니다...
Sleep()은 현재의 타임 슬라이스를 모두 포기하고 인자로 들어온 값 만큼 스케쥴링을 포기하는 것은 맞지만 여전히 'Ready 상태'인 반면 WaitOnAddress()는 아예 'Blocked 상태'로 빠져 버려서, 스레드가 깨어나는 상황이라면 Dispatcher가 직접 Ready Queue로 스레드를 넣어줘서 Ready 상태가 됨에 따라 다시 스케쥴링이 되는 상황으로 이해했는데 올바른 방향으로 이해한 것일까요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
// 입장 사실을 신입 플레이어에게 알린다. { Protocol::S_ENTER_GAME enterGamePkt; enterGamePkt.set_success(success); Protocol::PlayerInfo* playerInfo = new Protocol::PlayerInfo(); playerInfo->CopyFrom(*(player->playerInfo)); enterGamePkt.set_allocated_player(playerInfo); //enterGamePkt.releasse_player(); SendBufferRef sendBuffer = ServerPacketHandler::MakeSendBuffer(enterGamePkt); if (auto session = player->session.lock()) session->Send(sendBuffer); } 이 부분에서 궁금한게 두가지 있습니다. 1. 이부분에서 두가지 방법이라는게 이렇게 두가지가 맞나요? 동적할당, 복사, set_allocated_player 이렇게 해서 sendbuffer하기 or 동적할당, copy없이 그냥 player->playerInfo를 set_alloc 한 다음 sendbuffer 마치고 enterGamdPkt.release_player() 호출하기. 아래 코드처럼 정적할당된 enterGamePkt에 기본으로 있는 playerInfo를 mutable get해서 copy 하면 안되나요? 이렇게 하면 메모리는 신경안써도 될거같아서요. enterGamePkt.mutable_player()->CopyFrom(*(player->playerInfo));
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
이미 잡큐로 넘긴 일감안에서 함수호출을 일감으로 넘기는 구조에 대해서 의문이 생겼습니다 ( Enter를 DoAsync로 호출했는데, 내부에서 다시 room함수를 DoAsync로 호출한 상황 ) 제가 먼저 고민해본 결과는 어차피 일감으로 넘겼으니 동기로 바로 호출해서 순서도 지키고 괜찮을 것 같다. -> 다만, 동기 호출이 내부에서 반복되어 오래 걸릴경우 스레드가 잡혀있을 수 있음 ( 실행시간을 정해줬다 하지만 동기호출이 반복될 경우 ) 내부 함수 호출도 잡큐단위로 넘기면 GlobalQueue로 스레드 일감 분배되고 좋을 거 같다. -> 다만, 바로바로 처리하지 않을 수 있기에 순서(?) 문제가 생길 것 같다. 엄청 무거운 뭐 길찾기라던지의 작업이 아닌이상 그냥 동기 호출하고, 무거운것만 다시 잡큐로 넘기는게 좋은 방법이라는 생각도 들기도 하고 그냥 에라 모르겠다 싹다 동기 or 잡큐로 넘기기 방식도 있을거 같은데 강사님의 의견이 궁금합니다.
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part5: UE5 & IOCP 서버 연동
안녕하세요 저는 C# C++ 등 서버 강의를 수강해왔고 꽤 오랜 시간이 지났지만 올해 집중적으로 준비를 했습니다. 결론부터 말씀을 드리자면 포트폴리오를 작성 중 향후 확장 설계에 관해 궁금한 점이 생겨서 질문 글을 남깁니다. 현재 제 PC 사양에서 로컬 테스트와 분산 환경 테스트정도 진행했습니다. 하지만 AWS나 Azure 같은 로드밸런서를 사용하지 않아서 제한된 환경이었구요 워커 분배 모델에서 Idle 상태의 시간에 따라 워커를 분배하는 방식이 다르다고 알고있습니다. 게임 로직을 처리하는 워커는 상대적으로 바쁘기 때문에 코어 수만큼, IO 를 처리하는 워커는 idle 타임이 대부분이기에 코어 x 2를 배치한다라고 알고있습니다. 현재 저는 IO , Logic , Send 총 3가지의 워커를 나눠서 사용하고있고 추후 DB 등록에 대한것도 추가될 수 있다고 생각하는데요. 수평 확장으로 수백개의 Room이 돌아가게되면 busy-wait (현재 Logic 워커) Loop를 돌고 있는데 이게 cpu를 놓아주지 않는 경우가 생길 수 있을까요? 이렇게 될경우 IO Stall 현상이 나타나면 Server에선 치명적으로 다가올 수 있다고 생각합니다. 그렇다면 Logic 워커에서 Sleep, 또는 OS로 CPU 제어를 명시적으로 반환을 하도록 설계를 해야할까요? 지금 하고있는 고민이 맞는지 의심스러워 질문을 남기게 됐습니다. 그리고 JobQueue (Update가 들어갈)에 IO Job이 쌓여있을경우 fixed tick 기반의 서버 프레임에 변동이 발생하는데 이걸 어떻게 해결할 수 있을까요? Timer를 통한 재귀적 등록이냐, Timer에 Push하는 전용 워커를 두고 fixed tick 마다 깨어나 전체 Room에 대한 Timer 등록이냐 너무 복잡해서 질문을 남기게 됐습니다. 그리고 신입으로 상채 지원해서 서류, 과제 통과 후 면접이 잡혔는데 공채와는 사뭇 다른 면접일 것 같은데 혹시 조언은 구할 수 있을까요? 여기는 플랫폼 서비스를 제공하는 C# 서버를 주로 다룬다고 해서 준비해야 할 개념적인 부분이 있을까요? 제가 준비하면서 고민했던 굉장히 추상적인 내용들이라 모호한 부분이 많습니다. 항상 좋은 강의를 남겨주셔서 감사합니다. 시간이 지나도 계속 찾아보게 만드는 강의여서 갑자기 찾아와 질문을 남기게 됐습니다.
0이 아닌 -countIncrease와 비교하는 이유가 다른 쓰레드들에 의해 internalCount가 이미 음수가 되어있는 경우 countIncrease의 증가로 인해 정확히 0이 되는 상황일때, 삭제 할 수 있도록 처리하기 위함이 맞나요? compare_exchange_strong에 의해서 oldHead가 최신 _head로 갱신되므로, 이미 pop된 객체에 대해 다시 접근한다거나, 쓰레드가 함수의 무한 루프에 빠지는 경우가 배제되는 것으로 이해했는데 맞을까요?