Не уверен, что нужно сжимать данные или слишком большой цикл
Я был по всему 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;
}
Любая помощь, которая может быть оказана, будет принята с благодарностью. Если вы хотите, чтобы я предоставил больше информации, я могу это сделать.