251109

lililllilillll·2025년 11월 9일

개발 일지

목록 보기
350/350

✅ 한 것들


  • R&D :: 멀티 게임
  • 게임 서버 프로그래밍 교과서


📝 배운 것들


🏷️ UnityEngine.Pool

    public GameObject testPrefab;
    IObjectPool<GameObject> testPool;

    void Awake()
    {
        // defaultSize, double-release 방지, maxSize도 설정 가능
        testPool = new ObjectPool<GameObject>(CreateItem, OnGet, OnRelease, OnDestroyItem);
    }

	// 풀에서 새 아이템 필요할 때 호출됨
    private GameObject CreateItem() { return Instantiate(testPrefab); }
    private void OnGet(GameObject gameObject) { gameObject.SetActive(true); }

    private void OnRelease(GameObject gameObject) { gameObject.SetActive(false); }
    private void OnDestroyItem(GameObject gameObject) { Destroy(gameObject); }

유니티 내장 오브젝트 풀링 시스템

    private void OnGet(GameObject gameObject)
    {
        gameObject.SetActive(true);
        StartCoroutine(CoRelease(gameObject));
    }
    private IEnumerator CoRelease(GameObject gameObject)
    {
        yield return new WaitForSeconds(1f);
        testPool.Release(gameObject);
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F))
        {
            testPool.Get();
        }
    }

Get Release 테스트해본 코드



🛠️ R&D :: 멀티 게임


Multiplayer Tutorial

https://www.youtube.com/watch?v=Fj2DeO31oF4

(30분 ~ 끝)

Rpc : 다른 이에게 어떤 것을 실행하라 명령 혹은 지시

ServerRpc : Client -> Server
ObserverRpc : Server -> All Clients
TargetRpc : Server -> Single client

보통 클라가 특정 클라에게 어떤 행동 하게 하려면
Client -> ServerRpc -> TargetRpc

ObserverRpc는 host에는 전달되지만 dedi server에는 전달 안된다

SyncVar는 server auth (서버만 변경 가능)

클라가 Owner여도 서버에 요청해야 결과 받을 수 있다
클라가 직접 다른 클라에 뿌리면 반응은 빠르지만 치팅에 취약



📖 게임 서버 프로그래밍 교과서


4장 게임 서버와 클라이언트

4.6 게임 서버의 품질

서버 불안정 극복 방법

  • 서버가 죽더라도 최대한 빨리 되살린다 : 중지되면 감시 프로그램이 서버 재실행
  • 서버가 죽더라도 최대한 적은 서비스만 죽는다 : 프로세스 여러개 띄운다. 비상용 서버를 둔다.
  • 오작동에 대해 기록을 남긴다

수직적 확장

  • 서버 하드웨어 좋은걸로 바꾸기
  • 소프트웨어 설계 비용은 낮지만, 확장 비용이 높다

수평적 확장

  • 서버 머신의 개수를 증설한다
  • 설계 비용 높고 확장 비용 낮다

성능만 좋고 확장성 나쁘면 사용자 수 늘어날수록 연산 처리 시간 오래 걸림
확장성만 좋으면 게임 사용자 수 상관 없이 처리 시간 일정하게 큼

게임 서버 성능 높이기

  • 기본 원칙 : 서버 단위 처리 속도 높이기
  • 코드 최적화나 알고리즘 최적화
  • 연산을 클라에 미리 맡긴다
  • 더 빠른 속도로 실행되는 언어 쓴다
  • 코드 프로파일링으로 과부하 영역 찾은 뒤 분산한다 (ex. 길찾기 담당 서버)
  • 네트워크 프로토콜 최적화
    • 메시지 양을 줄인다
    • 메시지 압축한다 (잠깐 정밀도 낮춘 후에 받았을 때 다시 해석 등)
    • 메시지 교환 횟수 줄인다
  • 노품질 네트워크 회선 가진 데이터 센터에 서버 설치
  • 지리적으로 가까운 데이터 센터에 서버들 분산 설치
  • 서버 거치지 않고 클라끼리 직접 통신하게 한다
    • 일부 공유기(NAT 라우터)는 클라끼리 통신 못해서 릴레이 서버 있어야 할 때도 있음

서버 관리 도구

  • 게임 서버는 콘솔 앱이므로 상호작용 불가
  • 프로그램 켜지면 백그라운드에서 자동 실행 : 서비스(윈도), 데몬(리눅스)
  • GUI 앱, 콘솔 앱, 웹앱 등으로 원격 관리 프로그램 따로 만든다
    • 서버 켜기/ 끄기
    • 동접자 수 보기
    • CPU, RAM 사용량 보기

4.7 플레이어 정보의 저장

데이터베이스 소프트웨어 장점

  • 데이터 관리와 분석 쉽다. 특정 조건 만족 데이터 빠르게 찾기 가능.
  • 데이터 복원 강력하다. 변경 사항을 1개 이상의 사본 저장소에 보관 가능.
  • transaction으로 원자적 변경 가능. 전부 바꾸거나 아예 바꾸지 않거나.
  • 데이터 일관성 유지시켜줌. 경험치 음수 막을 수 있다.
  • lock으로 한 데이터가 여러 데이터 액세스 시 결과 이상해지는거 막아줄 수 있다.
  • 장애 내성 강하다. 데이터 기록 전 로그 버퍼에 할 일 기록 후 적용하는데, 갑자기 꺼지면 로그 버퍼에서 마저 안 한 일 찾아서 복원한다.


profile
너 정말 **핵심**을 찔렀어

0개의 댓글