效果并不是很理想,unreal客户端上的效果一卡一卡的
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdint>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <unordered_map>
#include <unistd.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include "GameMessage.pb.h"
#define IMPORT_USER
#include "User.h"
const int MaxClient = 128;
const int MaxEvents = 256;
const int MaxMessageQueue = 1024;
int ClientCount = 0;
bool isBegin = false;
//客户端号与fd对应
std::unordered_map<int, int> FdToClientID;
int ClientIDToFd[MaxClient];
bool isClientLogin[MaxClient];
uint8_t Buffer[MaxClient][1024];
uint8_t Size[MaxClient];
uint8_t MessageType[MaxClient];
uint8_t MessageLen[MaxClient];
uint32_t NowLoginCount = 0;
int iFrameCount = 0;
int iQueueLen = 0;
uint8_t BufferFrameQueue[MaxMessageQueue][1024];
int BufferEffectiveSize[MaxMessageQueue];
enum class MType
{
LoginRequest = 1,
LoginRespond = 2,
GameBegin = 3,
ActionRequest = 4,
PlayerAction = 5,
MoveRequest = 6,
PlayerMove = 7
};
inline void Init()
{
InitUserInfo();
memset(Size, 0, sizeof(Size));
memset(MessageType, 0, sizeof(MessageType));
memset(MessageLen, 0, sizeof(MessageLen));
memset(isClientLogin, false, sizeof(isClientLogin));
memset(ClientIDToFd, -1, sizeof(ClientIDToFd));
iFrameCount = 0;
iQueueLen = 0;
printf("Init Done\n");
}
inline void SendAll(int i, uint32_t SumLen)
{
for (int ID = 1; ID <= ClientCount; ID += 1)
{
if (ClientIDToFd[ID] < 0)
{
continue;
}
if (isClientLogin[ID]) // DANGER
{
send(ClientIDToFd[ID], Buffer[i], SumLen, 0);
}
}
}
inline void FrameQueue_SendAllMessages()
{
if(iQueueLen == 0)
{
//处理没有消息的时候
}
for (int i = 0; i < iQueueLen; i++)
{
for (int ID = 1; ID <= ClientCount; ID += 1