JS129 1월 3주차 - FACTS: 이번 일주일 동안 있었던 일, 내가 한 일(1) 멀티플레이 게임 서버 제작하기- FEELINGS(느낌, 주관) : 나의 감정적인 반응, 느낌재밌으면서도 어려웠다. 서버만 잘한다고 게임이 잘 되는 것도 아니고, 클라만 잘한다고 해서 게임이 완성되는 것도 아니었다. 결국 실시간 멀티 플레이 게임이라는 건 두 애플리케이션이 적절하게 조화를 이룰 때 가능하다는 사실을 절절히 깨닫게 되었다. 만든 결과물이 버그 투성이라 씁쓸하긴 하지만 얻은 게 많다는 점은 긍정적이라고 본다.- FINDINGS(배운 것) : 그 상황으로부터 내가 배운 것, 얻은 것"이렇게 하면 안 된다."를 배운 게 크다고 생각한다. 물론 다 완벽하게 했다면 좋았겠지만, 때론 실패에서 얻는 게 더 클 때도 있는 법이다. 매도 빨리.. JS/WIL(Weekly I Learned) 2025. 1. 17. 2025-01-17 <멀티 플레이 게임 서버 제작하기> 멀티 플레이 게임 서버 제작하기!! - TCP뱀서라이크와 핵슬을 짬뽕한 멀티 플레이 게임입니다.🐱👤 게임으로서는 완성도가 다소 낮지만, TCP 연결을 통해 서버 입장에서 다양한 기능을 구현해보고자 했습니다!게임 플레이하기https://drive.google.com/file/d/1TCHRNkLBIoRr6Cr2S6peTWQoUKbNm_Sl/view?usp=sharing빌드된 파일은 위 링크를 통해 다운로드 받으실 수 있습니다.IP : 3.34.124.193 / PORT : 5555입장과 동시에 게임을 위한 룸이 생성되고, 룸 기준 최대 4인까지 멀티 플레이가 가능합니다.가까운 적을 자동으로 공격하며 WASD로 움직임이 가능합니다.아군을 뒤로 밀어낼 수 있습니다! 재밌게 놀아보세요 :)게임 구상핵 앤 슬.. JS/TIL(Today I Learned) 2025. 1. 17. 2025-01-16 내일배움캠프 Node.js 트랙 56일차스레드뮤텍스뮤텍스는 상호 배제(MUTual EXclusion)의 줄임말이며, 스레드 간의 경쟁상태를 해소하기 위해 사용된다.스레드와 경쟁 상태스레드 간의 경쟁 상태를 이해하기 위해선 스레드가 실제 어떻게 실행되는지를 이해해야 한다. 우리가 알아야 하는 건 컴퓨터는 생각보다 똑똑하지 않다는 점이다. 그야 물론 똑똑하기야 하다만, 인간에 비할 수는 없단 얘기다.스레드에게 두 가지 일을 시킨다고 생각해보자. 보통 사람에게 두 가지 일을 해달라고 부탁한다면 하나를 먼저 하고 그 다음 나머지 일을 처리할 것이다. 그러나 컴퓨터 운영체제는 일을 번갈아 수행한다. 1번 스레드를 실행하다가 2번 스레드를 실행하고 또 1번을 실행하고 3번을 실행하는 등 왔다갔다 프로세스를 진행한다.. JS/TIL(Today I Learned) 2025. 1. 16. 2025-01-15 내일배움캠프 Node.js 트랙 55일차멀티플레이 게임 서버 구현을 위한 짧은 단상해결된 문제세션 내 플레이어들과 위치 동기화클라이언트업데이트 함수void Update(){ if (!GameManager.instance.isLive) return; if (isTargetPositionSet) { // 서버로부터 받은 위치로 이동 rigid.MovePosition(targetPosition); isTargetPositionSet = false; // 목표 위치로 이동 후 상태 초기화 } if (!onCollision) { //.. JS/TIL(Today I Learned) 2025. 1. 15. 2025-01-14 <트러블 슈팅> - 게임 종료 및 세션 삭제 구현하기 내일배움캠프 Node.js 트랙 54일차 - 게임 종료 및 세션 삭제 구현하기게임이 정상적으로 종료되지 않던 문제 유니티 에디터를 통해서 실행을 종료할 때, 클라이언트 연결이 정상적으로 종료되지 않던 문제가 있었다. 위 에러 메시지는 종료가 제대로 이루어지지 않아서 소켓 오류가 났다는 것인데... 사실 이런 에러가 나는 건 어쩔 수 없는 부분이긴 했다.(오류가 나면 에러 메시지를 뱉게끔 코드를 짰기 때문에)다만, 종료 이후에 이루어져야 할 로직들(세션에서 유저 삭제, 유저 세션에서 삭제 등등…)이 에러로 인해 실행되지 않는 게 문제였다. 에러 메시지는 그대로 두되, 그 외의 작동이 정상적으로 수행될 순 없는 걸까. 고민을 좀 해보다가 종료 방식을 바꿔보기로 결정했다.TCP 연결 종료 방식 변경그래서 Di.. JS/TIL(Today I Learned) 2025. 1. 14. 2025-01-13 <네트워크 WRAP-UP과 중앙처리장치(CPU)> 내일배움캠프 Node.js 트랙 53일차네트워크 WRAP-UP전송계층 프로토콜전송 계층은 네트워크 계층과 응용 계층 사이에 존재하는 통신 계층입니다. 기존에 네트워크 계층의 프로토콜이 가지고 있던 약점을 보완해 주기도 하고, 또 응용계층의 하위 계층으로서 그 기반 역할을 수행합니다. 여기서 네트워크 계층이 가진 한계가 무엇이냐 하면, 최선형 전달 방식에 비연결 지향 통신이라고 말할 수 있겠습니다. 말 그대로 최선을 다해서 호스트에서 호스트까지 패킷을 전송은 하지만 어플리케이션 레벨에서 정말로 패킷이 전송 되었는지는 보장하지 않습니다. 중간에 패킷이 손실되거나 잘못 전송되어도 이를 확인하거나 복구할 기능이 포함되어 있지 않습니다. 물론 이런 방식이 마냥 나쁜 것만은 아닙니다. 동영상 스트리밍처럼 때론 신뢰.. JS/TIL(Today I Learned) 2025. 1. 13. 1월 2주차 - FACTS: 이번 일주일 동안 있었던 일, 내가 한 일(1) TCP 통신으로 게임 서버 만들기게임 구상레퍼런스 : 돈스타브 투게더, 히어로 시즈, 발헤임, 딥락갤럭틱오브젝트 종류 생각해보기상점몬스터 게이트미션을 주는 오브젝트모험, 수집과 관련된 오브젝트술집, 낚시(빠지면 게임 아님ㅋㅋ)필수+도전 기능 체크리스트 서버 초기화 ✅ 2025-01-07 ERD, 패킷 명세서, 페이로드 명세서 ✅ 2025-01-07 DB 연동해서 유저의 마지막 위치 저장하기 ✅ 2025-01-08 재접속 시 마지막 위치에서 시작하기 ✅ 2025-01-08 Latency를 서버에서 받기 ✅ 2025-01-08 게임 에셋 제작만들어야 하는 로직 게임 종료 버튼(+ 게임이 종료되면 세션 삭제) ✅ 2025-01-10 단일 게임 세.. JS/WIL(Weekly I Learned) 2025. 1. 10. 2025-01-10 <추측항법을 어떻게 구현할까? (2)> 내일배움캠프 Node.js 트랙 52일차추측항법을 어떻게 구현할까? (2)지난 8일 TIL에서 이미 추측항법에 대해 작성한 바 있지만, 프로젝트를 계속 진행해본 중에 조금 더 많은 고민거리가 생겨났다. 처음 코드를 작성했을 땐 싱글 플레이라서 하나의 클라이언트만 고려하면 됐지만 멀티 플레이 기능을 추가한 이후론 동기화 방식이 더 자연스러웠으면 좋겠다는 희망사항이 생겼기 때문이다. 충돌 로직까지 서버에서 구현하기로 결심한 이상, 동기화 문제를 당장에 해결하는 건 요원해 보인다. 그래도 관련된 정보를 정리하며 차근차근 구현을 해볼까 한다.(이하 내용은 배현직 저자의 에서 참고하였다.)게임 플레이 네트워킹서버 - 클라이언트 간 네트워킹 방식엔 크게 두 종류가 있다. 모든 로직을 서버가 도맡는 방식과 렌더링을 .. JS/TIL(Today I Learned) 2025. 1. 10. 2025-01-09 <스트림이란 무엇일까> 내일배움캠프 Node.js 트랙 51일차스트림이란 무엇일까부트캠프 튜터님과 이야기하던 중, 이런 질문을 받게 되었다."TCP는 데이터를 통째로 보내나요?"나는 배운대로 답을 했다."아니요. 스트림 형식으로 보낸다고 알고 있습니다."그러자 튜터님은 또다시 질문하셨다."스트림 형식이 뭔데요?" 말문이 턱 막혔다. TCP가 스트림 소켓이란 건 앞서 소켓 프로그래밍을 공부하며 알게 되었지만, 정확히 스트림 형식이란 게 뭔지 몰랐기 때문이다.이걸 아직도 알아볼 생각을 안 하고 있었다니 스스로 놀랍고 당혹스러웠다. 이렇게 된 김에 오늘 TIL에는 스트림 형식에 대해 적어볼까 한다. 이제부터 작성할 정보는 최근에 구입한 책 에서 발췌한 내용들이다.스트림 형식스트림이란 데이터의 흐름이다. TCP 프로토콜이 연결 지향이.. JS/TIL(Today I Learned) 2025. 1. 9. 2025-01-08 <추측항법을 어떻게 구현할까?> 내일배움캠프 Node.js 트랙 50일차추측항법을 어떻게 구현할까?레이턴시레이턴시란 한 지점에서 다른 지점으로 이동하는 데 걸리는 시간을 의미한다.게임 서버를 예로 들어보자. 클라이언트가 본인의 위치를 서버로 보내어 동기화를 시도할 때, 레이턴시가 길어진다면 어떨까. 아마 게임 속 캐릭터가 뚝뚝 끊기면서 이동하게 될 테고 사용자 경험은 곤두박질칠 것이다.추측항법추측항법의 기본 원리는 현재 상태를 바탕으로 미래 상태를 예측하는 것이다. 이를 테면, 서버가 클라이언트의 레이턴시가 100ms 인 상황에서 속도가 v인 오브젝트의 미래를 예측하여 클라이언트에게 미리 공지하는 것이다. 거리 = 속도 x 시간이므로, 다음과 같은 정보가 필요하다.초기 위치 (Initial Position): 계산의 시작점이 되는 위치.. JS/TIL(Today I Learned) 2025. 1. 8. 2025-01-07 <라디안과 삼각함수를 이용해 게임 로직 구현하기> 내일배움캠프 Node.js 트랙 49일차라디안과 삼각함수라디안우리는 각도에 대해 얘기할 때 호도법보다는 육십분법을 많이 사용한다. 여기서 육십분법이란 우리가 흔히 사용하는 직각을 90도로 정의하는 방식을 말한다. 그러나 각도를 다른 방식(보다 수학적으로)으로 나타내는 방법도 있는데 그것이 바로 고등학교 때 배우는 호도법이다.호도법호도법은 호의 길이를 통해 각도를 나타내는 방식이다. 왜 하필 호의 길이인가 의문이 들 수 있는데, 이는 부채꼴에서 호의 길이가 중심각에 비례하기 때문이다. 그렇다면 호의 길이는 어떻게 구할까. 원의 둘레를 구하는 공식을 기억하고 있다면 어렵지 않게 추론할 수 있다. 알다시피 원의 둘레는 2πR로 구할 수 있다. R(원의 반지름)이야 어찌됐건 우리가 주목해야 할 점은, 부채꼴의 .. JS/TIL(Today I Learned) 2025. 1. 7. 2025-01-06 <프로토콜 버퍼를 이용한 TCP 서버 통신> 내일배움캠프 Node.js 트랙 48일차프로토콜 버퍼를 이용한 TCP 서버 통신직렬화와 역직렬화웹소켓을 통해 게임서버를 만들 때부터, 우리는 클라이언트와 서버 간에 패킷을 주고받았다. 아래는 이번 프로젝트에서 사용하게 될 공통 패킷 구조이다. 프로토버프 구조(요청/응답)필드 명타입설명handlerIduint32핸들러 ID (4바이트)userIdstring유저 ID (UUID)versionstring클라이언트 버전 (문자열)payloadbytes실제 데이터 필드 명타입설명handlerIduint32핸들러 IDresponseCodeuint32응답 코드 (성공: 0, 실패: 에러 코드)timestampint64메시지 생성 타임스탬프 (Unix 타임스탬프)databytes실제 응답 데이터 (선택적 필드) 이니셜.. JS/TIL(Today I Learned) 2025. 1. 6. 이전 1 2 3 4 5 6 7 ··· 11 다음