No more 100% CPU use in GUI for real this time [SDL]. Hopefully fixed netplay - at least, the code makes sense now [Win, SDL].

This commit is contained in:
grinvader
2005-02-01 15:30:50 +00:00
parent cc66b807b9
commit 146dd7150f
5 changed files with 442 additions and 44 deletions

View File

@@ -111,9 +111,9 @@ EXTSYM acceptzuser
EXTSYM TCPIPAddress EXTSYM TCPIPAddress
EXTSYM ConnectServer EXTSYM ConnectServer
EXTSYM WaitForServer EXTSYM WaitForServer
EXTSYM SendData EXTSYM SendDataNop
EXTSYM SendDataUDP EXTSYM SendDataUDPNop
EXTSYM GetData EXTSYM GetDataNop
EXTSYM DeInitTCP EXTSYM DeInitTCP
EXTSYM StopServer EXTSYM StopServer
EXTSYM Disconnect EXTSYM Disconnect
@@ -1608,12 +1608,8 @@ NEWSYM TCPIPSendPacket
je .nopacket je .nopacket
pushad pushad
; Send PacketSendArray with size of PacketSendSize ; Send PacketSendArray with size of PacketSendSize
; SendData(int dsize,char *dptr) ; SendData(int [PacketSendSize],char *PacketSendArray)
mov eax,PacketSendArray call SendDataNop
push eax
mov eax,[PacketSendSize]
push eax
call SendData
or eax,eax or eax,eax
jnz .failed jnz .failed
add esp,8 add esp,8
@@ -1632,12 +1628,8 @@ NEWSYM TCPIPSendPacketUDP
je .nopacket je .nopacket
pushad pushad
; Send PacketSendArray with size of PacketSendSize ; Send PacketSendArray with size of PacketSendSize
; SendData(int dsize,char *dptr) ; SendData(int [PacketSendSize],char *PacketSendArray)
mov eax,PacketSendArray call SendDataUDPNop
push eax
mov eax,[PacketSendSize]
push eax
call SendDataUDP
or eax,eax or eax,eax
jnz .failed jnz .failed
add esp,8 add esp,8
@@ -1654,12 +1646,8 @@ NEWSYM TCPIPSendPacketUDP
NEWSYM TCPIPRecvPacket NEWSYM TCPIPRecvPacket
pushad pushad
; Store packet to PacketRecvArray, size at PacketRecvSize ; Store packet to PacketRecvArray, size at PacketRecvSize
; int GetData(int dsize,char *dptr) ; int GetData(int 2048,char *PacketRecvArray)
mov eax,PacketRecvArray call GetDataNop
push eax
mov eax,2048
push eax
call GetData
cmp eax,-1 cmp eax,-1
je .failed je .failed
mov [PacketRecvSize],eax mov [PacketRecvSize],eax

View File

@@ -756,9 +756,6 @@ void Start36HZ(void)
update_ticks_pc2 = UPDATE_TICKS_UDP; update_ticks_pc2 = UPDATE_TICKS_UDP;
update_ticks_pc = UPDATE_TICKS_GUI; update_ticks_pc = UPDATE_TICKS_GUI;
//Quick fix for GUI CPU usage
if (GUIOn2) usleep(1000);
start = sem_GetTicks(); start = sem_GetTicks();
start2 = sem_GetTicks(); start2 = sem_GetTicks();
T60HZEnabled = 0; T60HZEnabled = 0;
@@ -1048,6 +1045,9 @@ void UpdateVFrame(void)
const int SPCSize = 256; const int SPCSize = 256;
int i; int i;
//Quick fix for GUI CPU usage
if (GUIOn2) usleep(1000);
CheckTimers(); CheckTimers();
Main_Proc(); Main_Proc();

View File

@@ -949,6 +949,65 @@ int SendData(int dsize,unsigned char *dptr)
return(0); return(0);
} }
extern int PacketSendSize;
extern unsigned char PacketSendArray[2048+256];
int SendDataNop()
{
int retval, dsize=PacketSendSize;
unsigned char *dptr=PacketSendArray;
if (UDPEnable){
/* retval = sendto(ugamesocket,dptr,dsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0); */
if (((packetnum-packetnumhead) & 0xFF) >= 15){
// sprintf(message1,"Packet Overflow.");
// MessageBox (NULL, message1, "Init Error" , MB_ICONERROR );
// wait for receive packet, call JoyRead while waiting
while (((packetnum-packetnumhead) & 0xFF) >= 15){
PacketResend();
PacketReceive();
UpdateVFrame();
while ((packetconfirm[packetnumhead]) && (packetnum!=packetnumhead))
packetnumhead=(packetnumhead+1) & 0xFF;
}
}
CopyMemory(&(cpacketdata[2]),dptr,dsize);
CopyMemory(&(packetdata[2048*(packetnum & 0x0F)]),dptr,dsize);
packetsize[packetnum]=dsize;
packetconfirm[packetnum]=0;
cpacketdata[0]=1;
cpacketdata[1]=(char)packetnum;
retval = sendto(ugamesocket,cpacketdata,dsize+2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
packettimeleft[packetnum]=60;
if (dsize>512) packettimeleft[packetnum]=90;
packetresent[packetnum]=1;
packetnum=(packetnum+1) & 0xFF;
if (retval == SOCKET_ERROR)
{
closesocket(ugamesocket);
return(-1);
}
return(0);
}
/* send data with the socket */
retval = send(gamesocket,dptr,dsize,0);
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0);
}
/**********************************************************\ /**********************************************************\
* Send data UDP * * Send data UDP *
@@ -1088,6 +1147,93 @@ char SendBufferSize[256];*/
return(0); return(0);
} }
int SendDataUDPNop()
{
int retval,i;
int packetsize, dsize=PacketSendSize;
unsigned char *dptr=PacketSendArray;
// return (SendData(dsize,dptr));
if (UDPEnable){
/*int SendPtr;
char SendBuffer[256*32];
char SendBufferSize[256];*/
blahblahblah++;
packetsize = 0;
for (i=0;i<dsize;i++)
SendBuffer[SendPtr*32+i]=dptr[i];
SendBufferSize[SendPtr]=dsize;
if ((dsize == 2) && (dptr[0]<=1)){
if (SendRepeated < 32) SendRepeated++;
cpacketdata[0]=4;
cpacketdata[1]=dptr[1];
cpacketdata[2]=(char)SendPtr;
cpacketdata[3]=(char)SendPtr2;
cpacketdata[4]=(char)SendRepeated;
packetsize=5;
packetsize=AttachEnd(packetsize);
PrevSPacket[UDPBackTrace-2]=0;
SendPtr=(SendPtr+1) & 0xFF;
if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF;
retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
} else {
if (SendRepeated){
PrevSPacket[UDPBackTrace-2]=1;
PrevSSize[UDPBackTrace-2]=3;
PrevSData[(UDPBackTrace-2)*32]=0;
PrevSData[(UDPBackTrace-2)*32+1]=dptr[1];
PrevSData[(UDPBackTrace-2)*32+2]=SendRepeated;
PrevSPtr[UDPBackTrace-2]=(SendPtr-1) & 0xFF;
}
SendRepeated=0;
cpacketdata[0]=5;
cpacketdata[1]=dptr[1];
cpacketdata[2]=SendPtr;
cpacketdata[3]=SendPtr2;
cpacketdata[4]=dsize;
packetsize=5;
for (i=0;i<dsize;i++)
cpacketdata[i+5]=dptr[i];
packetsize+=dsize;
packetsize=AttachEnd(packetsize);
PrevSPacket[UDPBackTrace-2]=1;
PrevSSize[UDPBackTrace-2]=dsize;
for (i=0;i<dsize;i++)
PrevSData[(UDPBackTrace-2)*32+i]=dptr[i];
PrevSPtr[UDPBackTrace-2]=SendPtr;
SendPtr=(SendPtr+1) & 0xFF;
if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF;
retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
}
return(0);
}
/* send data with the socket */
retval = sendto(gamesocket,dptr,dsize,0,(struct sockaddr *) &ugameaddress,sizeof(struct sockaddr));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0);
}
/**********************************************************\ /**********************************************************\
* Get data left * * Get data left *
@@ -1188,6 +1334,70 @@ int GetData(int dsize,unsigned char *dptr)
return(retval); return(retval);
} }
extern unsigned char PacketRecvArray[2048+256];
int GetDataNop()
{
int retval,i;
int dataleft, dsize=2048;
unsigned char *dptr=PacketRecvArray;
retval=0;
// Temporary UDP routines
if (UDPEnable) {
PacketResend();
PacketReceive();
i=packetrecvhead;
if (packetreceived[i]){
CopyMemory(dptr,&(packetrdata[2048*(i & 0x0F)]),packetreceivesize[i]);
retval = packetreceivesize[i];
packetreceived[(i+128) & 0xFF]=0;
packetrecvhead=(packetrecvhead+1) & 0xFF;
return(retval);
}
i=RecvPtr;
if ((RecvFlags[i]) && (UDPMode2)){
CopyMemory(dptr,&(RecvBuffer[32*i]),RecvBufferSize[i]);
retval = RecvBufferSize[i];
RecvFlags[(i+128) & 0xFF]=0;
RecvPtr=(RecvPtr+1) & 0xFF;
if (!RecvPtr) RecvPtr2=(RecvPtr2+1) & 0xFF;
CounterA=90;
return(retval);
}
if ((CounterA==0) & (UDPMode2)){
// Send 16+RecvPtr
cpacketdata[0]=16;
cpacketdata[1]=RecvPtr;
sendto(ugamesocket,cpacketdata,2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
CounterA=90;
return(0);
}
return(0);
}
dataleft=GetLeft();
if(dataleft==0) return(0);
if(dataleft<dsize)
{
dsize=dataleft;
}
/* get data with the socket */
retval = recv(gamesocket,dptr,dsize,0);
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(retval);
}
void GetHostName() void GetHostName()
{ {

View File

@@ -123,9 +123,9 @@ EXTSYM acceptzuser
EXTSYM TCPIPAddress EXTSYM TCPIPAddress
EXTSYM ConnectServer EXTSYM ConnectServer
EXTSYM WaitForServer EXTSYM WaitForServer
EXTSYM SendData EXTSYM SendDataNop
EXTSYM SendDataUDP EXTSYM SendDataUDPNop
EXTSYM GetData EXTSYM GetDataNop
EXTSYM DeInitTCP EXTSYM DeInitTCP
EXTSYM StopServer EXTSYM StopServer
EXTSYM Disconnect EXTSYM Disconnect
@@ -1912,12 +1912,8 @@ NEWSYM TCPIPSendPacket
je .nopacket je .nopacket
pushad pushad
; Send PacketSendArray with size of PacketSendSize ; Send PacketSendArray with size of PacketSendSize
; SendData(int dsize,char *dptr) ; SendData(int [PacketSendSize],char *PacketSendArray)
mov eax,PacketSendArray call SendDataNop
push eax
mov eax,[PacketSendSize]
push eax
call SendData
or eax,eax or eax,eax
jnz .failed jnz .failed
add esp,8 add esp,8
@@ -1936,12 +1932,8 @@ NEWSYM TCPIPSendPacketUDP
je .nopacket je .nopacket
pushad pushad
; Send PacketSendArray with size of PacketSendSize ; Send PacketSendArray with size of PacketSendSize
; SendData(int dsize,char *dptr) ; SendData(int [PacketSendSize],char *PacketSendArray)
mov eax,PacketSendArray call SendDataUDPNop
push eax
mov eax,[PacketSendSize]
push eax
call SendDataUDP
or eax,eax or eax,eax
jnz .failed jnz .failed
add esp,8 add esp,8
@@ -1958,11 +1950,7 @@ NEWSYM TCPIPSendPacketUDP
NEWSYM TCPIPRecvPacket NEWSYM TCPIPRecvPacket
pushad pushad
; Store packet to PacketRecvArray, size at PacketRecvSize ; Store packet to PacketRecvArray, size at PacketRecvSize
; int GetData(int dsize,char *dptr) ; int GetData(int 2048,char *PacketRecvArray)
mov eax,PacketRecvArray
push eax
mov eax,2048
push eax
call GetData call GetData
cmp eax,-1 cmp eax,-1
je .failed je .failed

View File

@@ -881,6 +881,66 @@ int SendData(int dsize,unsigned char *dptr)
return(0); return(0);
} }
extern int PacketSendSize;
extern unsigned char PacketSendArray[2048+256];
int SendDataNop()
{
int retval, dsize=PacketSendSize;
unsigned char *dptr=PacketSendArray;
//MK: unused 2003/08/31
//char message1[256];
if (UDPEnable){
/* retval = sendto(ugamesocket,dptr,dsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0); */
if (((packetnum-packetnumhead) & 0xFF) >= 15){
// sprintf(message1,"Packet Overflow.");
// MessageBox (NULL, message1, "Init Error" , MB_ICONERROR );
// wait for receive packet, call JoyRead while waiting
while (((packetnum-packetnumhead) & 0xFF) >= 15){
PacketResend();
PacketReceive();
UpdateVFrame();
while ((packetconfirm[packetnumhead]) && (packetnum!=packetnumhead))
packetnumhead=(packetnumhead+1) & 0xFF;
}
}
CopyMemory(&(cpacketdata[2]),dptr,dsize);
CopyMemory(&(packetdata[2048*(packetnum & 0x0F)]),dptr,dsize);
packetsize[packetnum]=dsize;
packetconfirm[packetnum]=0;
cpacketdata[0]=1;
cpacketdata[1]=(char)packetnum;
retval = sendto(ugamesocket,cpacketdata,dsize+2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
packettimeleft[packetnum]=60;
if (dsize>512) packettimeleft[packetnum]=90;
packetresent[packetnum]=1;
packetnum=(packetnum+1) & 0xFF;
if (retval == SOCKET_ERROR)
{
closesocket(ugamesocket);
return(-1);
}
return(0);
}
/* send data with the socket */
retval = send(gamesocket,dptr,dsize,0);
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0);
}
/**********************************************************\ /**********************************************************\
* Send data UDP * * Send data UDP *
@@ -938,6 +998,94 @@ int SendDataUDP(int dsize,unsigned char *dptr)
// return (SendData(dsize,dptr));
if (UDPEnable){
/*int SendPtr;
char SendBuffer[256*32];
char SendBufferSize[256];*/
blahblahblah++;
packetsize = 0;
for (i=0;i<dsize;i++)
SendBuffer[SendPtr*32+i]=dptr[i];
SendBufferSize[SendPtr]=dsize;
if ((dsize == 2) && (dptr[0]<=1)){
if (SendRepeated < 32) SendRepeated++;
cpacketdata[0]=4;
cpacketdata[1]=dptr[1];
cpacketdata[2]=(char)SendPtr;
cpacketdata[3]=(char)SendPtr2;
cpacketdata[4]=(char)SendRepeated;
packetsize=5;
packetsize=AttachEnd(packetsize);
PrevSPacket[UDPBackTrace-2]=0;
SendPtr=(SendPtr+1) & 0xFF;
if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF;
retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
} else {
if (SendRepeated){
PrevSPacket[UDPBackTrace-2]=1;
PrevSSize[UDPBackTrace-2]=3;
PrevSData[(UDPBackTrace-2)*32]=0;
PrevSData[(UDPBackTrace-2)*32+1]=dptr[1];
PrevSData[(UDPBackTrace-2)*32+2]=SendRepeated;
PrevSPtr[UDPBackTrace-2]=(SendPtr-1) & 0xFF;
}
SendRepeated=0;
cpacketdata[0]=5;
cpacketdata[1]=dptr[1];
cpacketdata[2]=SendPtr;
cpacketdata[3]=SendPtr2;
cpacketdata[4]=dsize;
packetsize=5;
for (i=0;i<dsize;i++)
cpacketdata[i+5]=dptr[i];
packetsize+=dsize;
packetsize=AttachEnd(packetsize);
PrevSPacket[UDPBackTrace-2]=1;
PrevSSize[UDPBackTrace-2]=dsize;
for (i=0;i<dsize;i++)
PrevSData[(UDPBackTrace-2)*32+i]=dptr[i];
PrevSPtr[UDPBackTrace-2]=SendPtr;
SendPtr=(SendPtr+1) & 0xFF;
if (!SendPtr) SendPtr2=(SendPtr2+1) & 0xFF;
retval = sendto(ugamesocket,cpacketdata,packetsize,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
}
return(0);
}
/* send data with the socket */
retval = sendto(gamesocket,dptr,dsize,0,(struct sockaddr *) &ugameaddress,sizeof(struct sockaddr));
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(0);
}
int SendDataUDPNop()
{
int retval,i;
int packetsize, dsize=PacketSendSize;
unsigned char *dptr=PacketSendArray;
// return (SendData(dsize,dptr)); // return (SendData(dsize,dptr));
if (UDPEnable){ if (UDPEnable){
@@ -1139,6 +1287,70 @@ int GetData(int dsize,unsigned char *dptr)
return(retval); return(retval);
} }
extern unsigned char PacketRecvArray[2048+256];
int GetData()
{
int retval,i;
int dataleft, dsize=2048;
unsigned char *dptr=PacketRecvArray;
retval=0;
// Temporary UDP routines
if (UDPEnable) {
PacketResend();
PacketReceive();
i=packetrecvhead;
if (packetreceived[i]){
CopyMemory(dptr,&(packetrdata[2048*(i & 0x0F)]),packetreceivesize[i]);
retval = packetreceivesize[i];
packetreceived[(i+128) & 0xFF]=0;
packetrecvhead=(packetrecvhead+1) & 0xFF;
return(retval);
}
i=RecvPtr;
if ((RecvFlags[i]) && (UDPMode2)){
CopyMemory(dptr,&(RecvBuffer[32*i]),RecvBufferSize[i]);
retval = RecvBufferSize[i];
RecvFlags[(i+128) & 0xFF]=0;
RecvPtr=(RecvPtr+1) & 0xFF;
if (!RecvPtr) RecvPtr2=(RecvPtr2+1) & 0xFF;
CounterA=90;
return(retval);
}
if ((CounterA==0) & (UDPMode2)){
// Send 16+RecvPtr
cpacketdata[0]=16;
cpacketdata[1]=RecvPtr;
sendto(ugamesocket,cpacketdata,2,0,(struct sockaddr *)&ugameaddress,sizeof(ugameaddress));
CounterA=90;
return(0);
}
return(0);
}
dataleft=GetLeft();
if(dataleft==0) return(0);
if(dataleft<dsize)
{
dsize=dataleft;
}
/* get data with the socket */
retval = recv(gamesocket,dptr,dsize,0);
if (retval == SOCKET_ERROR)
{
closesocket(gamesocket);
return(-1);
}
return(retval);
}
void GetHostName() void GetHostName()
{ {