Не уверен, что нужно сжимать данные или слишком большой цикл

Я был по всему Google в поисках ответа на мою проблему, надеясь, что кто-то здесь может пролить свет на все это.

Итак, я работаю над 2D Online RPG (ролевая игра. Подумайте Final Fantasy, но онлайн). Я работал над этим некоторое время, но столкнулся с небольшой проблемой. Теперь я не уверен на 100%, что сжатие решит проблему, или если просто цикл слишком велик.

Примечание: я использую библиотеку Lidgren Networking. Открыты для предложений по другим вариантам, поскольку Lidgren не поддерживает сжатие.

Некоторая информация о том, что я пытаюсь сделать:

Я пытаюсь отправить пакет, который содержит всю информацию для карты. Чем меньше карта, тем быстрее идет пакет, но когда я пытаюсь отправить карту 250x250 (сверху вниз, на основе тайлов), это занимает несколько минут.

У меня есть 2 теории на это. Во-первых, это занимает некоторое время, потому что карты в этот момент довольно большие по размеру (около 5 МБ), во-вторых, карты настолько велики, что сам цикл занимает некоторое время.

Карты содержат строки, байты, int32s, int16s и т. Д. У меня есть метод сжатия, который требует байтовый массив, но не уверен на 100%, как преобразовать все данные в байтовый массив (я работал только с C# уже чуть больше года, и я полностью самоучка).

Цикл довольно большой, учитывая все обстоятельства. Есть 4 слоя плиток, каждый из которых должен быть пройден. Это то, что заставляет меня полагать, что проблема может быть в петле. При запуске сервера он кэширует все карты (т. Е. Собирает пакеты до того, как они когда-либо понадобятся), поэтому при отправке карты, когда она нужна клиенту, проблем не возникает. Это довольно быстро, честно говоря.

Но когда вы редактируете карту и отправляете ее для сохранения, отправке пакета на сервер и серверу может потребоваться немало времени для отправки обновленного пакета карты всем клиентам, которые в данный момент вошли в систему и стоят на ней. эта карта. Честно говоря, слишком много времени. Я подумал, что сжатие пакета поможет, но, как я уже сказал, я не уверен на 100%, что это проблема.

Вот цикл, который используется:

public static void cacheMap(Int32 mapNum)
    {            
        int X; int Y;
        int MaxX = Types.Map[mapNum].MaxX;
        int MaxY = Types.Map[mapNum].MaxY;

        // ****** PreAllocate Buffer ******
        int mapSize = Marshal.SizeOf(Types.Map[mapNum]);
        int tileSize = Marshal.SizeOf(Types.Map[mapNum].Tile[0,0]);
        int nLength = mapSize + ((tileSize * MaxX) * MaxY);

        NetOutgoingMessage TempBuffer = ServerTCP.sSock.CreateMessage(nLength);

        // Must Preallocate //
        TempBuffer.Write(mapNum);

        // ****** Map Info ******
        TempBuffer.Write(Types.Map[mapNum].Name);            
        TempBuffer.Write(Types.Map[mapNum].Music);            
        TempBuffer.Write(Types.Map[mapNum].Revision);
        TempBuffer.Write(Types.Map[mapNum].Moral);
        TempBuffer.Write(Types.Map[mapNum].Weather);
        TempBuffer.Write(Types.Map[mapNum].Tileset);
        TempBuffer.Write(Types.Map[mapNum].Up);
        TempBuffer.Write(Types.Map[mapNum].Down);
        TempBuffer.Write(Types.Map[mapNum].Left);
        TempBuffer.Write(Types.Map[mapNum].Right);
        TempBuffer.Write(Types.Map[mapNum].BootMap);
        TempBuffer.Write(Types.Map[mapNum].BootX);
        TempBuffer.Write(Types.Map[mapNum].BootY);
        TempBuffer.Write(Types.Map[mapNum].MaxX);
        TempBuffer.Write(Types.Map[mapNum].MaxY);            

        // ****** Tiles ******
        for (X = 0; X <= MaxX - 1; X++)
        {
            for (Y = 0; Y <= MaxY - 1; Y++)
            {
                for (int I = 0; I <= 4; I++)
                {
                    TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Layer[I].X);
                    TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Layer[I].Y);
                    TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Layer[I].Tileset);
                    TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Autotile[I]);
                }
                TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Type);
                TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Data1);
                TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Data2);
                TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].Data3);
                TempBuffer.Write(Types.Map[mapNum].Tile[X, Y].DirBlock);
                Application.DoEvents();
            }
        }

        // ****** Send Map SoundID ******
        for (X = 0; X <= MaxX - 1; X++)
        {
            for (Y = 0; Y <= MaxY - 1; Y++)
            {
                TempBuffer.Write(Types.Map[mapNum].SoundID[X, Y]);
            }
        }

        TempBuffer.Write(Types.Map[mapNum].Instanced);

        Types.MapCache[mapNum].Data = TempBuffer;
    }

Любая помощь, которая может быть оказана, будет принята с благодарностью. Если вы хотите, чтобы я предоставил больше информации, я могу это сделать.

0 ответов

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