3

我一直在谷歌上寻找我的问题的答案,希望这里的人可以对整个事情有所了解。

好的,所以,我正在开发 2D 在线 RPG(角色扮演游戏。想想最终幻想,但在线)。我一直在研究它一段时间,但我遇到了一些问题。现在,我不能 100% 确定压缩是否能解决问题,或者只是循环太大。

注意:我使用的是 Lidgren Networking 库。对其他选项的建议持开放态度,因为 Lidgren 不支持压缩。

关于我正在尝试做的一些信息:

我正在尝试发送一个包含地图所有信息的数据包。地图越小,数据包越快,但是当我尝试发送 250x250 地图(自上而下,基于图块)时,需要几分钟时间。

我对此有两种理论。一个是它需要一段时间,因为此时地图的大小非常大(大约 5MB),另一个是地图太大,循环本身需要一段时间。

这些映射包含字符串、字节、int32s、int16s 等。我有一个需要字节数组的压缩方法,但不能 100% 确定如何将所有数据转换为字节数组(我一直在使用C# 一年多一点,现在,我完全是自学的)。

考虑到所有因素,循环非常大。有 4 个 tile 层,所有这些都需要循环通过。这就是让我相信循环可能是问题的原因。启动服务器时,它会缓存所有地图(这意味着它会在需要之前构建数据包),因此在客户端需要地图时发送地图似乎不是问题。老实说,这很快。

但是当您编辑地图并将其发送以保存时,它可能需要相当长的时间才能将数据包发送到服务器,服务器将更新的地图数据包发送回当前登录并站立的所有客户端那张地图。老实说,时间有点多。我想也许压缩数据包会有所帮助,但正如我所说,我不是 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;
    }

任何可以提供的帮助将不胜感激。如果您需要我提供更多信息,我可以做到。

4

0 回答 0