mirror of
https://github.com/overte-org/overte.git
synced 2025-04-22 03:04:33 +02:00
have avatar mixer reply with bulk packet immediately on receive
This commit is contained in:
parent
3823809497
commit
bdde66fec8
1 changed files with 28 additions and 40 deletions
|
@ -62,42 +62,6 @@ unsigned char *addAgentToBroadcastPacket(unsigned char *currentPosition, Agent *
|
|||
return currentPosition;
|
||||
}
|
||||
|
||||
void *sendAvatarData(void *args) {
|
||||
timeval startTime;
|
||||
|
||||
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
|
||||
*broadcastPacket = PACKET_HEADER_AVATAR_SERVER;
|
||||
|
||||
unsigned char* currentBufferPosition = NULL;
|
||||
|
||||
while (true) {
|
||||
gettimeofday(&startTime, NULL);
|
||||
|
||||
currentBufferPosition = broadcastPacket + 1;
|
||||
|
||||
for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin();
|
||||
avatarAgent != agentList.getAgents().end();
|
||||
avatarAgent++) {
|
||||
if (avatarAgent->getLinkedData() != NULL) {
|
||||
currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
|
||||
}
|
||||
}
|
||||
|
||||
for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin();
|
||||
avatarAgent != agentList.getAgents().end();
|
||||
avatarAgent++) {
|
||||
if (avatarAgent->getActiveSocket()) {
|
||||
agentList.getAgentSocket().send(avatarAgent->getPublicSocket(),
|
||||
broadcastPacket,
|
||||
currentBufferPosition - broadcastPacket);
|
||||
}
|
||||
}
|
||||
|
||||
double usecToSleep = BROADCAST_INTERVAL_USECS - (usecTimestampNow() - usecTimestamp(&startTime));
|
||||
usleep(usecToSleep);
|
||||
}
|
||||
}
|
||||
|
||||
void attachAvatarDataToAgent(Agent *newAgent) {
|
||||
if (newAgent->getLinkedData() == NULL) {
|
||||
newAgent->setLinkedData(new AvatarAgentData());
|
||||
|
@ -108,9 +72,6 @@ int main(int argc, char* argv[])
|
|||
{
|
||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||
|
||||
pthread_t sendAvatarDataThread;
|
||||
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
|
||||
|
||||
agentList.linkedDataCreateCallback = attachAvatarDataToAgent;
|
||||
|
||||
agentList.startDomainServerCheckInThread();
|
||||
|
@ -120,6 +81,12 @@ int main(int argc, char* argv[])
|
|||
sockaddr *agentAddress = new sockaddr;
|
||||
char *packetData = new char[MAX_PACKET_SIZE];
|
||||
ssize_t receivedBytes = 0;
|
||||
|
||||
unsigned char *broadcastPacket = new unsigned char[MAX_PACKET_SIZE];
|
||||
*broadcastPacket = PACKET_HEADER_AVATAR_SERVER;
|
||||
|
||||
unsigned char* currentBufferPosition = NULL;
|
||||
int agentIndex = 0;
|
||||
|
||||
while (true) {
|
||||
if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) {
|
||||
|
@ -127,6 +94,28 @@ int main(int argc, char* argv[])
|
|||
case PACKET_HEADER_HEAD_DATA:
|
||||
// this is positional data from an agent
|
||||
agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes);
|
||||
|
||||
currentBufferPosition = broadcastPacket + 1;
|
||||
agentIndex = 0;
|
||||
|
||||
// send back a packet with other active agent data to this agent
|
||||
for (std::vector<Agent>::iterator avatarAgent = agentList.getAgents().begin();
|
||||
avatarAgent != agentList.getAgents().end();
|
||||
avatarAgent++) {
|
||||
if (avatarAgent->getLinkedData() != NULL
|
||||
&& agentIndex != agentList.indexOfMatchingAgent(agentAddress)) {
|
||||
currentBufferPosition = addAgentToBroadcastPacket(currentBufferPosition, &*avatarAgent);
|
||||
}
|
||||
|
||||
agentIndex++;
|
||||
}
|
||||
|
||||
if (currentBufferPosition - broadcastPacket > 1) {
|
||||
agentList.getAgentSocket().send(agentAddress,
|
||||
broadcastPacket,
|
||||
currentBufferPosition - broadcastPacket);
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
// hand this off to the AgentList
|
||||
|
@ -140,6 +129,5 @@ int main(int argc, char* argv[])
|
|||
agentList.stopSilentAgentRemovalThread();
|
||||
agentList.stopPingUnknownAgentsThread();
|
||||
|
||||
pthread_join(sendAvatarDataThread, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue