Что лучше сортировать с сервера и распространять среди клиентов или отправлять несортированные и разрешать клиентам сортировать?

Это онлайн-игра, и мне заплатили за реализацию игрового события, которое представляет собой игровую систему Игрок против Игрока.

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

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

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

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

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

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

Это несколько описывает дизайн этого:

Дизайн мероприятий

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

#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

Другие вопросы по тегам