我目前正在开发一款基于C#2D沙盒的游戏。游戏世界充满了瓷砖/块。由于世界如此之大,游戏有时可以使用超过32位应用程序所允许的范围。
我的图块由结构中的以下数据组成:
public byte type;
public byte typeWall;
public byte liquid;
public byte typeLiquid;
public byte frameX;
public byte frameY;
public byte frameWallX;
public byte frameWallY;
我希望将所有这些数据封装在一个“长”(64位整数)中。
我希望使用位移来获取和设置每个数据的属性...(我从未这样做过)。
这会节省空间吗?它会提高处理速度吗?如果是这样,怎么办呢?
感谢。
答案 0 :(得分:0)
我不知道你为什么要这样做,但你可以这样做:
byte type = 4;
byte typeWall = 45;
byte liquid = 45;
byte typeLiquid = 234;
byte frameX = 23;
byte frameY = 23;
byte frameWallX = 22;
byte frameWallY = 221;
byte[] bytes = new [] {type, typeWall, liquid, typeLiquid, frameX, frameY, frameWallX, frameWallY};
BitConverter.ToInt64(bytes, 0);
或使用<<
(shift)运算符。
答案 1 :(得分:0)
我希望将所有这些数据封装在一个“长”(64位整数)中。
您可以将StructLayoutAttribute
与LayoutKind.Explicit
一起使用,然后用FieldOffsetAttribute
指定确切位置的字段。
我希望使用位移来获取和设置每个数据的属性...(我从未这样做过)。
然后使用左移(<<
),右移(>>
)和屏蔽(和&&
提取/或||
写(不要忘记目标字节中的任何非零位))0xff
用于分隔各个字节。阅读有关按位运算的更多信息here。
这会节省空间吗?它会提高处理速度吗?
你测量过了吗?您是否发现了性能/内存消耗问题?如果是,请进行优化。如果没有,请不要premature optimizations。换句话说,不要在没有先测量的情况下盲目尝试。
答案 2 :(得分:0)
通过将以下代码粘贴到linqpad中可以看到:
void Main()
{
sizeof(byte).Dump("byte size");
sizeof(Int32).Dump("int 32");
sizeof(Int64).Dump("int 64");
sizeof(char).Dump("for good measure, a char:");
}
你会得到:
byte size 1
int 32 4
int 64 8
for good measure, a char: 2
因此在int64中打包8个字节是相同的,但是你必须自己玩这些位(如果这是你的事情,那么一定要去吧:)