묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
앞으로 진행 궁금합니다
안녕하세요 바닥부터 출시후 운영까지 배우는 강의라 구입했습니다이번주도 안나오면 앞으로 강의 6개 남았나요??아니면 어떻게 진행되나요 뭔가 진행 할수록 스킵되는 기분이라 과연 앞으로 6월까지 강의로 결제 시스템 와 운영까지 할 수 있게 끔 강의가마무리가 어떻게 될지 불안하고 궁금합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
vector 생성시 메모리 참조 오류가 납니다
stomp allocator를 적용한 vector를 생성시에 내부에서 아래와 같이 1바이트를 할당하는데 그이후에 쓰기 액세스 오류가 발생합니다.memory, allocator파일 그대로 받아서 넣어도 동일합니다 ㅠ
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
TileMap 파일명 오류 (section 3 - 신규 BaseMap)
안녕하세요, '9주차 소스코드 다운로드'에서 M1 코드 다운받아서 에셋 지우고 다시 올리는 과정을 따라하고 있는데, TileMap 파일들의 이름이 바뀌어 있고 제대로 작동을 안합니다. 어떻게 해야 하나요? (맥입니다)
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Lock-Free Stack #3 compare_exchange_strong 사용이유
void IncreaseHeadCount(CountedNodePtr& oldCounter) { while (true) { CountedNodePtr newCounter = oldCounter; ++newCounter.externalCount; // 카운터가 정상적으로 1 증가할때까지 실행 if (_head.compare_exchange_strong(oldCounter,newCounter)) { oldCounter.externalCount = newCounter.externalCount; break; } } } while의 조건문에는 언제나 compare_exchange_weak를 사용했는데while문 내부의 if에는 compare_exchange_strong을 사용한 이유가 궁금합니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
선생님께서 알려주신 코드
혼자서 안보고 작성할 정도 되야하나요제 뇌가 저사양이라 잘 안돌아가네요;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
3~4일 간격으로 CPU 99% 사용되는 문제
안녕하세요? 루키즈님 덕분에 서버에 대해 많은 것을 배우고 저만의 프로젝트도 개발하고 있는 개발자 입니다.(항상 감사하게 생각하고 있습니다.) 질문은3~4일 간격으로 CPU가 99% 사용되는 문제가 발생하여 원인 분석 차CPU가 99% 사용되는 현상이 발현된 시점에 visual studio 성능 프로파일러를 통한 결과를 얻었습니다.헌데 ServerCore.Listner.OnAcceptCompleted에서 많은 양의 CPU를 사용하고 있는 것으로 파악되는데실제로 Connect요청은 없었습니다.심지어 DummyClient를 이용해 1000명의 플레이어가 기본플레이 까지 했을때도 발생안하다가, 3~4일 후 아무도 접속안하고있는 시점에 발생합니다. 아래 RecvBuffer 코드와 diagsession 정보를 보시고 답변 부탁드립니다.혹여 정보가 부족하거나 추가로 확인 필요한 부분 말씀해주시면 다시 확인해서 질문드리겠습니다.감사합니다.diagsession 캡쳐화면RecvBuffer 코드buffer size : 65535public class RecvBuffer { ArraySegment<byte> _buffer; int _readPos; int _writePos; public RecvBuffer(int bufferSize) { _buffer = new ArraySegment<byte>(new byte[bufferSize], 0, bufferSize); } // [r] [] [] [w] [] [] [] [] [] [] [] 일때 // <Data>[r] [] []</Data> <Free>[w] [] [] [] [] [] [] []</Free> // read의 위치 public int DataOffset => _buffer.Offset + _readPos; // read ~ write까지의 사이즈 public int DataSize => _writePos - _readPos; // write의 위치 public int FreeOffset => _buffer.Offset + _writePos; // wirte ~ buffer의 마지막 public int FreeSize => _buffer.Count - _writePos; public ArraySegment<byte> ReadSegment => new ArraySegment<byte>(_buffer.Array, DataOffset, DataSize); public ArraySegment<byte> WriteSegment => new ArraySegment<byte>(_buffer.Array, FreeOffset, FreeSize); public void Clean() { int dataSize = DataSize; if (dataSize == 0) { // 남은 데이터가 없으면 커서 위치만 리셋 _readPos = _writePos = 0; return; } // 남은 데이터가 있으면 시작위치로 복사 Array.Copy(_buffer.Array, DataOffset, _buffer.Array, _buffer.Offset, dataSize); _readPos = 0; _writePos = dataSize; } public bool OnRead(int numOfBytes) { if (numOfBytes > DataSize) return false; _readPos += numOfBytes; return true; } public bool OnWrite(int numOfBytes) { if(numOfBytes > FreeSize) return false; _writePos += numOfBytes; return true; } }
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
5월 5일 수업은 진행이 안된건가요?
아직 업로드가 안되길래 여쭤봅니다
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
JobSerializer 관련
안녕하세요. 강의 다 듣고 포트폴리오 프로젝트를 만들면서 JobSerializer 관련해 궁금증이 생겨 질문 드립니다. 강의에서 채택한 방식은GameRoom 단위로 JobSerializer를 두는 방식으로 이해했습니다. 그렇다면 Zone은 비대해진 GameRoom의 커버영역을 논리적으로 잘게잘게 쪼개서 최적화 하는 것이라고 보면 될까요? (만약, 좁은 영역을 다루는 보스방 같은 곳은 BossRoom 같이 새로 만들어서 Zone 없이 구현하면 되는건가요?) GameRoom을 여러 개로 나누는 시점은 독립적인 공간 (이를테면 보스방, 건물내부 등)이 생길 때 인가요?강의에서는 GameLogicTask에서 모든 GameRoom에 대한 Flush를 하였는데, 메인월드(대륙)처럼 처리해야 하는 영역이 방대한 GameRoom에 대해서는 Thread 1개 전체를 할당해 주는 등 각 GameRoom의 무게(?) 에 따라서 Thread 1개당 몇개의 GameRoom을 Flush 할 것인지 정하면 되는 것인가요?만약, Object 단위로 JobSerializer를 둔다면 Thread 하나당 담당할 Object 개수를 정해서 하는 건가요? 여담으로 예전에 면접에서 동접자수에 관련된 질문을 받았는데.. CPU 성능에 따라 천차만별이라 크게 의미 있는 질문인가 싶지만 이런 지표를 뽑아내려면 정확히 어떤 기준으로 뽑아내는 건가요? (대충 눈으로 끊김 없는 한계 동접자 수, CPU 로드율 일정% 이상 등등..) 감사합니다!
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRecvPacket에 PacketSessionRef를 넘겨줄 때
안녕하세요OnRecvPacket 함수 내부에서 HandlePacket 함수의 파라미터로 PacketSessionRef 타입 파라미터를 넘겨줄 때 왜 PacketSessionRef의 생성자를 호출해서 추가로 만든 객체를 넘겨주는지 궁금합니다.이 부분이 혹시 shared_from_this를 활용해서 PacketSession으로 캐스팅해서 객체 본인을 넘겨줘야 하는게 아닌지 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티스레드 Job처리
제가 경험했던 환경에서는네트워크스레드(N) -> MessageQueue -> 메인스레드(1)사실상 메인로직이 싱글 스레드였습니다.그렇다 보니 Queue에 들어오는 순서대로 메인스레드에서 처리했고, 느릴수도 있었겠지만 순서는 확실하게 보장이 되었습니다 그런데 현재 구조상네트워크스레드(N) -> JobQ 메인로직(N)으로 진행되거나네트워크스레드(N, timeLimit제한) -> GlobalQ 메인로직 (N) 으로 진행되다보니 궁금한게 생겼는데요첫번째 궁금한점은패킷이 ABC 순서로 왔을때,AC는 JobQ1B는 JobQ2을 수행한다고 가정하고A, B, C를 각각 네트워크 스레드 1,2,3가 받았다면스레드1가 A(수행시간1초)를 처리하는스레드2는 B(수행시간3초)를 처리하고,스레드3은 C(수행시간1초)를 Push만 한다고 하였을때B가 먼저 들어왔지만처리시간이 늦어 C패킷보다 답장을 늦게 보내는 상황이 발생할것 같은데요,(시간이 1초 3초까진 아니겠지만 컴퓨터 입장에서는 충분히 코드의 짧은차이로도 발생 할 수 있는 경우라고 가정했을때)과정에서 B처리중 죽어있으면 클리어가 안된다거나 하는 조건이 있고, B가 먼저 수행 되었지만 C처리가 먼저 끝나버려서 B의 결과가 바뀌는 경우는 어떻게 처리를 하면 좋을지 궁금합니다.(꼭 이런 1개의 처리속도가 아니더라도, JobQ1의 작업 전부다 소모되는시간이 JobQ2의 작업 몇개를 수행하는것보다 빠르다면, 충분히 이런상황이 발생할 수 있다고 생각합니다)다른 예시로 JobQ1에는 어마어마한 양의 일감이 쌓여있는상태에서 A가추가가 되고,JobQ2에는 아무것도 없을때 B가 바로 실행이 될텐데, 이경우에도 A가 먼저 패킷이 도달했지만 B에 비해 아주 오랜 뒤에 처리가 될수 있을것 같다고 생각해서 이런경우 클라 입장에서는 분명 먼저 요청을 했는데 버그가 발생했다고 느낄수도 있다고 생각해서 질문드립니다. 두번째로 궁금한점은Part4 과정이 거의 끝나가고 있어서 질문드리는 것인데요,제가 메인스레드가 1개인것만 해봐서 멀티스레드를 어떻게 인게임컨텐츠에서 사용해야할지 감이 안잡혀서,멀티스레드로 인게임 컨텐츠 부분의 객체를 접근할때, 락을 사용하는 예제가 있는 강의가 있는지 궁금합니다.이과정이 끝나면 Part5를 바로 이어서 할예정입니다. 감사합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IocpEvent는 메모리 해제될 일이 없나요?
안녕하세요IocpObject가 지워지지 않게 Ref Count 처리해주는 부분을 보고, IocpEvent는 지워질 일이 없는지 궁금합니다. 어차피 Session의 멤버로 들고 있으니 Session이 지워지지 않는다면 IocpEvent는 절대 지워질 일이 없는걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
atomic 스마트포인터에 대해서궁금합니다.
밑에 질문들을 읽고 궁금한것이 있습니다.스마트포인터를 사용하면 refcount에 대해서는 스레드세이프가 이제 구조상 보장이 되지만 set부분이나 치환하는 부분에 대해서는 아직 완전 보장이 안되어 atomic 스마트포인터를 활용하거나 lock을 건다고 하셨는데 그렇게 되면 성능적인 부분에서 많이 걸리지 않나 궁금합니다. set이나 치환부분이 얼마 되지 않기 떄문에 신경쓸 필요가 없는걸까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 성능 테스트
안녕하세요 강사님강의 내용 기반으로 제작된 서버는 성능 테스트를 위해 어떤 툴이나 방법을 사용하는지 궁금합니다.구글링해서 JMeter, Gatling, Locust, nGrinder같은 툴로 성능 테스트를 하고 시각화까지 할 수 있다고 정보가 나오는데 HTTP 또는 HTTPS 프로토콜을 사용하는 환경에서 테스트 하는 것 같더라구요. 강의 내용과 같이 C++로 자체 제작한 서버에서는 어떤 툴이나 방법을 사용해서 성능 테스트를 할 수 있는지 궁금합니다. 강의 듣고 서버를 제작해서 연동까지 해서 이제 포트폴리오로 제출하기 위해 성능테스트 하고 수치화나 시각화된 자료를 첨부해보고싶은데 방법을 모르겠습니다. 전부 웹 성능테스트 얘기만 나와서..ㅠㅠ
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
하반기 온라인 게임 교육 질문
하반기 온라인 게임 교육은 언리얼만 하시나요?유니티도 따라 해 주시면 좋을 것 같습니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
사운드도 꼭 넣어 주세요.
안녕하세요. 사운드도 꼭 넣어주세요.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
커스텀타일 오류에 대한 질문입니다.
c s o를 통해 커스텀 타일을 만들면 script가 커스텀 타일이 아닌, 요모양이 됩니다. 강의 에셋에 있는거 그대로 가져오면,이런 식으로 아무것도 안나타나고요.현재 유니티 22.3.6 버전을 쓰고 있어서 그런가 했는데, 맞습니다. 22.3.15 버전을 쓰면 괜찮습니다. 어디선가 문제인가 싶어서 상당한 시간을 투자했지만, 3.6버전에서 문제를 해결할 방법을 찾지 못했습니다. 이럴 때에는 그냥 버전을 바꾸는 것이 최선의 해결책일까요?
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + T2)
13주차 Hero교체 영상 24:20부분에서 퀘스트 완료해도 영웅존재안함 발생에 대해
영상에서 처럼 퀘스트 구현 최종 테스트에서 퀘스트 NPC를 클릭후, 완료를 통해 새로운 영웅을 얻는 과정에서 HeroManager내의 PickHero 함수에서 "영웅존재안함" 로그를 뱉는데테스트 해보니 세이브파일이 존재할 땐, GameManager내의 LoadGame을 통해 HeroManager의 AllHeroInfos에 정보가 담겨 정상 작동하는데세이브파일이 존재 하지 않을 땐, GameManager내의 InitGame을 통해 게임이 시작되는데, 이때는 HeroManager내의 AllHeroInfos에 정보가 하나도 담기지 않습니다.결국 강의 영상과 같이 퀘스트를 완료해도 보상을 통한 영웅 추가가 이루어지지 않고 "영웅존재안함"이 재현됩니다.GameManager의 LoadGame함수처럼 InitGame 함수 마지막 부분에 Managers.HeroManager.AddUnknownHeroes(); 임시 방편으로 추가하여 처리하긴 했는데 올바른 방법인지 잘 모르겠습니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WSAEventSelectModel 질문 있습니다.
안녕하세요, Client Socket과 이벤트를 select 하실때 FD_READ | FD_WRITE | FD_CLOSE 3가지를 동시에 바인딩하시는 이유가 궁금합니다강의중 언급하신 'TCP 논 블로킹 소켓에서, 데이터를가 분할되서 송신될 수 있다. 하지만 웬만하면 일어나지 않는다.'의 상황에 대응하기 위하여 send 함수 호출 시 각 인자를 수정하셨는데, FD_WRITE는, 만약 위와 같은 상황이 발생했을때, 다음 프레임에서 이벤트를 감지하기 위함이신지, 만약, 위와 같은 데이터 분할 송신이 절대 일어나지 않는경우라고 가정하면 FD_READ | FD_CLOSE 2개의 플래그만으로도 목표하신 에코서버 구현이 가능할것인지이 궁금합니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
LNK2001 링크에러
릴리즈로 할 때만 이런 링크에러가 납니다.이런식으로 무시를 해봐도 안 되고런타임 라이브러리를 다중스레드(DLL/MD)로 변경도 해보았는데 해결이 안 되네요.. C++버전은 17로 했습니다.혹시 이에대한 해결방안이 있을까요? 구글링을 해봐도 해결방안이 나오지 않아서 질문을 드립니다..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IocpEvent에서 OVERLAPPED 상속받고 가상 함수를 선언했을 때
IocpEvent에서 OVERLAPPED 상속 받고 가상 함수를 선언했을 때 OVERLAPPED가 주소의 맨 처음으로 가고 그다음이 가상 함수 테이블이 오지 않나요?만약 OVERLAPPED를 상속받지 않고 최상단에 선언한 경우라면 가상 함수가 맨 처음 주소이지만, 상속받은 경우에는 제가 테스트해 본 바로는 OVERLAPPED가 맨 처음 주소로 오는 것 같아서 질문드립니다!만약 위처럼 OVERLAPPED를 상속받았을 때 맨 처음 주소에 오더라도 가상 함수 테이블 때문에 문제가 생길 수 있는 것일까요?