[] Quake III |
renderer.lib
quake3.exe
:q3vis.exe
PVS ( ) . PVS bsp, .q3light.exe
bsp.q3light.exe
:r_smp
. Producer-Consumer. r_smp
1, , . ( Main thread ( )), , ( Renderer thread ( )).[1 A_on32bits 1 B_on32bits 1 B_on32bits 1 C_on32bits]
.[0 1 32bitsNewValue 0 0]
. netField_t
: typedef struct {
char *name;
int offset;
int bits;
} netField_t;
// ...
#define NETF(x) #x,(int)&((entityState_t*)0)->x
netField_t entityStateFields[] =
{
{ NETF(pos.trTime), 32 },
{ NETF(pos.trBase[0]), 0 },
{ NETF(pos.trBase[1]), 0 },
...
}
MSG_WriteDeltaEntity
snapshot.c. Quake3 , : , entityStateFields
.Netchan_Transmit
), , UDP 65507 . , (MTU) 1500 . , :cgame
: . , renderer.lib
.q3_ui
: . .game
: , bot.lib
.quake3.exe
- Visual Studio, - :text
, data
bss
.q3asm.exe
.qvm. , ( , , ). q3asm.exe
.quake3.exe
x86 ( ). extern int variableA;
int variableB;
int variableC=0;
int fooFunction(char* string){
return variableA + strlen(string);
}
module.c
lcc.exe
, Windows PE . .obj LCC, C: data
export variableC
align 4
LABELV variableC
byte 4 0
export fooFunction
code
proc fooFunction 4 4
ADDRFP4 0
INDIRP4
ARGP4
ADDRLP4 0
ADDRGP4 strlen
CALLI4
ASGNI4
ARGP4 variableA
INDIRI4
ADDRLP4 0
INDIRI4
ADDI4
RETI4
LABELV $1
endproc fooFunction 4 4
import strlen
bss
export variableB
align 4
LABELV variableB
skip 4
import variableA
text
, data
bss
): bss
( ), data
( ) code
( text
)proc
, endproc
.ARGP4
, ADDRGP4
, CALLI4
...). .import strlen
, q3asm.exe, C, strlen
.q3asm.exe
LCC .qvm:vmMain
, . , 0x2D
-.VM_Call( vm_t *vm, int callnum, ... )
.VMCall
11 4- - (vm_t *vm
) 0x00 0x26.VMCall
0x2A.q3asm.exe
vmMain
).vmMain
-.VM_CallInterpreted
).CALLI4
, int.int (*systemCall)( int *parms )
).systemCall
, quake3.exe. , . , . Quake III, , . .
, . , , , . .
, , . , , . . 1999 , .
bot.lib
: