2017-01-14 17 views
-1

Это онлайн-игра, и мне заплатили за реализацию игрового события, которое является игровой системой Player and the Player.Лучше ли сортировать сервер и распространять его на клиентов или отправлять несортированные и разрешать клиентам сортировать его?

В моем проекте у меня есть класс на стороне сервера (с именем PvpEventManager, который является менеджером событий, и он обрабатывается, когда игрок убивает другого, когда игрок присоединяется или покидает событие, будь то по решению, будучи отключенным .. .etc, и имеет много других функций.

Теперь этот класс также содержит контейнер с информацией о игроке во время события (по имени vPlayerInfo) для всех видов обработки. Когда игрок убивает кого-то другого, его kill должен быть и жертва death тоже, совершенно очевидно. Но также случается, что у клиентов есть табло, и поскольку это задача сервера обрабатывать убийство и сообщать всем другим клиентам, связанным с событием об этом, контейнер получит обновлено.

Необходимо, чтобы контейнер был отсортирован с kill элементом структуры от возрастания до убыточного так, чтобы табло можно было визуализировать (на клиенте) правильно.

Что было бы лучше?

  • Чтобы сортировать контейнер на сервере, увеличивая работу сервера и отправляя уже отсортированный контейнер готового к отображению на экране всем клиентам.
  • Чтобы отправить контейнер без сортировки и пусть каждый подключенный клиент игры сортирует сам контейнер при его получении.

Обратите внимание, что сервер обрабатывает тысячи и тысячи пакетов входящих и исходящих каждый тик и действительно обрабатывает МНОГО, много другого материала.

Это несколько описывает конструкцию этого:

Event Design

Этот код описывает то, что делается при сортировке контейнера на части фактического кода.

#include <iostream> 
#include <array> 
#include <vector> 
#include <map> 
#include <algorithm> 

struct PlayerScoreBoardInfo 
{ 
    std::string name; 
    unsigned int kill, death, suicide; 
    unsigned int scorestreak; 
    PlayerScoreBoardInfo() 
    { 
     kill = death = suicide = scorestreak = 0; 
     name = ""; 
    } 
    explicit PlayerScoreBoardInfo(std::string strname, unsigned int nkill, unsigned int ndeath, unsigned int nsuicide, unsigned int nscorestreak) : 
     name(strname), kill(nkill), death(ndeath), suicide(nsuicide), scorestreak(nscorestreak) 
    { 

    } 
}; 

class GameArenaManager 
{ 
private: 
    GameArenaManager() {} 
public: 
    std::map<u_long, PlayerScoreBoardInfo> m_Infos; 
public: 
    static GameArenaManager& GetInstance() 
    { 
     static GameArenaManager InstanceObj; 
     return InstanceObj; 
    } 
}; 

template <typename T1, typename T2> inline void SortVecFromMap(std::map<T1,T2>& maptodosort, std::vector<T2>& vectosort) 
{ 
    std::vector<T1> feedvector; 
    feedvector.reserve(maptodosort.size()); 

    for(const auto& it : maptodosort) 
     feedvector.push_back(it.second.kill); 

    std::sort(feedvector.begin(), feedvector.end(), std::greater<T1>()); 

    for(const auto& itV : feedvector) { 
     for(const auto& itM : maptodosort) { 
      if(itM.second.kill == itV) { 
       vectosort.push_back(itM.second); 
      } 
     } 
    } 
} 

int main() 
{ 
    GameArenaManager& Manager = GameArenaManager::GetInstance(); 
    PlayerScoreBoardInfo info[5]; 
    info[0] = PlayerScoreBoardInfo("ArchedukeShrimp", 5,4,0,0); 
    info[1] = PlayerScoreBoardInfo("EvilLactobacilus", 9,4,0,0); 
    info[2] = PlayerScoreBoardInfo("DolphinetelyOrcaward", 23,4,0,0); 
    info[3] = PlayerScoreBoardInfo("ChuckSkeet", 1,4,0,0); 
    info[4] = PlayerScoreBoardInfo("TrumpMcDuck", 87,4,0,0); 
    for(int i=0; i<5; i++) 
     Manager.m_Infos.insert(std::make_pair(i, info[i])); 

    std::vector<PlayerScoreBoardInfo> sortedvec; 
    SortVecFromMap(Manager.m_Infos, sortedvec); 

    for(std::vector<PlayerScoreBoardInfo>::iterator it = sortedvec.begin(); it != sortedvec.end(); it++) 
    { 
     std::cout << "Name: " << (*it).name.c_str() << " "; 
     std::cout << "Kills: " << (*it).kill   << std::endl; 
    } 

    return 0; 
} 

Вот ссылка для ideone скомпилированного кода: http://ideone.com/B08y9l

И одна ссылка для Wandbox в случае, если вы хотите редактировать компилировать на реальном времени: http://melpon.org/wandbox/permlink/6OVLBGEXiux5Vn34

ответ

1

Этот вопрос, вероятно, получите закрывшегося, как " не по теме". Однако

Первый вопрос: нужен ли серверу отсортированный табло?

Если нет, то зачем это делать?

Во всяком случае, сервер захочет индексировать табло идентификатором игрока, который утверждает, что для сортировки по идентификатору (для поддержки двоичных запросов) или с использованием хэш-контейнера (время поиска O1).

Кроме того, конечным узким местом является пропускная способность сети. В конечном итоге вы захотите иметь возможность отправлять дельтам табло вместо сообщений о состоянии мира.

Это еще раз доказывает, что клиенты делают работу по прибежищу.

Существует еще один философский аргумент:

сортирует ничем, кроме первичного ключа озабоченности данных или презентационной озабоченность? Это проблема презентации.

Что делает презентация? Клиент.

QED

+0

Это очень умные высказывания, он имеет полный смысл, клиент должен отсортированный один и сервер не делает! Большое спасибо. –

+0

Да, я знал, что люди будут слишком критиковать этот вопрос, но, что ж, это настоящий проблемный вопрос, включает в себя дизайн и проблему программирования, и самое главное, я бы не прочитал эти превосходные аргументы, если бы я не спросил об этом , –

+1

@ViniyoShouta, если игра прошла успешно, вы знаете, кому кредит! ;-) –

 Смежные вопросы

  • Нет связанных вопросов^_^