History

Added toggle for nonblocking networking; default to threaded for now, since we're seeing lower frame rates.

Andrzej Kapolka committed 13 years ago

Commit c26becf1 parent 18043571 file · +56 −25Browse files

Showing the changes to interface/src/main.cpp (1 of 1 file). Show all

Unified · Split

interface/src/main.cpp+56−25
@@ -39,6 +39,8 @@ · 38 unmodified lines
3939 #include <ifaddrs.h>
4040 #endif
4141
42+#include <pthread.h>
43+
4244 #include <glm/glm.hpp>
4345 #include <glm/gtc/matrix_transform.hpp>
4446 #include <glm/gtc/type_ptr.hpp>
@@ -85,6 +87,10 @@ using namespace std; · 40 unmodified lines
8587 void reshape(int width, int height); // will be defined below
8688 void loadViewFrustum(ViewFrustum& viewFrustum); // will be defined below
8789
90+bool enableNetworkThread = true;
91+pthread_t networkReceiveThread;
92+bool stopNetworkReceiveThread = false;
93+
8894 unsigned char incomingPacket[MAX_PACKET_SIZE];
8995 int packetCount = 0;
9096 int packetsPerSecond = 0;
@@ -416,6 +422,11 @@ void terminate () { · 325 unmodified lines
416422 audio.terminate();
417423 #endif
418424
425+ if (enableNetworkThread) {
426+ stopNetworkReceiveThread = true;
427+ pthread_join(networkReceiveThread, NULL);
428+ }
429+
419430 exit(EXIT_SUCCESS);
420431 }
421432
@@ -1474,34 +1485,43 @@ void key(unsigned char k, int x, int y) · 1052 unmodified lines
14741485 }
14751486
14761487 // Receive packets from other agents/servers and decide what to do with them!
1477−void networkReceive()
1488+void* networkReceive(void* args)
14781489 {
14791490 sockaddr senderAddress;
14801491 ssize_t bytesReceived;
1481−
1482− while (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) {
1483− packetCount++;
1484− bytesCount += bytesReceived;
1485−
1486− switch (incomingPacket[0]) {
1487− case PACKET_HEADER_TRANSMITTER_DATA:
1488− myAvatar.processTransmitterData(incomingPacket, bytesReceived);
1489− break;
1490− case PACKET_HEADER_VOXEL_DATA:
1491− case PACKET_HEADER_Z_COMMAND:
1492− case PACKET_HEADER_ERASE_VOXEL:
1493− voxels.parseData(incomingPacket, bytesReceived);
1494− break;
1495− case PACKET_HEADER_BULK_AVATAR_DATA:
1496− AgentList::getInstance()->processBulkAgentData(&senderAddress,
1497− incomingPacket,
1498− bytesReceived);
1499− break;
1500− default:
1501− AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived);
1502− break;
1492+
1493+ while (!stopNetworkReceiveThread) {
1494+ if (AgentList::getInstance()->getAgentSocket().receive(&senderAddress, incomingPacket, &bytesReceived)) {
1495+ packetCount++;
1496+ bytesCount += bytesReceived;
1497+
1498+ switch (incomingPacket[0]) {
1499+ case PACKET_HEADER_TRANSMITTER_DATA:
1500+ myAvatar.processTransmitterData(incomingPacket, bytesReceived);
1501+ break;
1502+ case PACKET_HEADER_VOXEL_DATA:
1503+ case PACKET_HEADER_Z_COMMAND:
1504+ case PACKET_HEADER_ERASE_VOXEL:
1505+ voxels.parseData(incomingPacket, bytesReceived);
1506+ break;
1507+ case PACKET_HEADER_BULK_AVATAR_DATA:
1508+ AgentList::getInstance()->processBulkAgentData(&senderAddress,
1509+ incomingPacket,
1510+ bytesReceived);
1511+ break;
1512+ default:
1513+ AgentList::getInstance()->processAgentData(&senderAddress, incomingPacket, bytesReceived);
1514+ break;
1515+ }
1516+ } else if (!enableNetworkThread) {
1517+ break;
15031518 }
15041519 }
1520+
1521+ if (enableNetworkThread) {
1522+ pthread_exit(0);
1523+ }
1524+ return NULL;
15051525 }
15061526
15071527 void idle(void) {
@@ -1536,7 +1556,9 @@ void idle(void) { · 28 unmodified lines
15361556 updateAvatar(deltaTime);
15371557
15381558 // read incoming packets from network
1539− networkReceive();
1559+ if (!enableNetworkThread) {
1560+ networkReceive(0);
1561+ }
15401562
15411563 //loop through all the other avatars and simulate them...
15421564 AgentList* agentList = AgentList::getInstance();
@@ -1680,7 +1702,10 @@ int main(int argc, const char * argv[]) · 137 unmodified lines
16801702 listenPort = atoi(portStr);
16811703 }
16821704 AgentList::createInstance(AGENT_TYPE_AVATAR, listenPort);
1683− AgentList::getInstance()->getAgentSocket().setBlocking(false);
1705+ enableNetworkThread = !cmdOptionExists(argc, argv, "--nonblocking");
1706+ if (!enableNetworkThread) {
1707+ AgentList::getInstance()->getAgentSocket().setBlocking(false);
1708+ }
16841709
16851710 gettimeofday(&applicationStartupTime, NULL);
16861711 const char* domainIP = getCmdOption(argc, argv, "--domain");
@@ -1763,6 +1788,12 @@ int main(int argc, const char * argv[]) · 76 unmodified lines
17631788 printLog("Local Voxel File loaded.\n");
17641789 }
17651790
1791+ // create thread for receipt of data via UDP
1792+ if (enableNetworkThread) {
1793+ pthread_create(&networkReceiveThread, NULL, networkReceive, NULL);
1794+ printLog("Network receive thread created.\n");
1795+ }
1796+
17661797 glutTimerFunc(1000, Timer, 0);
17671798 glutMainLoop();
17681799