월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
두가지 질문이 있습니다.
●제가 서버의 대한 이해도가 완벽하지 않아, 제 의견이 들어가는 부분엔 문장 앞에 '●' 넣도록하겠습니다. 틀리다면 지적 부탁드리겠습니다. 어제 GroundObject[]를 사용해서 맵충돌은 결국 이동동기화 강의의 맵타일추출을 인용하여 진행하였습니다.내가 가려고하는 방향의 앞타일을 가져와 갈수 있는곳인지 없는 곳인지를 판단하여 캐릭터를 이동하였습니다. 서버에서 체크하여 BroadCast하였습니다.그 결과물입니다. https://youtu.be/tjzA_VzAKb0 ※Map 수정 ※room.HandleMove 수정 해당방법은 괜찮은 방법인지 여부와 영상에 보시면 패킷전송량이 어마어마 합니다. 실제로 Client에서 패킷 전송량을 보자면 누르고 있을 때마다 패킷을 전송하게 되겠죠.(Dir의 _update 의해서 ) ●"현직에 있을때 Photon 서버로 게임을 만든적이 있는데 클라는 최소한의 패킷 전송으로 최대한 많은 결과물을 받아야 한다고 생각하고 있습니다." 고작 내 포지션에서 스피드만큼 거리를 가려고 엄청나게 많은 패킷을 보내고 있습니다. ●또한 이 많은 전송량을 처리하려고 TickRoom을 16ms (60fps)로 설정 하였으니 서버에 좀더 과부화가 오지 않을까 생각합니다. 저렇게 실시간으로 움직여야 하는 방식에서 더 좋은 방법이 있는지 알고싶습니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
횡스크롤 맵추출 질문입니다.
몇시간을 고민하다가.... 도저히 아이디어가 떠오르지않아 질문드립니다.횡스크롤 2D 포트폴리오 제작중입니다..강의 다르게 바람의 나라 형식의 이동이 아닌 메이플스토리와 같은 이동방식을 선택했습니다.맵은 타일맵으로 만들려고합니다. 여러가지 아이디어는 있는데 이게 긴가민가합니다. 생각해둔 아이디어는 타일맵의 오브젝트 좌표를 하나하나 따와서 Rect로 만들어 DirectX 방식으로 right.x, top.y ,left.x , buttony 좌표로 만들어 GroundObject[] 배열로 담아둡니다. ※ GroundObject1 의 좌표 (TileMap) 최초 캐릭터 생성시 Ground 라는 bool 값을 주어 이것을 True 생성하고 이동 패킷이 올때마다, GroundObject[] 모든 Object를 돌면서 하나라도 True되는곳이 있다면 Ground 의 bool 값은 편하지않고 서버에서 낙하처리를 하지 않는것입니다. 만약 모든 GroundObject[] 타일이 false 값이라면 캐릭터는 낙하하면서 GroundObject[]배열을 순차적으로 돌면서 True값이 있는지 찾는겁니다. 떨어지다가 GroundObject[]에 하나라도 다시 True 변환이 되는 되는 것이 있다면 Ground bool 값을 Ture 반환한후 캐릭터는 낙하를 멈추는 방식을 생각해 봤습니다. 하지만 Direct 나 API 같은경우야 ... Rect 충돌 함수가 있으니 편하다고 하지만은.... 이방법은 필요시 모든 GroundObject를 돌아야하는 시간복잡도 O(n) 최악이 나올수도 있다는 것입니다. ※확실하진 않지만 여러 사람이 동시에 진행했을때 서버 과부화가 걸리지 않을까 생각이 듭니다. 또 하나의 걱정은 저의 짧은 지식으로 저 타일맵 안에 있는 그라운드 오브젝트의 좌표를 유니티에서 추출할수 없다는것이죠. 서론이 길었는데 질문입니다. 가장 걱정인것은 해당방법을 채용 하더라도 서버에 과부화가 오지 않는가?2.정답이 아니더라도 다른 아이디어가 있는지? 입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
EventSystem 에러
안녕하세요 루카스님 강의를 듣고 있다가 위 사진과 같은 에러가 나옵니다. 커뮤니티 게시판에 저와 똑같은 에러를 가지는 분의 글을 보고말씀해주신 대로 해당 경로에 EventSystem이 있는지 확인해 보았는데 위 사진과 같이 있습니다. 아무리 해도 해결이 안되어 질문 남깁니다. 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
RegisterSend 의 NullReferenceException 오류
유니티에서 NetworkManager static Instance를 통해 Send를 하면 다음과 같은 오류가 발생합니다. 어떤 이유인지 알 수 있을까요? ㅠㅠServerSession에서 로그를 찍으면 문제가없습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
게임 장르에 따른 서버 선택 여쭤보고 싶은 게 있습니다.
안녕하세요.게임서버 웹서버 강의 두 개를 듣고 있는 수강생입니다.강의를 마치고 작은 방치형 게임을 하나 만들어 보고자 합니다. 게임 설계에 따라 전부 다르겠지만,보통 방치형 게임은 웹서버, 게임 서버 중에 어떤 서버방식으로 사용되는지 알 수 있을까요? 제가 만들 게임은 온라인 서버에서 싱글플레이어로 진행되는 게임이기에 실시간 연결서버가 필수는 아닐 것으로 보입니다. 다만, 미래지향적으로 컨텐츠에 따라 게임서버가 좋지 않을까 싶은데 보통 방치형 게임에서는 웹서버를 사용하는지, 게임서버를 사용하는지, 어떤 형태로 설계되는지 궁금합니다.실제 개발 환경 경험이 없다보니... 정보를 얻기 쉽지 않네요.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
.sln 서버 프로젝트 로드가 정상적으로 되지 않습니다.
안녕하세요?2강(환경 설정)의 서버쪽 .sln 파일을 visual studio(2019기준)으로 열 시 다음과 같은 오류가 발생하면서 프로젝트가 로드되지 않습니다.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\Server\Server.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\ServerCore\ServerCore.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\DummyClient\DummyClient.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요.C:\Users\MYCOM\Downloads\MMO_Game 시작\Server\PacketGenerator\PacketGenerator.csproj : error : 프로젝트 파일을 열 수 없습니다. .NET SDK를 찾을 수 없습니다. 이 SDK가 설치되어 있고 global.json에 지정된 버전(있는 경우)이 설치된 버전과 일치하는지 확인하세요. 일단 넘어가고 클라쪽은 잘 따라갔는데, 해당 강의(Protobuf 이식)의 강의자료 Server쪽 .sln파일을 열 때는 또 다른 오류가 추가로 발생합니다.'GenProto.bat'을(를) 여는 동안 '<MiscFiles>'에서 오류가 발생했습니다.'C:\Rookiss\MMO_Game\Common\protoc-3.12.3-win64\bin\GenProto.bat' 경로의 일부를 찾을 수 없습니다. 어떤 절대경로와 SDK 호환? 문제인건 알겠는데, 해결책을 모르겠어서 질문 올립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
비주얼스튜디오 에서도 툴 만들기가 지원될까요?
강사님 안녕하세요?이번 강의를 들으면서 유니티 내부에서 툴을 커스텀할 수 있는 방법 잘 배웠습니다. 비주얼스튜디오에도 해당 기능 이용하여 메뉴 등을 추가할 수 있을까요? 잠깐 구글링 해봤는데, 검색 키워드가 안맞아서 그런지 없는 것도 같습니다. Q. 비주얼스튜디오에서도 Tool 만들 수 있는 기능이 있는지? 있다면 구글링 검색 키워드는?궁금합니다. 미리 답변 감사합니다.수강자 드림.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
커맨드 패턴의 이해
커맨드 패턴을 정확히 이해하고 싶은 학생입니다. 강의를 정말 많이 돌려보고 구글링도 해본 결과 저는 다음과 같이 커맨드 패턴을 이해했고 적용해봤습니다.기존의 방식은 클라이언트에서 요청이 들어오면 서버의 쓰레드들이 일을 처리하기 위해 쓰레드들이 락에 의한 대기를 함으로써 대기 시간이 길어져 메모리 낭비가 됐지만커맨드 패턴을 활용하여 클라이언트의 요청을 캡슐화하여 서버에 전해줌으로써 기존에 락에 의해 대기만 하던 쓰레드들이 대기하는 시간이 줄어들게 됩니다.단점으로는 2가지가 있습니다.플레이어의 죽음과 종료가 거의 동시에 일어났다고 가정해보겠습니다. 종료가 됨으로써 플레이어의 room이 null로 밀렸는데 잡큐에서 실행된 죽음 함수에서 플레이어의 room에 관한 정보로 접근하려 하니 null 크래쉬가 나게됩니다. 따라서 null 체크를 꼼꼼히 해줘야 합니다.또 다른 문제는 로직 동작 순서의 불명확함입니다.. 코드의 순서가1번. 잡큐로 밀어넣은 함수 12번. 잡큐와 상관 없는 코드3번. 잡큐로 밀어넣은 함수 2이런 상태에서 로직이 존재한다고 가정할 때큐에 넣은 일이 바로 실행되는 것이 아니기 때문에 1번과 3번이 밀려 2번이 먼저 실행되는 일이 발생될 수도 있습니다. 따라서 이런 문제를 해결하기 위해선 잡큐에 넣는 커맨드 패턴 방식이 아닌 기존의 락으로 잡아가던 방식으로 함수를 사용하는 것이 좋습니다.이 정도로 정리해봤는데 혹시 다른 점 있을까요? 커맨드 패턴 부분의 이해가 정말 안됐어서 질문 드립니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
a* 비용계산
A*알고리즘이 G는 시작점에서 해당 좌표까지 이동하는데 드는 비용이고 H는 목적지로부터 얼마나 가까운지를 따지는 비용이라고 알고 있었는데맵매니저를 만들 때 G를 왜 0으로 두는지 잘 이해가 안되고 H는 원래 (목적지까지 남은 X 방향의 타일 + Y 방향의 타일)로 계산했었는데 (목적지까지 남은 X 방향의 타일^2 + Y 방향의 타일^2)으로 바뀐건지 잘 이해가 안됩니다ㅠㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
처음 등장했을때 죽지 않는 경우가 발생합니다.
https://blog.naver.com/we5046/223172915438강사님께서 진행하신대로이동할때 Map에게 모든 정보를 넘기므로 충돌을 관리하는데, EnterGame 부분에 Map.ApplyMove를 추가하여 플레이어가 아무 이동을 하지 않고 0,0 좌표에 있을때 화살 타격이 불가능하여 추가 할 경우 타격을 입게 될 것임이 분명한데 해당 영상을 보시면 Unity에서 실행 하는 Player는 타격을 입고, 그뒤 추가로 생성하는 Player또한 타격을 입는데, 맨 처음 같이 생성된 Player들중 한명을 움직이지 않고 냅두면 화살을 피하는 문제가 발생합니다.이러한 오류가 발생하는 이유가 무엇인지 궁금합니다. 해당 오류가 왜 발생하는지 생각해보니, 처음 실행된 Player1에게는 새로 등장한 Player2의 정보가 Player1의 맵으로 전달이 되지않은 것인가 라는 문제 점을 생각해보게 되었습니다.그래서 기존 EnterGame에서 해당 플레이어의 등장을 타인한테 정보전송하는 부분에 해당 플레이어의 위치를 Map에 전파하도록 작성하니 정상적으로 작동하게 되었습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Rename 바를 여시는 단축키가 뭔가요
14:21초 처럼 강사님처럼 원하는 함수가 사용된 경로를 찾고싶은데 해당 기능을 사용하고자 하면 어떤 단축키를 사용해야할까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
Broadcast() 함수는 Push()로 캡슐화하지 않는 이유가 궁금합니다
public Player FindPlayer()는 리턴값 Player가 당장 필요해서 호출하는 함수니까 Push()를 안 하는 건 이해했습니다.근데 public void Broadcast()도 FindPlayer()와 같은 케이스라고 하셨습니다. 이게 무슨 뜻인지 이해가 안 갑니다.리턴값이 있는 것도 아니고 그냥 room.Push(room.Broadcast, packet) 처럼 Push로 고쳐도 상관없을 것 같은데 아닌가요?혹시 Broadcast()는 엄청 많이 호출되는 특수한 함수니까 성능상 이유 때문에 Push()를 생략하고 호출한다거나 그런 건가요?왜 FindPlayer()와 Broadcast()가 같은 케이스인지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
넓은 범위 충돌관련 질문드립니다.
만약 넓은 범위의 광역 공격을 구현하고자 한다면 cell단위로 N x N의 범위를 탐색하는 것과 Physics2D의 BoxCast를 사용해 탐색하는 것 중 어느 것이 성능적인 측면에 더 유리한지 궁금합니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
GameObject에 작성한 PosInfo, Stat 프로퍼티에 궁금한 게 생겼습니다.
선생님께서 작성하신 GameObject.cs 코드에 이런 부분이 있었습니다. public ObjectInfo Info { get; set; } = new ObjectInfo(); public PositionInfo PosInfo { get; private set; } = new PositionInfo(); public StatInfo Stat { get; private set; } = new StatInfo(); public GameObject() { // 링크를 이어준다 Info.PosInfo = PosInfo; Info.StatInfo = Stat; } 근데 위 생성자에서 저 '링크'를 이어줬는데 그 후로Info.PosInfo = new PositionInfo();라는 코드를 부주의로 실행시킨다면 링크가 깨지지 않나요?그 후로는 PosInfo.PosX = 0;같은 걸 실행해도 PosInfo와 Info.PoInfo는 별개이니 게임오브젝트에 적용이 안 될 것 같은데이렇게 이해하고 있는데 이게 맞는지 궁금합니다.그리고 아래처럼 고친다면 이 링크 깨짐 문제가 해결되는지 궁금합니다. public ObjectInfo Info { get; set; } = new ObjectInfo() { // 이걸 안 하고 쓰면 크래시가 난다 PosInfo = new PositionInfo(), StatInfo = new StatInfo() }; public PositionInfo PosInfo { get { return Info.PosInfo; } set { Info.PosInfo = value; } } public StatInfo Stat { get { return Info.StatInfo; } set { Info.StatInfo = value; } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
JobQueue 질문이있습니다
main에서 TickRoom함수 내부에서 timer를 이용해서 room.Update를 해주고room.Update에서는 Flush를 해줍니다.근데 Flush를 보면 싱글쓰레드처럼 따로 lock을 걸지않고 실행되고 있습니다.만약에 timer.Interval에 설정한 시간이 지났는데 flush가 다 안끝나서 다른 쓰레드가 flush로 들어오면 멀티쓰레드 환경이 되서 오류가 발생할 수도 있을 것 같은데이 문제는 현재 코드에서 예외처리를 안해준거죠?https://stackoverflow.com/questions/37747650/do-timers-continue-if-function-didnt-finish선생님께 찾아보고 질문한다는 성의를 보이기 위해서.... ㅎ..ㅎ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
3d 이동 및 회전 구현하다가 질문이 생겼습니다(에러질문X)
(위에 사진은 3d 방향 및 이동 동기화를 성공해서, 뿌듯해서 같이 올려요 ㅎ..ㅎ) 멀티환경에서 3D이동 및 회전을 동기화를 구현할 때, 이전 위치와 현재 위치의 Vector3.magnitude의 차이가 0.1이 나면 이동패킷을 보내줄수있도록 설계를 해서 구현을 했습니다.혹시 0.1f 차이마다 패킷을 계속 보내는 것도 패킷을 너무 많이 보내는 편인가요? (유저 수는 10명정도가 같은 room에 있도록 만들예정입니다)항상 감사합니다! 강의를 들으면서 조금씩 바꿔보는데 정말 뿌듯하네요 하하하하하 강의가 너무 유익해요^^
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
강의 관련 질문!(화살 파트)
안녕하세요 루키스님.MMORPG 시리즈 Part7 화살 #1 ~ 화살 #2 를 수강하다가 궁금한 점이 있어서 질문을 올립니다.궁금한 부분은 화살을 생성하는 부분인데요. 제가 이해하기로는 화살 스킬을 사용하는 과정이 클라에서 스킬 사용 패킷을 보냄(C_Skill) -> 서버 C_SkillHandler를 거쳐 GameRoom.HandleSkill 에서 처리 -> 이 때 GameRoom.EnterGame(Arrow)로 화살 입장 -> 본인 클라이언트와 다른 플레이어의 클라이언트에 스폰패킷(S_Spawn)을 보냄 ->각 클라이언트에서 ObjectManager.Add로 화살을 스폰하는 것으로 이해했습니다.강의 코드에서, Gameroom에서 EnterGame(Arrow)를 실행하면 Arrow는 Projectile 타입이므로 if 문에 걸려 본인 클라에 Spawn패킷을 뿌리지 않고 다른 클라에만 뿌리는 것으로 작성이 된것 같은데... Player 타입이 GameRoom의 인자로 들어왔을 때만 본인 클라에 패킷을 전송하는 것 같거든요. 그런데 실행하면 화살이 잘 날아갑니다. 어느 단계에서 화살이 생성되는지 모르겠습니다. 어느 부분을 잘못 이해했을까요? 강의 코드 그대로 입니다.public void EnterGame(GameObject gameObject) { if (gameObject == null) return; GameObjectType type = ObjectManager.GetObjectTypeById(gameObject.Id); lock (_lock) { if (type == GameObjectType.Player) { Player player = gameObject as Player; _players.Add(gameObject.Id, player); player.Room = this; Map.ApplyMove(player, new Vector2Int(player.CellPos.x, player.CellPos.y)); // 본인한테 정보 전송 { S_EnterGame enterPacket = new S_EnterGame(); enterPacket.Player = player.Info; player.Session.Send(enterPacket); S_Spawn spawnPacket = new S_Spawn(); foreach (Player p in _players.Values) { if (player != p) spawnPacket.Objects.Add(p.Info); } foreach (Monster m in _monsters.Values) spawnPacket.Objects.Add(m.Info); foreach (Projectile p in _projectiles.Values) spawnPacket.Objects.Add(p.Info); player.Session.Send(spawnPacket); } } else if (type == GameObjectType.Monster) { Monster monster = gameObject as Monster; _monsters.Add(gameObject.Id, monster); monster.Room = this; Map.ApplyMove(monster, new Vector2Int(monster.CellPos.x, monster.CellPos.y)); } else if (type == GameObjectType.Projectile) { Projectile projectile = gameObject as Projectile; _projectiles.Add(gameObject.Id, projectile); projectile.Room = this; } // 타인한테 정보 전송 { S_Spawn spawnPacket = new S_Spawn(); spawnPacket.Objects.Add(gameObject.Info); foreach (Player p in _players.Values) { if (p.Id != gameObject.Id) p.Session.Send(spawnPacket); } } } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
쓰레드 생성 부분
저희 강의에서 멀티쓰레드를 사용하는 걸로 알고 있는데 쓰레드를 생성하는 부분이 정확히 어디 부분인가요..?해당 부분에서 Connect 될 때 필요하다면 count의 개수만큼 쓰레드를 생성하는 걸까요..?혹시 아니라면 어디 부분일까요... 도저히 못 찾겠어서 질문드립니다..!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
EC2 서버 패킷 이슈
안녕하세요 루키스님!저는 강의에서와 달리 움직임 방식을 int 단위가 아닌 float 단위로 움직일 때마다 C_Move 패킷을 보내게 설계했습니다(아마 이러면 패킷을 쏘는 양이 더 많을 것 같아요!)해당 로직을 로컬 서버에서 작동을 시키고 클라이언트를 저의 로컬 ip에 접속하게 하면 패킷이 밀림 없이 잘 동작하지만 ec2에 서버를 올리고 클라를 ec2 IP에 접속 시키고 동작시키면 패킷이 밀려서 그런진 몰라도 플레이어가 이동하다가 트레이서 현상이 발생합니다. 총알을 쏘면 트레이서를 하지는 않지만 버벅거리면서 나가구요.기본적으로 Move 로직이 강의와 마찬가지로 클라에서 움직이고 서버에 위치를 통보하는 방식입니다. 이 방식이 패킷이 밀림으로써 클라는 나가 있지만 서버에서의 반영으로 인해 위치가 다시 트레이서 되는 건가 보다 싶어서움직임 로직을 바꿨습니다. 클라에서 움직인다고 인풋을 주면 패킷을 서버로 보내고 서버에서 움직임을 바꾼 후에 클라에 반영이 되게 바꿔봤습니다! 하지만 이 방식도 로컬에선 잘 동작하지만 ec2 서버에서는 버벅거리더라구요...ec2 인스턴스의 유형을 높은 걸로 해도 똑같고 최적화를 많이 했다고 생각했는데도 계속 버벅거리네요... 혹시 방법이 있을까요... 차이는 로컬 서버냐 ec2 서버냐의 차이인거 같은데, 애초에 물리적인 거리가 있기 때문에 이런걸까요...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
센드 리시브 버퍼를 살리고 싶어서 몇가지 물어봅니다.
강사님 께서는:SendBufferHelper(버퍼)가 세션 외부에 있는 상황은 바람직 하지만플레이어 세션중(PacketSession)하나가 send() 처리를 못하고 이런 일회용 버퍼를 계속 물고 있을 수 있다.(ex 사용자가 엘리베이터를 타서 통신이 안되는 경우)그럼 참조정리를 못하니 GC가 수거를 안해간다. 이 버퍼 릭킹 문제를 처리하기 위해 레퍼런스 카운트를 적용할수도 있다 라고 말씀하셨는데. C#에서 이를 구현하는데 난관이 있어서요(그점도 이미 말씀하셨었죠), 아래와 같습니다. 레퍼런스 카운트 사용 방식 (예상)만약 100명의 사용자에게 브로드 캐스팅 할경우 이 버퍼에 대한 레퍼런스 카운트를 100으로 세팅한다.각 세션에서(100개) 각각 send에 성공해서 버퍼에 대한 참조가 끝날 때마다 1씩 감소시킨다.이 카운트 감소 처리를 할때 쓰레드 동기화에 신경써야 한다.문제 1 ) 이런 동기화 처리도 성능에 영향을 준다. 레퍼런스 카운트 처리 때문에 샌드함수는 결국 지연되는 것.문제 2) 매번 다 쓰인 버퍼의 레퍼런스 카운트가 0이 되었다 한들, 그것을 GC가 "항상" "확실히" 수거해가는지 테스트할 방법을 모른다.문제 3) 레퍼런스 카운트가 0이 안되고 1이 유지되어서 어딘가에서 send가 막혀있는걸 확인 했을때 그 세션을 Disconnect()한다고 해도 GC가 이 버퍼를 "항상", "확실히"수거해 갈지 알 수 없다 (테스트 방법의 부재) 그래서 아래와 같은 질문을 드립니다.!! 질문 0 !!) 강사님께서 메모리 릭에 대한 우려가 있다고 말씀하셨는데, 그게 순전히 우려인지, 혹시 테스트를 해보신건지 궁금합니다.다시 말해서 C#에서 샌드 리시브 버퍼를 그냥 쓰기로 강행하면 나중에 낭패 볼까요? 질문 1 ) 위의 2,3번 문제를 체크할 수 있는 방법이 있을까요? 질문 2 ) 요즘 C#서버가 많이 보입니다. 모두 이런 문제를 고려했을텐데요, 그냥 매 순간 지금처럼 조각조각 패킷을 만들어 보내는게 대세인가요? 아니면 다른 방법이 있나요? 질문 3) 위의 1번 문제의 성능 감소가 클까요? 질문 4) 혹시 버퍼 크기를 4096 * 100 이 아니라 250, 300 등 작게 잡으면 이문제를 무시해도 될까요? P.S 이 강의 시리즈가 매우 큰 도움이 되고 있습니다. 감사합니다.