게시글
질문&답변
2024.06.01
게임학원에 대해 질문드리고 싶습니다.
S도 급이 있는데 특별히 문제가 되는 학원은 방송국입니다. 왜냐하면 애당초 정규 커리큘럼이 없고 강사가 멋대로 가르치는 것인데 그 강사를 뽑는 기준 또한 높지 않아 문제입니다. SGA는 평가가 그 정도로 나쁘진 않습니다. 전역까지 1년 남았다면, 어차피 실습은 하기 힘들 수 있으므로 저라면 1년 내내 알고리즘 문제 책만 보면서 의사 코드를 작성할 것 같네요. (종만북은 늘 사랑입니다)
- 0
- 1
- 35
질문&답변
2024.05.31
RWlock
추세라는 것은 딱히 없고, 프로그래머 리드가 골라서 사용하는걸 그냥 사용합니다.
- 0
- 1
- 53
질문&답변
2024.05.29
M1 최종코드 질문드립니다
현재 팀 자체에서 6월까지 M1을 최대한 완성하고 싶어해서, 작업은 계속 진행하고 있습니다. 아마 6월 정도에 마지막 버전을 올릴 것 같은데 이런 저런 폴리싱이 들어가 있습니다
- 0
- 1
- 148
질문&답변
2024.05.28
하반기 일정에 대해 궁금합니다
안녕하세요, M2과 D1 프로젝트는 몇 달째 이미 준비를 진행해서 7월에 정상적으로 시작/병행할 예정입니다. M2에서 모든 컨텐츠는 자체 제작으로 갑니다 (뒤끝 X) 다만 T2은 조금 더 난이도가 낮게 가는 것도 방안이라, 내부적으로 의논을 해보고 있습니다. 기술만 보면 M2에서 만든 게임서버로 채팅을, 웹서버로 나머지를 구현하면 그만이지만 서버 운영은 초보한테는 어려운 것은 분명하므로 뒤끝 등을 사용할 여지도 있습니다.
- 0
- 1
- 118
질문&답변
2024.05.28
변경된 프로젝트에서 한번쯤 다뤄주셨으면 좋겠을법한 내용
1) 방치형 혹은 디펜스 게임에서 유독히 Int32 범위를 넘어서는 큰 수들을 자주 볼수있는데 이 큰 수를 어떤 방식으로 처리하시는지 Rookiss 님의 노하우가 있으신지 궁금합니다. 그냥 int64(long)로 처리하면 정말 큰 숫자 표현이 가능하니 그 정도로 충분하면 그렇게 하셔도 되고, 그마저도 부족하면 그냥 BigNumber 클래스를 만들어서 관리하면 됩니다. 관리하실 때 string이나 int 배열을 만들어서 직접 숫자를 만들어서 연산을 하면 되는데 사실 이건 노하우라기보단, 프로그래밍 연습 문제에 자주 나오는 연습 패턴 중 하나입니다. 2) 소규모 개발사들이 서버를 쓴다고 하면 뒤끝을 많이 이용하는 것같습니다. 서버 강좌도 좋지만 개인적으로는 뒤끝을 이용한 서버 운영 노하우(?) 를 배우는것도 실제 프로젝트에 바로 접목 해볼수 있을것 같아 뒤끝 연동으로 진행해주셨으면 하는 바람입니다. 이 부분은 고민을 해보겠습니다. 조금만 기능이 추가 되어도, 직접 구현하는게 훨씬 쉬울 확률이 높습니다.
- 0
- 1
- 104
질문&답변
2024.05.28
이벤트 vs 함수 차이
이벤트 경우에 시작되는 지점은 알 수 있지만 끝나는 시기를 모른다는 의미를 잘 모르겠습니다. 일단 실행되면 끝날 때까지 이벤트 함수에 머무는 것이 아니라 비동기적으로 처리하는 건가요? 이벤트는 프로그래밍에 공식적으로 있는 기능은 아니고, 일종의 코루틴과 유사합니다. 함수는 무조건 실행을 한 방에 다하고 종료되지만, 이벤트는 하다 말고 쉬다가 다음 프레임에 이어서 실행할 수 있습니다. 딜레이를 이벤트에서는 사용가능하지만 함수에서는 사용하지 못 하는 게 함수는 점유율을 100% 다 가져가서 다른 코드가 실행될 여지를 빼았기 때문인가요? 반대로 이벤트는 점유율이 왔다갔다 왕복하면서 실행이 되는 건가요? 이벤트는 코루틴처럼 실행을 한 번에 다 할 필요가 없기 때문에 가능합니다.
- 0
- 2
- 59
질문&답변
2024.05.28
M1에서 못한 강의 내용이 T2에 반영이 되나요?
M1의 경우 전투는 마무리 지었으나 못한 부분이 컨텐츠 마무리 부분인데요. 각종 컨텐츠 UI 제작 및 BM은 결과적으로 UI가 빨리 만들어져야 하는데, 이번 프로젝트는 UI 시트가 이미 50개가 나온 상태에서 들어갑니다. 현재 준비된 UI 중 BM (각종 퀘스트, 업적, 뽑기 등) 관련된 UI가 충분합니다. 또한 범위를 협의중에 있으나 원작자 분께서 채팅/우편/쿠폰 등의 기능을 넣었으면 하셔서 웹서버를 통한 or 뒷끝 등 써드파티를 이용한 구현이 들어갈 확률이 높고 마지막으로 이미 타워히어로1의 후속작이라, 출시/운영 관련 부분도 훨씬 수월하게 들어갈 수 있을 것으로 보입니다.
- 0
- 1
- 95
질문&답변
2024.05.28
다음 강의는 언제 올라오나요..??
안 그래도 좀 방대한 것을 기획하고 있었습니다. 공지 참고 바랍니다! 조만간 관련 일정 영상도 만들어서 올릴 예정이에요
- 0
- 1
- 91
질문&답변
2024.05.26
OnRecvCompleted 내 RegisterRecv를 다시하는 이유가 먼가요?
(1) OnAcceptHandler의 전체 코드를 살펴보면 클라이언트와 접속이 된 이후 수신 / 송신 이후 클라와의 연결을 끊어버리는데 (session.Disconnect() -> Shutdown, Close), OnRecvCompleted 내 RegisterRecv를 다시하더라도 클라쪽에서 보내는 데이터를 미처 다 수신받기 전에 끊겨질수 있지 않나요? 서버가 클라와의 연결을 끊을려고 할때 (Shutdown, Close) 클라쪽에서 보낸 데이터가 남아 있을 경우 바로 끊지 않고 비동기 수신 함수로 등록된 결과를 모두 처리하고 끊는걸로 이해하면 될까요? -> 클라가 끊는건 특이한 경우이고 지금은 예시를 위해 그렇지만 나중에는 쭉 연결을 유지하게 됩니다. (2) 다시 낚시대를 던지는 행위 ? 가 결국은 클라와 연결이 된 이후 클라쪽에서 한번에 여러개의 패킷을 send를 하기 때문으로 이해가 되는데, 만약 클라가 연결이 된 이후 한 개의 패킷만 전달한다는 정책이라면 따로 OnRecvCompleted 내 RegisterRecv를 하지 않아도 될까요? 아뇨 그렇다고 해도 TCP 특성상 패킷이 한 번에 온다는 보장이 없어서 OnRecv -> Register 반복 작업은 항상 있어야 합니다. 만약에 연결이 끊어진다면, 그건 그거대로 Recv할 때 0바이트 수신이 뜹니다.
- 0
- 2
- 74
질문&답변
2024.05.25
몇 가지 질문이 있습니다!
1. 세션코드에서 Send부분에 lock안에서 enqueue를 하는 이유는 TCP 통신의 순서를 보장하기 위해서 인가요? 아닙니다. Send는 여러 쓰레드에서 호출을 할 수가 있어요. 한 유저한테 귓말이 올 수도 있찌만 몬스터가 주변에서 공격도 할 수 있고 그런거라 컨텐츠를 만들어봐야 알기 쉽습니다. 2. Recv부분은 왜 lock이 안걸려있는지 이해가 되지 않습니다. 검색해보거나 다른 분들 질문을 참고해보면, ReceiveAsync 부분이 1개의 스레드만 접근하는 것을 보장하기 때문이라고 하시는 것 같은데요. 이 부분은 소켓API 부분에서 보장해주는 건가요? 아닙니다. 이 부분을 늘 낚시대에 비유를 하는데 낚시대를 하나 던지고, 그것을 회수하고, 다시 던지기 때문에 애당초 낚시대가 하나여서 멀티쓰레드로 동시에 두개의 낚시대를 끌어올릴 수 없는 것과 유사합니다. 3. PacketSession의 OnRecv 부분에서 BitConverter.ToUInt16 메서드가 메서드 자체적으로 바이트 배열의 시작하는 인덱스에서 '2바이트'만큼을 부호없는 정수로 바꾸는 메서드라고 알아보았는데요. 메서드 자체에서 '2바이트'라고 지정해둔 것은 보편적으로 패킷의 크기를 나타내는 헤더를 2바이트로 정하기 때문인가요? 우리가 2바이트로 정한 것이고, 64KB면 하나의 패킷으로 적당해서 그렇지만 경우에 따라 헤더를 4바이트-4바이트로 하는 경우도 있긴 합니다. 4. 위처럼 OnRecv에서 패킷이 온전하게 도착하지 않았을 때, 단순히 writePos만 옮겨진 상태로 다음 패킷을 받을 때까지 기다리기만 해도 되는 것은, TCP 통신 자체가 '순서를 보장하기 때문에 앞에서 온전하게 받지 못한 패킷에 대해서 다른 패킷보다 먼저 다시 보내주고', '온전하게 도착하지 않은 부분에 대해서만 보내주기 때문'일까요? 전자입니다. 다른 패킷보다 먼저 다시 보내주는건 TCP상 불가능합니다. 그리고 그렇다면 위처럼 순서를 보장해주고, 상대가 어디까지 받았는지, 어디를 못 받았는지 판단하는 것은 운영체제에서 알아서 처리되는 건가요? 네 정확히는 TCP 프로토콜에 의해 그렇습니다. 만약 상대가 못 받았을 경우 다시 보내줘야 한다면, 커널에서 패킷을 송신한 뒤에도 상대가 온전하게 받았다고 신호하기 전까지는 커널 상의 버퍼에 해당 패킷을 계속 저장해두고 있으려나요? 그건 TCP 프로토콜에 의해 네트워크 라이브러리 및 OS에서 알아서 해줍니다. 5. ArraySegment를 사용할 때, Array를 통해 배열의 시작 위치를 넘기고 어떤 위치부터 조회할 지(?) 조회할 위치를 넘기는 부분이 Offset인 것 같은데요. Offset을 0으로 두고 readPos및 writePos나 DataSize, FreeSize 등을 통해 패킷 시작 위치나 범위를 지정해주는 것은 Offset 값을 변경하며 이를 컨트롤 하는 것이 복잡하기 때문인가요? 질문이 이해 안 갑니다. 이미 처리한 부분과 처리하지 않은 부분을 read, write 커서로 관리하는 것입니다. 6. 4년제 학부 졸업생의 수준에서 서버 코드를 보고 이 부분은 왜 이렇게 작성된 것인지, 어떤 흐름으로 코드가 실행되는지 정도만 이해하면 게임 서버 프로그래머로 취업하기엔 충분할까요...? 아니면 정말 혼자 서버 코어 부분을 작성할 수 있을 정도가 되어야 하는건가요? 취업은 정답이 없습니다. 알면 확률이 높아지는 것일 뿐이죠. 정말 깊이 있게 이해했다면, 그리고 응용이 가능하다면 거기서 클라/서버 연동 포폴을 이쁘게 만들면 좋기는 하지만 "= 서버코어를 작성할 수 있다"는 아닙니다. 서버 프로그래머라고 서버코어를 할 줄 아는건 아니고 경험상 5% 정도만 할 줄 압니다.
- 0
- 2
- 83