mirror of
https://github.com/overte-org/overte.git
synced 2025-07-10 16:18:37 +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;
|
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) {
|
void attachAvatarDataToAgent(Agent *newAgent) {
|
||||||
if (newAgent->getLinkedData() == NULL) {
|
if (newAgent->getLinkedData() == NULL) {
|
||||||
newAgent->setLinkedData(new AvatarAgentData());
|
newAgent->setLinkedData(new AvatarAgentData());
|
||||||
|
@ -108,9 +72,6 @@ int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
|
|
||||||
pthread_t sendAvatarDataThread;
|
|
||||||
pthread_create(&sendAvatarDataThread, NULL, sendAvatarData, NULL);
|
|
||||||
|
|
||||||
agentList.linkedDataCreateCallback = attachAvatarDataToAgent;
|
agentList.linkedDataCreateCallback = attachAvatarDataToAgent;
|
||||||
|
|
||||||
agentList.startDomainServerCheckInThread();
|
agentList.startDomainServerCheckInThread();
|
||||||
|
@ -120,6 +81,12 @@ int main(int argc, char* argv[])
|
||||||
sockaddr *agentAddress = new sockaddr;
|
sockaddr *agentAddress = new sockaddr;
|
||||||
char *packetData = new char[MAX_PACKET_SIZE];
|
char *packetData = new char[MAX_PACKET_SIZE];
|
||||||
ssize_t receivedBytes = 0;
|
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) {
|
while (true) {
|
||||||
if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) {
|
if (agentList.getAgentSocket().receive(agentAddress, packetData, &receivedBytes)) {
|
||||||
|
@ -127,6 +94,28 @@ int main(int argc, char* argv[])
|
||||||
case PACKET_HEADER_HEAD_DATA:
|
case PACKET_HEADER_HEAD_DATA:
|
||||||
// this is positional data from an agent
|
// this is positional data from an agent
|
||||||
agentList.updateAgentWithData(agentAddress, (void *)packetData, receivedBytes);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
// hand this off to the AgentList
|
// hand this off to the AgentList
|
||||||
|
@ -140,6 +129,5 @@ int main(int argc, char* argv[])
|
||||||
agentList.stopSilentAgentRemovalThread();
|
agentList.stopSilentAgentRemovalThread();
|
||||||
agentList.stopPingUnknownAgentsThread();
|
agentList.stopPingUnknownAgentsThread();
|
||||||
|
|
||||||
pthread_join(sendAvatarDataThread, NULL);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue