-

   rss_rss_hh_new

 - e-mail

 

 -

 LiveInternet.ru:
: 17.03.2011
:
:
: 51

:


[] Quake III

, 19 2017 . 09:41 +
image

[ : , - .]

Quake III


Quake III Quake II : / , :

  • , OpenGL 1.X. 1999 . , .
  • : - OpenGL .


renderer.lib quake3.exe:



Quake Classic: BSP/PVS/ :

  • :
    1. QRadiant .map .
    2. q3bsp.exe (BSP). Quake1.
    3. BSP : Doom3 Dmap.
    4. q3vis.exe PVS ( ) . PVS bsp, .
    5. .
    6. q3light.exe bsp.
    7. (PVS ) .bsp.
  • :
    1. bsp.
    2. :
    3. PVS , .
    4. .

, :

, /:



, q3light.exe:



:



(Brian Hook) Game Developer Conference 1999 . , GDC Vault ! [ youtube.]


OpenGL 1.X, . , . Quake 3 Shader bible:


SMP ( )


, Quake III Arena SMP cvariable r_smp. Producer-Consumer. r_smp 1, , . ( Main thread ( )), , ( Renderer thread ( )).

, :

t0-t1:
  • Main thread , , surfacebuffer1.
  • Renderer thread , .
  • GPU thread .



t1-t2: :
  • Main thread , . surfacebuffer2: .
  • , Renderer thread OpenGL , GPU thread .
  • GPU thread , Renderer thread.

, t2:
  • Renderer thread GPU: SurfaceBuffer1.
  • Main thread SurfaceBuffer2 SurfaceBuffer1:

( Renderer thread Main thread) Quake III:
OpenGL API.



t2:
  • Renderer thread SurfaceBuffer1 (t3), SurfaceBuffer2.
  • ( t3), Main thread , SurfaceBuffer1.
  • GPU .



: Windows Event Objects winglimp.c ( SMP ).


Quake3 , , . Quake III - NetChannel, Quake World. , :

, , , .

UDP/IP: TCP/IP, . :
  • .
  • .



, UDP UDP: - .


: . , UDP. :



  • Master Gamestate , . Netchannel. event_t, .
  • 32 , : . , Quake World Network ( ).
  • , 0. -, .

, , , NetChannel.

: : , 8 .


, :
  • Client1.
  • , , Client2 ( position[X], position[Y], position[Z] ).
  • UDP/IP: .

1 :

. ( ). Client1:



, :
  1. .
  2. .

.

  1. (Master gamestate) 0 Client1: Snapshot1.
  2. , Client1 , Dummy snapshot, . , NetChannel.



, , - . , 132 ( ): [1 A_on32bits 1 B_on32bits 1 B_on32bits 1 C_on32bits].

2 :
: . , , Master gamestate: Client2 Y, pos[1] E ( ). Client1 , , , , Snapshot1 (ACK):



:

  1. : ( 1): Snapshot2
  2. (snapshot1).

(pos[1] = E ). : .



: (1=, 0= ), 36 : [0 1 32bitsNewValue 0 0].

3 :
, , . 3. .
Client2 H. Client1 . , UDP , , ACK , .



, :
  1. : ( 2): Snapshot3
  2. (snapshot1).



, : (pos[1]=E health=H). , snapshot1 . , .

. :

  • .
  • , , .

C


Quake3 C .

: 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 .


, , NetChannel 1400 (Netchan_Transmit), , UDP 65507 . , (MTU) 1500 . , :

  • , .
  • , , .


UDP, (, , ).

NetChannel: .


, , .

Unlagged haste (Neil haste Toronto) .


, idtech3 . :

  • .
  • .

, : / Quake1 DLL Quake2. - x86.

: -, . x86 . .plan 16 1999 , .


Quake III QVM. :



  • : . :
    • cgame: . , renderer.lib.
    • q3_ui: . .

  • :
    • game: , bot.lib .

QVM


QVM, , -. , :



quake3.exe - Visual Studio, - :

  1. .c ( ) LCC.
  2. LCC , PE (Windows Portable Executable), , . text, data bss .
  3. id Software q3asm.exe .qvm. , ( , , ). q3asm.exe .
  4. - quake3.exe x86 ( ).

LCC


, , :

    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.
  • LCC : .
  • LCC , / /.
  • (, ARGP4, ADDRGP4, CALLI4...). .
  • , . , import strlen, q3asm.exe, C, strlen .

.c .

q3asm.exe


q3asm.exe LCC .qvm:



:

  • q3asm / .
  • . syscall . , .
  • q3asm , , .
  • vmMain, . , 0x2D -.

QVM:


, , :



:

(Quake3 -> ) :

  • Quake3 VM_Call( vm_t *vm, int callnum, ... ).
  • VMCall 11 4- - (vm_t *vm) 0x00 0x26.
  • VMCall 0x2A.
  • 0x2D ( q3asm.exe vmMain).
  • vmMain -.

, , .

( -> Quake3) :

  • (VM_CallInterpreted).
  • CALLI4, int.
  • , .
  • (int (*systemCall)( int *parms )).
  • , systemCall, quake3.exe

, , .

: , (char,int,float), (char*,int[]). , struct Visual Studio LCC.

: Quake3 , QVM , C (strlen, memset , ). : Malloc in QVM.


. Unlagged .


- :

  • .
  • Visual Studio.
  • QVM . .
  • - , .

idTech3 DLL , :



, :

  • -
  • -, x86
  • , Windows DLL









idTech. :

  • Quake1 Omicron.
  • Quake2 Gladiator.

idTech3 , . :

: 275 Masters of Doom:

. , . , . Quake III, , . .

, . , , , . .

, , . , , . . 1999 , .


- (Mr.Elusive), , Omicron Gladiator. , bot.lib:



, - (Jean-Paul van Waveren)
103- . , (Alex J. Champandard) , , . Quake3.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/330818/

:  

: [1] []
 

:
: 

: ( )

:

  URL