개발 후반에 네트워킹 코드를 작성하는 방법은 무엇입니까?


12

나는 현재 대부분의 측면에서 개선하고 싶은 게임을 작성하는 초기 단계에 있습니다.
네트워크 코드 작성을 생략하고 쉽게 구현할 수있는 방법, 즉 게임을 추가하기 위해 전체 게임을 다시 작성할 필요가없는 방법은 무엇입니까?
무엇을 명심해야합니까?

물리 / 충돌 감지, 게임 로직, 데이터 유형 및 애니메이션 / 렌더링을 서로 분리하는 구성 요소 패턴이 있습니다.
네트워크 코드가 아직 구현되지 않은 클라이언트와 서버를 작성하여 로컬에서 테스트하려면 어떻게해야합니까?
클라이언트에서 무엇을해야하고 서버에서 무엇을해야합니까? 네트워크 코드가 완성되어 서버와 클라이언트간에 메시지를 보내고 지연이없는 경우에도 계정을 보내야한다고 가정합니까?

편집 : 하향식 RPG가 될 계획입니다. 친구를 위해 서버를 호스팅하는 간단한 멀티 플레이어가 제가 생각하는 것이므로, 부정 행위는 그다지 큰 문제가 아닙니다. 여전히 나는 "서버가 항상 옳다"-접근 방식으로 가고 싶습니다.

편집 2 : 내 마음가짐이 무엇인지에 대한 포인터를 찾고 있다고 생각합니다. 모든 효과 / 변경을 즉시 적용하는 대신 키보드 입력, 애니메이션 등을 어떻게 처리해야합니까? 흠, 나는 어느 곳으로 가기 전에 네트워킹에 대해 제대로 읽어야 할 수도 있습니다. 이것은 로컬에서 작동 할 수있는 일종의 네트워크 골격을 만들어서 멀리하고 싶었습니다.


그것은 일단 당신이 일단 네트워크 코드를 구현하려는 계획에 크게 의존합니다. 예를 들어, 퀘이크 (또는 나중에 아이디 제목이 메모리가 약간 흐릿 할 수 있음)는 항상 클라이언트 / 서버라는 접근 방식을 취했습니다. 단일 플레이어 옵션조차도 실제로 127.0.0.1의 서버에 연결되어 있으며 다른 플레이어를 초대하지 않습니다. 즉, 단일 플레이어 게임도 네트워크 코드를 통해 완전히 실행됩니다.
LLL79

그것은 내가 생각했던 것의 종류입니다. 프로세스 간 통신을 통해 혼자서 놀고 싶을 때 연결할 필요가 없거나 클라이언트와 동일한 기능을하지만 즉시 서버처럼 처리하는 클래스 일 수 있습니다.
Ghork

3
가장 좋은 방법은 꽤 오랫동안 "하지 마십시오"였습니다. 턴 기반 게임을 작성하지 않는 한 네트워킹을 처리하기 위해 다르게 디자인해야합니다. 대기 시간, 정확성 및 부정 행위에 관심이 있다면 그 방법은 없습니다. 그렇지 않으면 실제로 그것에 대해 많은 것을 생각할 필요가 없습니다. 경험이 없으면 어쨌든 적절한 디자인을 충분히 예측할 수 없습니다. 가장 좋은 방법은 네트워킹 경험을 얻기 위해 네트워크로 연결된 두 가지 프로토 타입을 시작하는 것입니다.
Luaan

당신이 그것을 생각한다면, 마인 크래프트는 싱글 플레이어 게임에서도 로컬 서버를 가지고 있습니다. 서버는 엔진이고 클라이언트는 발표자 일뿐입니다.
SparK

답변:


12

작성중인 정확한 게임과 작성 방법에 대해 알지 못하면 문제에 대한 일반적인 해결책을 말하기가 매우 어렵습니다.

그러나 게임의 네트워킹이 얼마나 중요한지에 따라 네트워킹 코드를 남기려는 결정을 고려할 수 있습니다.

내 말은, MMORPG와 같은 네트워크 헤비 게임을 작성하는 경우 네트워킹을 끝내는 것이 현명하지 않을 수 있다는 것입니다.

따라서 네트워킹 코드에 대한 영향이 낮을 경우 (네트워킹 코드가 전혀없는 것이 게임 차단기가 아님), 이후 (그러나 늦지는 않은) 단계로 두는 것이 적절할 수 있습니다.

-writing- 네트워킹 코드는 그것에 대해 생각하는 것과 동일하지 않다는 것을 기억하십시오. 게임 제작 방법에 대한 결정을 내릴 때 이것이 어떻게 네트워킹 결정에 영향을 미치는지 고려해야하며, 예상되는 영향이 큰 경우 일반적인 정보를 제공하는 스텁으로 구현 한 다음 네트워킹을 작성할 때가되어야합니다. 코드, 그것은 당신이 그루터기를 떠난 곳에 꽂는 것입니다.

예를 들어, 온라인 체스 게임을 ExecuteMove()하는 경우 마우스로 이동을 입력 할 때와 키보드로 이동을 입력 할 때 호출 되는 함수가있을 수 있습니다 . 이 시점에서 다른 호스트에서 필요한 데이터를 가져온 후 (이는 나중에 작성하는) 네트워킹 스텁 작성에 대해 생각할 수 있습니다 ExecuteMove().

이렇게하면 게임을 만들 때 네트워킹 코드의 영향을받는 부분을 알 수 있으며 실제로 네트워킹 코드를 작성할시기가되면 몇 단계 앞선 것입니다.

네트워크로 연결된 게임을 처음 작성하는 경우 부정 행위 방지에 대해 너무 많이 생각하지 마십시오. 네트워크 게임을 만드는 것은 고도로 숙련 된 사람들로 구성된 팀 전체가 AAA 게임을하기에 충분할 정도로 복잡하므로, 좀 더 복잡한 주제에 초점을 맞추기 전에 느리게 진행하고 먼저 작동하는 게임을 만드십시오.

마지막으로, 게임을 처음하는 경우에는 네트워크로 연결하지 마십시오. 게임을 만드는 것은 매우 복잡하므로 게임에 추가 할 때마다 요구 사항이 더 복잡해집니다.


글쎄, 그것은 MMO가 아니기 때문에 네트워킹에 무겁지 않을 것입니다. 그러나 부실한 보드 게임이 아니기 때문에 이동하기 전에 몇 초가 걸릴 수도 있습니다. 경험상 마지막 단계에서 멀티 플레이어를 추가해도 효과가 없기 때문에 네트워킹을 일찍 생각해야한다고 생각합니다. 그러나 캐릭터가 움직이고 객체와 충돌하기 전에 네트워크 코드를 작성하고 디버깅하고 싶지 않습니다.
Ghork

2
@ 고 르크 : 아, 당신은 당신의 제품이 가능한 한 빨리 좋은 일을하고 싶어! 글쎄요, 우리 모두는 그렇습니다. 그러나 그 유혹에 굴복한다고해서 잘 고 안되고 생각한 프로그램으로 이어지지는 않을 것입니다.
궤도에서 가벼움 경주

다른 답변도 좋아하지만이 답변을 수락합니다. @Luaan의 코멘트
Ghork

2

나는 비슷한 상황에 있지만 게임보다 네트워크 시뮬레이션을 시도하고 있습니다. 하지만 제 접근 방식이 설계 프로세스에 도움이 될 수 있다고 생각합니다.

내 접근 방식은 IPC (프로세스 간 통신)에 대한 귀하의 의견을 따르고 있습니다.

먼저, 배경으로 Steed와 Oliveira의 "Networked Graphics"책을 공부하고 있습니다. 이것은 다양한 기준과 게임 유형에 따라 게임을위한 다양한 네트워크 아키텍처에 대한 좋은 배경을 제공합니다. 게임 아키텍처와 네트워크에 정확히 무엇을 넣고 싶은지, 로컬에서 무엇을하고 싶은지를 결정하는 데 도움이되는 도구를 제공합니다.

둘째, 네트워크 구성 요소를 별도의 백그라운드 스레드로 분리하여 초기 게임 개발에서 구성 요소를 로컬로 코딩 할 수 있지만 스레드 분리를 처리해야합니다. 나중에 "로컬 배경"이 될 다른 기능과 결합하지 말고 "잠재적으로 원격"배경 스레드로 강제 실행하십시오.

이를 통해 로직을 분리하고 프로세스로 네트워크 지연 요소를 시뮬레이션하여 대기 시간의 영향을 확인할 수 있습니다.


그때 그 책을 확인 해봐야 할 것 같아! 당신이 한 말을 할 수 있다는 약속이 들립니다.
Ghork

@Ghork : 핵심은 아키텍처, 로컬 및 서버에서 원하는 것을 파악하는 것입니다. 또는 동료들이 의사 소통하고 상호 작용하기를 원하는 방식. 그 책이 도움이 될 것입니다. 그런 다음 IPC 메시지 호출의 반대편에 원격으로 원하는 모든 것을 클라이언트 서버 코드 세트를 통해 (현재는 모두 로컬로 유지하지만 분리 된 스레드에서 "원격"으로 유지하는) 클라이언트 코드를 설정하십시오. IPC 메시지 전달 구성 요소에서 시뮬레이션하려는 대기 시간을 인위적으로 추가하십시오. 행운을 빕니다!
Joe Van Steen

1

이 모든 것에 대해 배우고 있다면 간단한 싱글 플레이어 버전 1을 작성하고 일단 작동하면 깊은 지식으로 멀티 플레이 될 버전 2에 대한 모든 것을 깊이 생각해보십시오.


0

스레드간에 메시지를 전달하는 "가짜 네트워크"클래스를 구현합니다. 스레드는 네트워크 클래스와 동일한 인터페이스를 갖습니다. 나중에 임의의 지연 및 패킷 손실을 갖도록 가짜 네트워크를 정교하게 만들 수 있습니다. 실제 네트워크보다 가짜 클래스로 네트워크 코드를 디버깅하는 것이 항상 더 쉽습니다.

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