我一直在谷歌寻找我的问题的答案,希望有人在这里可以阐明整个事情。
好的,所以,我正在开发2D在线角色扮演游戏(角色扮演游戏。想想最终幻想,但在线)。我已经工作了一段时间,但我遇到了一些问题。现在,我并非100%确定压缩会解决问题,或者只是循环过大。
注意:我使用的是Lidgren Networking库。对其他选项持开放态度,因为Lidgren不支持压缩。
有关我尝试做什么的一些信息:
我试图发送包含地图所有信息的数据包。地图越小,数据包越快,但当我尝试发送250x250地图(自上而下,基于地块)时,需要几分钟才能完成。
我有2个理论。一个是它花了一段时间,因为地图的大小非常大(大约5MB),另一个是地图太大了,循环本身需要一段时间。
这些映射包含字符串,字节,int32,int16等。我有一个需要字节数组的压缩方法,但不能100%确定如何将所有数据转换为字节数组(I'现在,我只与C#合作了一年多一点,而且我完全是自学成才。
循环非常大,所有事情都考虑在内。有4个图块层,所有图块都需要循环。这就是让我相信循环可能是问题的原因。启动服务器时,它会缓存所有映射(意味着它会在需要之前构建数据包),因此在客户端需要时发送映射时似乎不会出现问题。说实话,这很快。
但是当您编辑地图并将其发送保存时,它可能需要相当长的时间才能将数据包发送到服务器并且服务器将更新的地图数据包发送回当前登录的所有客户端并站在那张地图上。说实话,有点太多时间了。我想也许压缩数据包会有所帮助,但正如我所说,我并不是百分之百确定这是问题所在。
以下是正在使用的循环:
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;
}
我们将非常感谢您提供的任何帮助。如果您需要我提供更多信息,我可以这样做。