클라이언트와 서버를 동시에 효율적으로 코딩하는 방법은 무엇입니까?


15

클라이언트 서버 모델을 사용하여 게임을 코딩하고 있습니다. 싱글 플레이어에서 게임을 할 때 게임은 로컬 서버를 시작하고 원격 서버 (멀티 플레이어)와 상호 작용합니다. 별도의 싱글 플레이어 코드와 멀티 플레이어 코드를 코딩하지 않기 위해이 작업을 수행했습니다.

방금 코딩을 시작했으며 큰 문제가 발생했습니다. 현재 Eclipse에서 게임을 개발 중이며 모든 게임 클래스가 패키지로 구성되어 있습니다. 그런 다음 서버 코드에서 클라이언트 패키지의 모든 클래스를 사용합니다.

문제는 이러한 클라이언트 클래스에는 렌더링에 고유 한 변수가 있으며 서버에서 수행되지 않는 것입니다.

서버에서 사용할 클라이언트 클래스의 수정 된 버전을 작성해야합니까? 또는 부울로 클라이언트 클래스를 수정하여 클라이언트 / 서버가 클라이언트 클래스를 사용하는지 여부를 나타냅니다. 다른 옵션이 있습니까? 서버 클래스를 핵심 클래스로 사용하고 렌더링 항목으로 확장하는 것에 대해 생각한 적이 있습니까?


전 처리기 옵션이 있습니까? #ifdef CLIENT <일부 코드> #endif와 같습니다. 서버와 클라이언트간에 서로 다른 부분을 공유 할 수있는 공유 클래스 파일을 갖는 간단한 방법입니다. 그래도 조금 지저분합니다.
William Mariager

MindWorX에 동의합니다. 조건부 컴파일은 Java에서 어려움 이 있지만 고려해야 할 솔루션 이 있습니다.
sam hocevar

1
조건부 컴파일은 "패키지에 충분한 디자인 시간을 넣지 않았습니다"라고 말하는 조잡한 방법입니다. 6 개월 후 자신의 코드를 다시 읽을 때 프로토 타입을 제외하고는 비생산적입니다.
패트릭 휴즈

답변:


23

렌더링 코드 는 별도의 관심사 이므로 게임 코드와 별도로 유지하는 것이 좋습니다 .

렌더링 코드를 클라이언트 / 서버 코드와 분리하면 몇 가지 장점이 있습니다.

  • 렌더링하는 모든 코드가 한 곳에 있기 때문에 전용 서버를 만드는 것이 더 쉽습니다.
  • 당신은 당신의 update단계를 분리 할 수 ​​있습니다render 단계와 실행할 수 있습니다.
  • 을 사용하여 const버그를 줄임으로써 렌더링 코드가 게임 상태를 변경하지 않도록 할 수 있습니다 .

1
+1이 의견에 더 동의 할 수 없습니다. 해당 모델의 렌더링 된 뷰에서 데이터 모델링을 분리하면 다른 정보를 보여주는 여러 창과 같은 깔끔한 작업을 수행하고 렌더링을 다른 플랫폼으로 이식하고 분석을 추가하며 코드 기반의 90 %를 건드리지 않고도 게임 플레이 시뮬레이션을 조정할 수 있습니다. .
패트릭 휴즈

5

클라이언트와 서버 코드를 완전히 분리해야한다고 생각합니다. 서버 코드와 클라이언트 코드는 인터페이스에 노출 된 기능을 제외하고 서로에 대해 알지 않아야합니다. 서버는 렌더링, 클라이언트 등록, 위치 추적, 시간 등에 대해 전혀 알 필요가 없습니다. 완전히 분리 된 관심사가 있으면 게임을 유지 관리하고 더 쉽게 개발할 수 있습니다. 희망이 조금 도움이되기를 바랍니다.


+1 나는 이것에 동의하는 경향이있다. 서버에서 클라이언트를 실행하려는 경우 별도의 프로세스로 수행해야합니다.
엔지니어

5

우려 사항 분리 FTW, 다른 사람들이 말했듯이 최종 목표가 별도의 클라이언트 및 서버 응용 프로그램을 갖는 경우 한 단계 더 나아가 야합니다. 클라이언트 별, 서버 별 및 공유 대상을 결정해야합니다. 공유되는 모든 것을 독점적으로 공유하는 코드의 클래스로 분리하십시오. 클라이언트 또는 서버 특정 클래스는 공유 클래스를 적절히 서브 클래스 화하거나 참조 할 수 있습니다. 공유 클래스를 별도의 프로젝트로 이동하여 "공유 라이브러리"JAR을 빌드하고 해당 JAR을 클라이언트 및 서버 프로젝트 모두에 포함하십시오.

여기에는 몇 가지 장점이 있습니다. 모든 것을 별도의 프로젝트에 유지하기 위해 우려를 명확하게 구분합니다. 클라이언트와 서버가 동일한 버전의 공유 JAR을 사용하는 한 동일한 공유 코드로 시작하도록합니다. 공유 코드를 "실수로"수정하지 않고 실수로 수정하는 것은 불가능합니다. 공유 코드가 자체 프로젝트에있는 경우 해당 프로젝트에서 변경 사항이 클라이언트와 서버 모두에 어떤 영향을 미치는지 알아야 할 사항을 프로젝트에서 편집 할 때 알게됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.