멀티 플레이어 FPS 서버 측 성능


12

이것은 대역폭에 관한 질문을 제외하고 MMO 성능 과 관련이 있습니다. 이것은 CPU 부하에 관한 것입니다.

node.js와 webGL을 사용하여 간단한 FPS를 만들었습니다. MIDI Maze의 BuddyMaze 클론과 매우 유사합니다. 거의 진행되지 않고 모두가 2 차원 (높이 없음)으로 움직이며 간단한 발사체를 쏘고 벽에 부딪칩니다.

지금, 모든 플레이어가 원을 그리면서 빠르게 쏘는 서버에 여러 연결을하면 서버가 코어를 최대한 활용하고 속도가 느려지기 전에 게임에서 약 15-20 명의 플레이어를 확보 할 수 있습니다. 그리고 이것은 서버에서 30fps로 실행될 때입니다. 10fps에서 약 25-30 개의 연결을 얻습니다. 게임이 곧 더 많은 것을 할 것이기 때문에 이것은 매우 나쁘다. 그리고 이것이 가능한 노력이 되려면 더 많은 선수들을 맞출 필요가있다.

동생이 방금 동료의 TF2 서버에 대한 통계를 지적했습니다. 그의 서버는 우리보다 사양이 낮지 만, 훨씬 더 복잡한 게임 인 TF2를 실행합니다. 코어 당 36 명의 사용자로 초당 500 틱으로 엄청나게 복잡한 게임입니다. 또한 현재 대역폭보다 훨씬 더 많은 대역폭을 사용하지만 아직 그 정도를 낮추려고하지는 않았습니다.

이것이 어떻게 가능한지? 서버 성능을이 정도까지 높이기 위해 어떤 트릭이 있습니까? 내가 아는 몇 가지 사항은 다음과 같습니다.

  • 서버의 프레임 속도를 낮추고 클라이언트의 위치를 ​​보간합니다. 나는 약간의 이점을 얻었지만 분명히 TF2 서버는 이것을 귀찮게하지 않습니다.
  • 클라이언트에서 충돌 감지와 같은 값 비싼 작업을 수행하고 서버에서 드물게 확인하십시오. 나는 이것을 아직 옮기지 않았으며 오늘 밤에 할 것입니다. 그럼에도 불구하고 나는 그렇게 큰 이익을 기대하지 않습니다.
  • 계산을 최소화하기 위해 경기장을 영역 (쿼드 트리)으로 나눕니다. 아직 기회가 없었습니다.
  • node.js가 TF2가 사용하는 것보다 느리다는 불행한 가능성을 고려했으며 이러한 종류의 고강도 작업에는 적합하지 않을 수 있습니다.
  • 모든 것이 서버 구성 마법에 있습니까?

그렇다면 서버에서 요구되는 최소한의 작업 만 수행하면서도 완벽한 게임 경험을 유지하기위한 업계의 다른 비법은 무엇입니까? "CPU 시간을 절약하기 위해 클라이언트에 의존"과 "클라이언트를 신뢰하지 않음"사이에 큰 충돌이 발생하여 다양한 상황에서 라인이 어디에 그려 지는지를 아는 데 도움이됩니까?

최신 정보

프로파일 링은 필자가 찾은 유일한 진언입니다. 나는 코드 (고마워, FP!) 주위에 몇 가지 타이밍 기능을 신속하게 감 쌌고 결코 예상하지 못한 것을 발견했습니다. 데이터를 클라이언트에게 브로드 캐스트하는 행위는 거의 모든 실행 시간을 설명합니다. 구체적으로 약 90 %입니다. 추가 테스트에 따르면이 시간은 클라이언트 수와 데이터 크기에 따라 달라 지지만 더 많이 나타납니다. 20 명의 사용자로드에서 전체 데이터 대신 "{}"만 전송하여 브로드 캐스트 시간을 24ms에서 2ms 이상으로 90 % 단축했습니다. 그러나 5 명의 사용자 만 있으면 방송에 약 0.5ms가 걸립니다. 그래서 나는 여기서 약간의 최적화를해야합니다.

가장 눈에 띄는 개선 첫 번째는 시선 점검입니다. 이는 데이터에 관심이있는 사람의 수와 이해 당사자에게 전송되는 데이터의 양을 줄입니다. 이 영역에 다른 트릭이 있습니까? 방송 운영 비용을 최소화하는 데 중점을두고 있습니까?


5
코드가 실제로 제안 할 수있는 모든 것의 프로파일입니다. 내 생각에 그것은 당신이 생각하는 것만 큼 잘 조정되지 않았기 때문에 TF2가 적은 하드웨어에서 더 높은 틱 속도를 실행하는 이유입니다. 또한 TF2가 제안한 모든 작업을 수행하고 그 결과 성능이 더 높은 이유에 기여하고 있다고 생각합니다.
Nate

1
최신 결과를 듣고 싶습니다. node.js에서 더 나은 성능을 얻을 수 있었습니까?
iddqd

답변:


5

서버는 모든 틱마다 모든 플레이어의 상태를 모든 플레이어에게 보내서는 안됩니다. 대신 500ms마다 "뷰 포트에있는 x 플레이어는이 좌표에 500ms 내에 있어야합니다."라는 메시지를 각 클라이언트에 특수하게 조작해야합니다. 대부분의 경우 이것이 잘 작동하지만 서버가 잘못된 정보를 제공했다는 것을 인식하면 추가 메시지를 보냅니다.

네트워크 트래픽이 크게 줄어 듭니다.

고려해야 할 또 다른 사항은 서버에 게임 틱을 두지 않고 대신 액션이 발생할 때 (방향 변경, 샷 발생) 클라이언트가 메시지를 보낸 다음 액션이 수신 될 때 서버에서 미리 계산하도록하는 것입니다.


네, 지금 시선 검사를 추가하고 있습니다. 실제로 25 플레이어의 경우 45ms에서 35ms까지의 게인은 최소였습니다. 그러나 브로드 캐스트 대신 개별 전송 명령을 사용하는 데 약간의 오버 헤드가있을 수 있습니다. 그리고 입력시에만 메시지를 보냅니다. 그러나 당신이 옳습니다. 입력을받을 때만 전혀 틱 할 필요가없는 방법이있을 수 있습니다.
Tesserex

1

node.js가 TF2가 사용하는 것보다 느리다는 불행한 가능성을 고려했으며 이러한 종류의 고강도 작업에는 적합하지 않을 수 있습니다.

아마 이것입니다. TF2의 서버는 C / C ++을 사용하여 작성되었으므로 node.js보다 빠릅니다 (정확하게 기억하면 Java로 해석 된 Javascript를 사용합니다)

Google의 WebGL 기반 Quake는 서버에 java를 사용하며 소스 코드는 http://code.google.com/p/quake2-gwt-port/에 있습니다. 어떻게했는지 살펴 보는 것이 좋습니다. 또한 서버에서 프레임 속도를 사용하는 것에 대해 이야기 할 때 무슨 의미인지 궁금합니다. 서버에 아무것도 렌더링 할 이유가 없으며 클라이언트가 보낸 명령을 처리하기 위해 있어야합니다.

마지막으로, "클라이언트를 신뢰하지 말라"라는 규칙은 성능 향상을 위해 비싼 계산을 클라이언트에 오프로드하는 것보다 중요합니다. 특히 충돌 감지만큼 중요한 것이 있습니다. 게임이 자바 스크립트 기반이기 때문에 해킹하기가 매우 쉽다 (컴파일 된 TF2와 비교).

나는 이것이 많은 대답이 아니라는 것을 알고 있지만 성능 향상에 도움이 될 수있는 몇 가지 방향을 알려 드리겠습니다.


7
프레임 속도 대신 틱 속도라고 말해야합니다. 물론 서버에는 아무것도 렌더링되지 않습니다. 게임 루프에서 명령을 처리하는 간격을 의미합니다. 또한 몇 가지 답변은 몇 초마다 무작위 검증을 수행하는 한 클라이언트에 충돌 감지와 같은 것을 제공 할 수 있다고 제안합니다. 누군가는 그것이 사기꾼을 오히려 빨리 제거한다고 말했다.
Tesserex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.