我正在设计一款基于多人游戏的RTS平铺游戏,所有游戏逻辑都由服务器处理(用C语言编写),客户端在Unity中制作,以便于跨平台部署。
我正在设计一个将通过TCP发送的自定义协议我的问题是从效率角度而不是数据大小POV(权衡),我最好使用按位运算符来确定用户尝试采取的操作或者我应该只使用char(byte)并将int值提供给switch语句?还是我还缺少另一种更有效的方式?
如果我按位路由它将是2个字节长并且基本上被读取为位数组,其中2个字节中'1'的位置将决定将采取什么操作以及数据包的其余部分应该如何被阅读。 例如
for (int i = 0; i < sizeof(unsigned short); ++i)
{
if((pkt & 1) > 0)
{
/* call correct function for bit at index 'i' with
remaining packet data (minus these 2 header bytes) */
}
pkt >> 1;
}
或者我应该采用更简洁的读取方式,假设有一个字节数组或char *:
char val = pkt[0]
switch (val)
{
case 65:
/* call relevant function */
break;
case 66:
/* call relevant function */
break;
}
这些例子假设我已经读过前4个字节中收到的数据的大小
我非常感谢您对我应该走哪条路线的任何见解!
答案 0 :(得分:3)
跳转表可能是最快的:
/* declaration of action functions */
int action1(char *data);
int action2(char *data);
int action3(char *data);
int action4(char *data);
int action5(char *data);
/* Filler */
int nop(char *data) { return 0; }
/* declare jumptable action as an array of function pointers of suitable type */
int (*action[])(char*) = { action1, action2, action3, action4, action5, nop, nop, nop };
/* Call function */
char val = pkt[0] & 0x07;
result = (action[val])(pkt+2);
答案 1 :(得分:0)
对于按位,您可以进一步思考:
select * from Customers
where CustomerID>10 and CustomerID<20 in
(select * from Customers where City in
('Paris','Berlin','Mannheim','London');
...所以你再次拥有你的开关。最好给编译器留下优化。