안녕하세요~ 강의 잘 듣고 있습니다 ㅎㅎ db상에서 각 아이템별로 강화수치가 달라질때마다 인스턴스를 따로 두셨던데 만약에 장비 아이템이 많으면 천개까지 늘어날텐데 그때마다 +1, +2 .. +10 까지 관리하기에는 너무 많아서 이걸 만약에 인스턴스로 관리하지 않고 강화를 해서 능력치가 +될 경우 해당 장비에 +된 강화수치를 메모리상에 저장하는 식으로 바꾸면 어떤 문제가 생길지 궁금합니다 ㅎㅎ
제 ThreadManager.h 소스코드입니다. 이 부분과 Types.h 소스코드를 포함하여 다른 모든 코드가 강사님의 코드와 같습니다. 근데 저는 이상태로 빌드하면 이러한 컴파일오류들이 발생합니다. 해결방법을 찾다가 제 ThreadManager.h 소스코드부분을 std::function std::mutex std::vecotr<std::thread>로 바꾸면 해결이 되긴합니다. 하지만 강사님의 소스코드와 같이 std를 붙이지않았을때는 왜 제 코드에선 빌드오류가 나는지 원인을 모르겠습니다. types.h에 강사님이 작성하신 using을 이용한 코드들 똑같이 작성되어있고 CorePch.h에 using namespace std; 문장또한 존재하며 CorePch.h와 Pch.h include도 빼먹지 않았습니다.. 이유를 몰라 잠이안옵니다 ㅠㅠ..
[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
루키스님 안녕하세요? 이번에는 면접 질문 들고 왔습니다. 마침 여기서 P2P 얘기가 나와 여기에 질문 드립니다. 서버관련 질답 받는 중, P2P 통신은 어떻게 하겠냐고 질문 받은적이 있어 질문 드리게 되었습니다. (당시에는 대답 못했지만) 키워드를 '포트포워딩'과 '나트 트라버설' 위주로 조사좀 해보면 면접관이 원하는 대답일까요?
복사될때 RefCount가 1증가해서 넘어가기 때문에 사용중에는 삭제되지 않을것이라는 보장이 있다고 말씀해주셨는대 다른 쓰레드가 해당 메모리를 해제하면 삭제가 되는것 아닌가요?? 이부분이 잘이해가 안가서 질문드립니다. 다시 말씀드리자면 어떻게 상호배제가 구현되는지 잘 이해가 가지 않습니다.
안녕하세요. 세션관련해서 궁금한 점이 있습니다. ClientServiceRef service를 생성해서 connect를 하는데요, 이 service로 Start하는 과정이 궁금합니다. Start 함수 내부에서 sessionCount만큼 Connect를 하는데 클라이언트는 서버에 한 번만 Connect를 하면 될 텐데 maxSessionCount만큼 연결 시도하는 것은 무슨 이유인가요? 그리고 service를 생성한 후 Broadcast를 하는데 연결된 서버는 하나인데, 맥스 세션 수만큼 Broadcast를 하는 것도 이해가 안 가네요. 만약 Broadcast가 아니고 그냥 Send 함수를 구현한다면 맥스세션 수 내의 세션 중에서 어떤 세션에 Send를 호출해야 할까요? 답변 부탁드립니다.
한때 오랫동안 리니지를 즐겼던 유저로써 리니지1의 이동은 어떤식으로 구현되었을까요? 리니지에서 이동중에 서버렉이 걸리면 케릭터가 찍은 좌표로 클라의 케릭터는 계속 걸어갑니다. 렉이걸린시점부터의 클라시점 밖의 NPC나 몬스터는 표시가 안되고 렉이 풀리면 클라 포지션이 렉이 걸린 시점의 포지션으로 순간이동하는 렉이 있었는데요 통신이 안되도 케릭은 일정타이밍까지는 이동이 됩니다. 그러타면 서버에서는 도착좌표만 주고 클라에서 보간처리로 이동을 한다는 말이될것같은데 그렇게 따지면 클라의 보간처리로 이동한다면 다른 케릭에의해서 길이 막혔을 때 처리가 안될것 같습니다. 지금 프로젝트의 구현과 리니지1의 이동 동기화의 차이점도 궁금합니다.
session방식이 아닌 토큰방식을 쓰는데 유저 요청시 정보를 매번 DB에서 긁어와야 할까요? 아니면 Service마다 accountId를 키로해서 각 유저 정보를 저장해놓고 사용하는게 좋을까요? 메모리에 일부 정보를 저장해 두었다가 유저 요청시, DB에 접근하지 않고 검증할 수 있는 부분은 메모리 단에서 거르는 방식으로 DB접근 오버헤드를 줄이면 좋을거 같은데 유저 정보를 메모리에 들고있는다고 하면 Stateful방식을 쓰지 Stateless방식을 쓰는 이점이 있나 해서 질문드립니다
강의 잘 들었습니다 🙏 락을 구현할 때 ReadLock을 만들었는데 전체 강의 코드를 보면 ReadLock을 사용하는 데가 없더라고요(DB 쪽은 스킵했습니다). 우리 프로젝트에만 해당하는 특별한 경우인지 실무에서도 WriteLock 사용이 압도적으로 높은 것인지 궁금합니다. 락을 직접 구현한 이유 중 하나가 (동일 스레드 기준) 쓰기 락이 걸려있을 때 읽기를 허용하기 위한 것도 있었는데, 읽기 락을 만들어놓고 한 번도 사용하지 않았다는 사실이 약간 신기하게 느껴졌습니다. +) 답변하시기 전에 추가 질문 서두에 말씀하신, 직접 락을 구현하는 이유가, 기획 데이터는 대부분 읽기를 수행하는데(잘 안 바뀌는 데이터), 굳이 스레드 간에 상호배타적일 필요가 없기 때문에(표준을 이용한 방법이 있으나), 읽기에 대해선 모든 스레드가 접근할 수 있게 ReaderLock이 필요한 걸로 이해했습니다. 그렇다면 운영에서 기획 데이터에 아이템을 추가한 걸 화면에 보여줘야 할 때는, WRITE_LOCK이 사용되나요?..기획 데이터를 실시간으로 읽어오는 건지 업데이트를 하면 서버를 재시작하는 건지 궁금합니다. 실무 경험이 없다 보니까 기획 데이터로 예를 들어주실 때 상황이 명확하게 안 그려지네요. 서버를 재시작하는 거라면 이미 변경된 데이터를 서버 구동 때 읽어오는데 쓰기 락이 왜 필요한지 궁금합니다.
안녕하세요. 강의를 보다가 퀘스트 관련해서 몇가지 궁금한 점이 생겨 글을 남깁니다. QuestTask 정보를 string화 해서 DB에 저장하시던데, 저럴 경우 운영적인 측면에서는 이슈가 없을까요? (DB 마이그레이션이라던지) Dialogue의 진행은 클라이언트에서 진행되고 Dialogue가 완료되면 Interaction을 서버로 요청하던데, 이럴 경우 클라에서는 Dialogue가 진행됐지만 서버에서 실패할 수 있는 상황이 생길 것 같은데요. Dialogue 같은 건 원래 클라이언트가 주도적으로 진행을 하나요? 일반적인 MMO를 보면 Quest가 완료된 후에 Dialogue가 출력되거나 Npc가 특정 위치로 이동을 하거나 특정 지역으로 Pc가 Teleport를 하는 등 서버에서 동기화를 맞출필요가 있는 일들이 여럿 발생하던데.. 이런 처리는 일반적으로 어떻게 구현 할까요? 언제나 좋은 강의 감사드립니다~
안녕하세요. 이전 질문 중에 DoGlobalQueueWork 가 실행되면서 GlobalQueue 에서 일감을 꺼내 멀티스레드 환경에서 처리되는 도중에, 데이터가 겹쳐 레이스 컨디션이 발생할 수 있냐는 질문에 강사님께서 멀티스레드 이슈가 다시 생길 수도 있다 고 말씀하셨습니다. 관련해서 궁금한 점이 생겼습니다. 적어도 저희 강의에 적용된 코드에 국한해서, 데이터가 겹친다는 이유로 레이스 컨디션이 발생할 수 없지 않나요? GlobalQueue 로 데이터를 넣고 빼는 부분에 락을 거니까 해당 부분에서는 아주 잠깐의 락 대기 시간이 생길 수 있고, 일감을 일단 Pop한 이후에는 데이터가 겹치는 일이 생길 수 없는 것 같은데, 이전 답변을 보고는 생길 수 있는 가능성이 없지 않다는 느낌을 받아서 이 궁금증을 해소하고 싶습니다~ 이전 질문에서 답변해주신 것 중에 Zone 단위로 JobQueue를 배치하는 경우 데이터 공유가 거의 없고 Actor 단위일 경우엔는 필연적으로 순간에 Lock을 걸거나, 정밀 조정이 어려우니까 그냥 락 걸지 않고 데이터를 get할 수 있다는 내용은 이해했습니다!
섹션 4 Project M1 - 성장 컨텐츠 제작(재화, 성장, 아이템, 퀘스트, ...) 에속한 SaveData, HeroList, ItemData, ItemHolder 이쯤부터 전부 재생이 안됩니다. 꽤 종종 이런 재생 오류 문제가 발생합니다. 한주에만 이런문제를 겪은게 3회정도 된거같습니다. 다음날 재생하면 또 되는경우가 존재하고, 너무 불편합니다. 인프런 운영사분들 제발 쾌적한 재생환경을 부탁드려요 .. 강의듣는 와중에, 흐름이 끊길때마다 너무 불편합니다... 강의는 잘듣고 있습니다..
너무나 알찬 수업 잘 듣고있습니다. 수업들 듣던 중, 의문이 하나 생겨서 질문남깁니다. 네트워크 라이브러리중, boost::asio 를 이용해서 운영체제에 독립적인 환경을 구축할 수 있을거 같은데, 네트워크 부분은 윈도우 맞춤으로 수업하시는 이유가 궁금합니다. boost::asio 의 기능만으로는, 효율적인 게임서버를 구축하기 어려워서 인가요?
제가 강의를 놓친걸수도 있는데 질문드려서 죄송합니다. 스포닝풀을 스크립터블 오브젝트로 관리하는데 (M1 에서는 타일맵에 찍어서 관리 했었던걸로 기억합니다) 스크립터블 오브젝트로 Pivot PosX , Pivot PosY 를 어떻게 직관적으로 보고 작업 할수 있나요? 그냥 찍어서 좌표 확인하는건지 아니면 더 편한 방법이 있는건지 궁금해서 질문남겨요