[翻蚳è
泚ïŒãã®èšäºã®æåã®éšåã®ç¿»èš³ã¯ãã§ã«Habréã«ãããŸããããã®èè
ã¯äœããã®çç±ã§äœæ¥ãå®äºããŸããã§ããã]ã¬ã³ãã©ãŒQuake III
Quake IIIã¬ã³ãã©ãŒã¯ãQuake IIããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã¿ã¬ã³ãã©ãŒã®é²åçéçºã§ãããå€å
žçãªéšåã¯ããã€ããªåå²ã/ãæœåšçã«èŠããã»ãããã®ã¢ãŒããã¯ãã£äžã«æ§ç¯ãããŠããŸããã次ã®2ã€ã®éèŠãªåŽé¢ãè¿œå ãããŠããŸãã
- OpenGL 1.Xåºå®ãã€ãã©ã€ã³ã®äžã«æ§ç¯ãããã·ã§ãŒããŒã·ã¹ãã ããã¯1999幎ã«ãšã£ãŠå€§ããªææã§ããã ããã¯ãä»æ¥ã©ãã«ã§ãããé ç¹ã·ã§ãŒããŒã幟äœåŠã·ã§ãŒããŒãããã³ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®æ代ã«é©æ°ã®ããã®å€§ããªã¹ããŒã¹ãæäŸããŸããã
- ãã«ãã³ã¢ã¢ãŒããã¯ãã£ã®ãµããŒãïŒOpenGLã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«ã¯äžéšã®ã¡ãœããããããã¯ããã¹ã¬ããã·ã¹ãã ã¯ãã®åé¡ãéšåçã«è§£æ±ºããŸãã
建ç¯
renderer.lib
å®å
šã«å«ãŸããŠããã
quake3.exe
ãšéçã«ãªã³ã¯ãããŠã
quake3.exe
ïŒ

å
šäœçãªã¢ãŒããã¯ãã£ã¯Quake Classicãç¹°ãè¿ããŸããBSP/ PVS /ã©ã€ãã£ã³ã°ãããã®æåãªçµã¿åããã䜿çšããŸãã
- ååŠçïŒ
- ã²ãŒã ãã¶ã€ããŒã¯QRadiant .mapã䜿çšããŠäœæããä¿åããŸãã
- q3bsp.exeã¯ããã€ããªã¹ããŒã¹ããŒãã£ã·ã§ã³ïŒBSPïŒã§ããããåãåããŸãã ããã«ã€ããŠã¯ãQuake1ã¬ã³ãã©ãŒã®ã¬ãã¥ãŒã§æžããŸããã
- ããŒã¿ã«ã·ã¹ãã ã¯BSPããçæãããŸã ãããã«ã€ããŠã¯ã Doom3 DmapããŒã«ã«é¢ããèšäºã§èª¬æããŸããã
q3vis.exe
ã¯ããŒã¿ã«ã·ã¹ãã ã䜿çšããåã·ãŒãã®PVSïŒæœåšçã«è¡šç€ºãããã»ããïŒãçæããŸãã åã®èšäºã§èª¬æããããã«ãåPVSã¯å§çž®ãããbspãã¡ã€ã«ã«ä¿åãããŸãã- ããŒã¿ã«ã·ã¹ãã ãã¯ãªã¢ãããŸãã
q3light.exe
ã¯ããããäžã®åããªãŽã³ã®ã©ã€ãã£ã³ã°ãèšç®ãããã®çµæãq3light.exe
ãããã®ãã¯ã¹ãã£ãšããŠbspãã¡ã€ã«ã«ä¿åããŸãã- ãã®æç¹ã§ãäºåã«èšç®ããããã¹ãŠã®ããŒã¿ïŒPVSãšã©ã€ããããïŒã¯.bspãã¡ã€ã«ã«ä¿åãããŸãã
- ãªãŒãã¿ã€ã ïŒ
- ãšã³ãžã³ã¯ããããšbspãããŒãããŸãã
- èŠèŠåãå¿
èŠãªå ŽåïŒ
- ãšã³ãžã³ã¯çŸåšã®ã·ãŒãã®PVSã解åãã å®éã«èŠãããã®ã決å®ããŸãã
- ãã«ãããªãŽã³ã䜿çšããŠãããªãŽã³ããšã«ãç
§æããããšè²ãçµã¿åãããŸãã
ãšã³ãžã³ãå€æŽããŠãã©ã¡ããäžæ¹ã®ã¿ã衚瀺ãããšããã«ããã¯ã¹ãã£ãªã³ã°ãšç
§æãããã®æ®µéãã¯ã£ãããšããããŸãã
ã¬ãã«ãã¶ã€ããŒ/ã¢ãŒãã£ã¹ããæãããã¯ã¹ãã£ïŒ

q3light.exe
ã«ãã£ãŠçæãããç
§æãããïŒ

å®è¡æã«ãã«ããã¯ã¹ãã£ãªã³ã°ã䜿çšããŠæ¥ç¶ããå Žåã®æçµçµæïŒ

ã¬ã³ããªã³ã°ã¢ãŒããã¯ãã£ã¯ã1999幎ã®ã²ãŒã éçºè
äŒè°ã§Brian Hookã«ãã£ãŠã¬ãã¥ãŒãããŸããã æ®å¿µãªããã
GDC Vaultã®ãããªã¯å©çšã§ããªããªããŸããïŒ
[ãã ãã YouTubeã«ãããŸãã]ã·ã§ãŒããŒ
ã·ã§ãŒããŒã·ã¹ãã ã¯OpenGL 1.Xåºå®ãã€ãã©ã€ã³ã®äžã«æ§ç¯ãããŠãããããéåžžã«é«äŸ¡ã§ãã éçºè
ã¯é ç¹ã®å€æŽãããã°ã©ã ã§ããŸããããã¯ã¹ãã£ãã¹ãè¿œå ã§ããŸãã ããã«ã€ããŠã¯ãQuake 3 Shaderãã€ãã«ã·ã§ãŒããŒãã€ãã«ã§è©³ãã説æããŠããŸãã

ãã«ãã³ã¢ã¬ã³ãã©ãŒãšSMPïŒå¯Ÿç§°åãã«ãããã»ãã·ã³ã°ïŒ
å€ãã®äººã¯ãQuake III Arenaãcvariable
r_smp
ã䜿çšãã
SMPãµããŒãä»ãã§ãªãªãŒã¹ãããããšãç¥ããŸããã ããã³ããšã³ããšããã¯ãšã³ãã¯ãæšæºã®Producer-Consumerã¹ããŒã ãä»ããŠæ
å ±ã亀æããŸãã
r_smp
ã®å€ã1ã®å Žåããã€ã³ãããããµãŒãã§ã¹ã¯ãRAMã«ããããã«ãããã¡ãŒã«äº€äºã«ä¿åãããŸãã ããã³ããšã³ãïŒãã®äŸã§ã¯
ã¡ã€ã³ã¹ã¬ãããšåŒã°ã
ãŸã ïŒã¯ãããã¡ãŒã®1ã€ã«äº€äºã«æžã蟌ã¿ãŸãããããã¯ãšã³ãã¯ããäžæ¹ïŒãã®äŸã§ã¯
ã¬ã³ãã©ãŒã¹ã¬ãããšåŒã°ããŸãïŒããèªã¿åããŸãã
äŸã¯ããã¹ãŠãã©ã®ããã«æ©èœãããã瀺ããŠããŸãã
t0-t1ïŒ- ã¡ã€ã³ã¹ã¬ãããæç»ãããã®ã決å®ãããµãŒãã§ã¹ãsurfacebuffer1ã«æžã蟌ã¿ãŸãã
- ã¬ã³ãã©ãŒã¹ã¬ããã®ããŒã¿ããªãããããããã¯ãããŸãã
- GPUã¹ã¬ãããäœãããŸããã
t1-t2ïŒããã»ã¹ã¯ã©ãã§ãéå§ããŸãïŒ
- ã¡ã€ã³ã¹ã¬ããã¯ã次ã®ãã¬ãŒã ã§äœã衚瀺ãããã決å®ããŸãã ãµãŒãã§ã¹ãsurfacebuffer2ã«æžã蟌ã¿ãŸããããã¯ãããã«ãããã¡ãªã³ã°ã®å
žåçãªäŸã§ãã
- äžæ¹ãRendererã¹ã¬ããã¯OpenGLåŒã³åºããè¡ããGPUã¹ã¬ããããã¹ãŠãå®å
šãªå Žæã«ã³ããŒããã®ãèŸæ±åŒ·ãåŸ
ã¡ãŸãã
- GPUã¹ã¬ããã¯ãã¬ã³ãã©ãŒã¹ã¬ãããæãå Žæããè¡šé¢ãèªã¿åããŸãã
t2ã§ã¯æ¬¡ã®ããšã«æ³šæããŠãã ããã
- ã¬ã³ãã©ãŒã¹ã¬ããã¯ãŸã ããŒã¿ãGPUã«è»¢éããŠããŸãïŒSurfaceBuffer1ã䜿çšãããŸãã
- ã¡ã€ã³ã¹ã¬ããã¯SurfaceBuffer2ãžã®æžã蟌ã¿ãçµäºããŸããããSurfaceBuffer1ãžã®æžã蟌ã¿ãéå§ã§ããŸããïŒããã¯ãããŠããŸã
ãã®ã±ãŒã¹ïŒã¬ã³ãã©ãŒã¹ã¬ãããã¡ã€ã³ã¹ã¬ããããããã¯ããå ŽåïŒã¯ãQuake IIIã®ãã¬ã€äžã«éåžžã«é »ç¹ã«çºçããŸãã
OpenGL APIã¡ãœããã®1ã€ããããã¯ããå¶éã瀺ããŸãã
t2ã®åŸïŒ- ã¬ã³ãã©ãŒã¹ã¬ãããSurfaceBuffer1ïŒt3ïŒã§çµäºãããšããã«ãSurfaceBuffer2ãããµãŒãã§ã¹ã®ã¢ããããŒããéå§ããŸãã
- ããã¯ã解é€ããããšïŒt3ïŒãã¡ã€ã³ã¹ã¬ããã¯æ¬¡ã®ãã¬ãŒã ã§åäœãéå§ããSurfaceBuffer1ã«æžã蟌ã¿ãŸãã
- ãã®æ§æã§ã¯ãGPUã¯ã»ãšãã©ã¢ã€ãã«ç¶æ
ã«ãªããŸããã
泚ïŒåæã¯ã
winglimp.cã® Windowsã€ãã³ããªããžã§ã¯ããä»ããŠå®è¡ãã
ãŸã ïŒäžéšã«SMPã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããŸãïŒã
ãããã¯ãŒã¯ã¢ãã«
Quake3ãããã¯ãŒã¯ã¢ãã«ã¯ãééããªããšã³ãžã³ã®æããšã¬ã¬ã³ããªéšåã§ãã äœã¬ãã«ã§ã¯ãQuake IIIã¯äŸç¶ãšããŠ
ãQuake Worldã§åããŠç»å Žãã
NetChannelã¢ãžã¥ãŒã«ãšã®ããŒã¿äº€æãæœè±¡åã
ãŸã ã ç解ããæãéèŠãªããšïŒ
å€åã®éããªãºã ã®ç°å¢ã§ã¯ãæåã®è»¢éäžã«åä¿¡ãããªãã£ãæ
å ±ã¯ããããé³è
åãããããåéä¿¡ãã䟡å€ã¯ãããŸããã
ãããã£ãŠãçµæãšããŠããšã³ãžã³ã¯UDP / IPã䜿çšããŸãããä¿¡é Œæ§ã®ããéä¿¡ãã«ãã蚱容ã§ããªãé
延ãçºçãããããã³ãŒãã«ã¯TCP / IPãã¬ãŒã¹ããããŸããã ãããã¯ãŒã¯ã¹ã¿ãã¯ã¯ãçžäºã«æä»çãª2ã€ã®ã¬ã€ã€ãŒã§åŒ·åãããŠããŸãã
- äºåéä¿¡ããŒã䜿çšããæå·åã
- äºåã«èšç®ããããããã³ããŒã䜿çšããå§çž®ã

ããããæãçŽ æŽãããèšèšã¯ãµãŒããŒåŽã«ããããšã¬ã¬ã³ããªã·ã¹ãã ãåUDPããŒã¿ã°ã©ã ã®ãµã€ãºãæå°åããUDPã®ä¿¡é Œæ§ãè£ããŸããã¹ãããã·ã§ããå±¥æŽã¯ãã¡ã¢ãªã€ã³ããã¹ãã¯ã·ã§ã³ã䜿çšããŠãã«ã¿å¯æšãçæããŸãã
建ç¯
ãããã¯ãŒã¯ã¢ãã«ã®ã¯ã©ã€ã¢ã³ãåŽã¯éåžžã«åçŽã§ããã¯ã©ã€ã¢ã³ãã¯ããã¬ãŒã ããšã«ãµãŒããŒã«ã³ãã³ããéä¿¡ããã²ãŒã ã¹ããŒã¿ã¹ã®æŽæ°ãåä¿¡ããŸãã ãµãŒããŒåŽã¯ãUDPãã±ããã®æ倱ãèæ
®ããŠã²ãŒã ã®äžè¬çãªç¶æ
ãåã¯ã©ã€ã¢ã³ãã«éä¿¡ããå¿
èŠããããããããå°ãè€éã§ãã ãã®ã¡ã«ããºã ã«ã¯ã3ã€ã®äž»èŠãªèŠçŽ ãå«ãŸããŸãã

- ãã¹ã¿ãŒGamestateã¯ãç©äºã®äžè¬çãªçã®ç¶æ
ã§ãã 顧客ã¯ããŒã ãNetchannelã«éããŸãã ãããã¯event_tã«å€æããããµãŒããŒãåä¿¡ãããšã²ãŒã ã®ç¶æ
ãå€æŽããŸãã
- ãµãŒããŒã¯ãã¯ã©ã€ã¢ã³ãããšã«ããããã¯ãŒã¯ãä»ããŠéä¿¡ãããã²ãŒã ã®ææ°ã®32åã®ç¶æ
ã埪ç°é
åã«ä¿åããŸãããããã¯ã¹ãããã·ã§ãããšåŒã°ããŸãã é
åã¯ãQuake World Networkã®èšäºïŒ ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ ïŒã§èª¬æããæåãªãã€ããªãã¹ã¯ããªãã¯ã䜿çšããŠã«ãŒãããŸãã
- ãµãŒããŒã«ã¯ã空ã®ãç¶æ
ããããåãã£ãŒã«ãã®å€ã¯0ã§ããã以åã®ç¶æ
ãã®ãªããã«ã¿ã¹ãããã·ã§ããã«äœ¿çšãããŸãã
ãµãŒããŒã¯ãã¯ã©ã€ã¢ã³ãã«æŽæ°ãéä¿¡ããããšã決å®ãããšã3ã€ã®èŠçŽ ãã¹ãŠã䜿çšããŠã¡ãã»ãŒãžãçæããNetChannelãä»ããŠéä¿¡ããŸãã
èå³æ·±ãäºå®ïŒåãã¬ãŒã€ãŒã®ãã®ãããªæ°ã®ã²ãŒã ç¶æ
ãä¿åãããšã倧éã®ã¡ã¢ãªãæ¶è²»ããŸããç§ã®æž¬å®ã«ãããšã4人ã®ãã¬ãŒã€ãŒã§8 MBã§ãã
ã¹ãããã·ã§ããã·ã¹ãã
ã¹ãããã·ã§ããã·ã¹ãã ãç解ããããã«ã次ã®æ¡ä»¶ã®äŸã瀺ããŸãã
- ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ãClient1ã«æŽæ°ãéä¿¡ããŸãã
- ãµãŒããŒã¯ã4ã€ã®ãã£ãŒã«ããæã€ç¶æ
ãClient2ã¯ã©ã€ã¢ã³ãã«æž¡ãããšããŠããŸãïŒäœçœ®[X]ãäœçœ®[Y]ãäœçœ®[Z]ã®3ã€ã®æŽæ°å€ãããã³ãã«ã¹ã®1ã€ã®æŽæ°å€ïŒã
- éä¿¡ã¯UDP / IPãä»ããŠè¡ãããŸãããããã®ã¡ãã»ãŒãžã¯ã€ã³ã¿ãŒãããäžã§å€±ãããããšããããããŸãã
ãã¬ãŒã 1ãµãŒããŒïŒãµãŒããŒã¯åã¯ã©ã€ã¢ã³ãããããã€ãã®æŽæ°ãåãåããŸããã ãããã¯ãã²ãŒã ã®äžè¬çãªç¶æ
ïŒç·ïŒã«åœ±é¿ãäžããŸããã Client1ã«ç¶æ
ãæž¡ããšãã§ãã

ã¡ãã»ãŒãžãçæããããã«ããããã¯ãŒã¯ã¢ãžã¥ãŒã«ã¯åžžã«æ¬¡ã®ããšãè¡ããŸãã
- ã²ãŒã ã®äžè¬çãªç¶æ
ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã®æ¬¡ã®ã¹ãããã«ã³ããŒããŸãã
- å¥ã®ã¹ãããã·ã§ãããšæ¯èŒããŸãã
ããã次ã®ç»åã«èŠããããã®ã§ãã
- ã²ãŒã ã®äžè¬çãªç¶æ
ïŒMaster gamestateïŒã¯ãã€ã³ããã¯ã¹0ã§Client1ã®å±¥æŽã«ã³ããŒãããŸãïŒçŸåšã¯ãSnapshot1ããšåŒã°ããŠããŸãã
- ããã¯æåã®æŽæ°ã§ãããããClient1ã®å±¥æŽã«ã¯æ£ããã¹ãããã·ã§ãããååšããããããšã³ãžã³ã¯ãã¹ãŠã®ãã£ãŒã«ãããªã»ããããã空ã®ã¹ãããã·ã§ããããããŒã¹ãããã·ã§ãããã䜿çšããŸãã åãã£ãŒã«ãã¯NetChannelã«éä¿¡ããããããããã«ããå®å
šãªæŽæ°ãè¡ãããŸãã

ããã§æãéèŠãªããšã¯ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã«æ£ããã¹ãããã·ã§ãããå«ãŸããŠããªãå Žåããšã³ãžã³ã空ã®ã¹ãããã·ã§ãããååŸããŠãã«ã¿ã¡ãã»ãŒãžãçæããããšãç解ããããšã§ãã ããã«ããã132ãããã§ã¯ã©ã€ã¢ã³ãã«å®å
šãªæŽæ°ãéä¿¡ãããŸãïŒåãã£ãŒã«ãã®
åã«ã¯ãããããŒã¯ã³ ïŒïŒ
[1 A_on32bits 1 B_on32bits 1 B_on32bits 1 C_on32bits]
ã
ãã¬ãŒã 2ãµãŒããŒïŒæ¬¡ã«ãå°ãå
ã«é²ãã§ã¿ãŸãããããµãŒããŒã®2çªç®ã®ãã¬ãŒã ã§ãã ã芧ã®ããã«ãåã¯ã©ã€ã¢ã³ãã¯ã³ãã³ããéä¿¡ããããããã¹ãŠãã²ãŒã ã®äžè¬çãªç¶æ
ã«åœ±é¿ãäžããŸããããã¹ã¿ãŒgamestateïŒClient2ã¯Y軞ã«æ²¿ã£ãŠç§»åãããããpos [1]ã¯EïŒéïŒã«çãããªããŸãã Client1ãã³ãã³ããéä¿¡ããŸããããããã«éèŠãªããšã«ã以åã®æŽæ°ã®åä¿¡ã確èªãããããSnapshot1ã¯ç¢ºèªæžã¿ïŒãACKãïŒãšããŠããŒã¯ãããŸããã

åãããã»ã¹ãå®è¡ãããŸãã
- ã²ãŒã ã®äžè¬çãªç¶æ
ã¯ã次ã®ã¯ã©ã€ã¢ã³ãå±¥æŽã¹ãããã«ã³ããŒãããŸãïŒïŒã€ã³ããã¯ã¹1ïŒïŒããã¯Snapshot2ã§ã
- ä»åã¯ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã«æ£ããã¹ãããã·ã§ããããããŸãïŒsnapshot1ïŒã ããã2ã€ã®ã¹ãããã·ã§ãããæ¯èŒãã
ãã®çµæãéšåçãªæŽæ°ã®ã¿ããããã¯ãŒã¯çµç±ã§éä¿¡ãããŸãïŒpos [1] = EïŒã ããããã®ãã¶ã€ã³ã®çŸããã§ããããã»ã¹ã¯åžžã«åãã§ãã
泚ïŒåãã£ãŒã«ãã®
åã«ã¯ãããããŒã«ãŒ ïŒ1 =å€æŽã0 =å€æŽãªãïŒããããããäžèšã®äŸã®éšåçãªæŽæ°ã«ã¯36ãããã䜿çšãããŸãïŒ
[0 1 32bitsNewValue 0 0]
ã
ãã¬ãŒã 3ãµãŒããŒïŒã·ã¹ãã ã倱ãããããã±ãŒãžãã©ã®ããã«åŠçããããèŠãããã«ããã«äžæ©é²ãã§ã¿ãŸãããã ãã¬ãŒã 3ã«ãªããŸãããã¯ã©ã€ã¢ã³ãã¯åŒãç¶ãã³ãã³ãããµãŒããŒã«éä¿¡ããŸãã
Client2ã¯æ害ãåãããã«ã¹ã¯çŸåšHã§ããããããClient1ã¯ææ°ã®æŽæ°ã確èªããŸããã§ããã UDPãµãŒããŒã倱ãããå¯èœæ§ããããã¯ã©ã€ã¢ã³ãACKã倱ãããå¯èœæ§ããããŸããããã®çµæã䜿çšã§ããŸããã

ããã«ãããããããããã»ã¹ã¯åããŸãŸã§ãã
- ã²ãŒã ã®äžè¬çãªç¶æ
ãã¯ã©ã€ã¢ã³ãå±¥æŽã®æ¬¡ã®ã¹ãããã«ã³ããŒããŸãïŒïŒã€ã³ããã¯ã¹2ïŒïŒããã¯Snapshot3ã§ã
- æåŸã®æå¹ãªç¢ºèªæžã¿ã¹ãããã·ã§ããïŒsnapshot1ïŒãæ¯èŒããŸãã

ãã®çµæãã¡ãã»ãŒãžã¯éšåçã«éä¿¡ããå€ãå€æŽãšæ°ããå€æŽã®çµã¿åãããå«ã¿ãŸãïŒïŒpos [1] = Eããã³health = HïŒã snapshot1ã¯å€ãããŠäœ¿çšã§ããªãå Žåãããããšã«æ³šæããŠãã ããã ãã®å Žåããšã³ãžã³ã¯åã³ã空ã®ã¹ãããã·ã§ãããã䜿çšãããããå®å
šãªæŽæ°ãè¡ãããŸãã
ã·ã¹ãã ã®çŸãããšåªé
ãã¯ããã®ã·ã³ãã«ãã«ãããŸãã èªåçã«1ã€ã®ã¢ã«ãŽãªãºã ïŒ
- éšåçãŸãã¯å®å
šãªæŽæ°ãçæããŸãã
- åä¿¡ãããªãã£ãOLDæ
å ±ãšNEWæ
å ±ã1ã€ã®ã¡ãã»ãŒãžã§åéä¿¡ããŸãã
ã€ã³ããã¹ãã¯ã·ã§ã³Cã¡ã¢ãª
Quake3ãå
芳ã®ã¹ãããã·ã§ãããæ¯èŒããæ¹æ³ãçåã«æããããããŸãã...çµå±ã®ãšãããCã¯ããã§ã¯ãããŸããã
çãã¯æ¬¡ã®ãšããã§ã
netField_t
åãã£ãŒã«ãã®å Žæã¯ãé
åãšã¹ããŒãããªããã»ã¹ãã£ã¬ã¯ãã£ãã䜿çšããŠäºåã«äœæãããŸãã
typedef struct { char *name; int offset; int bits; } netField_t;
ãã®éšåã®å®å
šãªã³ãŒãã¯ã
MSG_WriteDeltaEntity
ãŸãã Quake3ã¯ãäœãæ¯èŒããŠããã®ãããç¥ããŸãããentityStateFieldsã®ã€ã³ããã¯ã¹ããªãã»ããããµã€ãºãç²ç®çã«äœ¿çšãããããã¯ãŒã¯ãä»ããŠå·®åãéä¿¡ããŸãã
äºåçãªæçå
ã³ãŒãã詳ãã調ã¹ããšãUDPããŒã¿ã°ã©ã ã®æ倧ãµã€ãºã65507ãã€ãã§ããã«ãããããããNetChannelã¢ãžã¥ãŒã«ãã¡ãã»ãŒãžã1400ãã€ãã®ãããã¯ïŒ
Netchan_Transmit
ïŒã«ã«ããããããšãããããŸãã ãã®ãããã»ãšãã©ã®ãããã¯ãŒã¯ã§ã¯æ倧ãã±ãããµã€ãºïŒMTUïŒã1500ãã€ãã§ãããããã€ã³ã¿ãŒãããçµç±ã§éä¿¡ãããšãã«ããšã³ãžã³ãã«ãŒã¿ãŒã«ãããã±ããã®ç Žæãåé¿ããŸãã ã«ãŒã¿ã®ãã©ã°ã¡ã³ããŒã·ã§ã³ãåãé€ãããšã¯éåžžã«éèŠã§ãïŒ
- ãããã¯ãŒã¯ã«å
¥ããšãã«ãŒã¿ãŒã¯ãã±ãããæçåãããŸã§ãããã¯ããå¿
èŠããããŸãã
- ãããã¯ãŒã¯ãé¢ãããšããããŒã¿ã°ã©ã ã®ãã¹ãŠã®éšåãåŸ
ã£ãŠããå€ãã®æéããããŠåéããå¿
èŠããããããåé¡ã¯ããã«æ·±å»ã§ãã
ä¿¡é Œæ§ãé«ãä¿¡é Œæ§ã®ãªãéä¿¡ã䌎ãã¡ãã»ãŒãž
ã¹ãããã·ã§ããã·ã¹ãã ã¯ããããã¯ãŒã¯äžã§å€±ãããUDPããŒã¿ã°ã©ã ãè£æ£ããŸãããäžéšã®ã¡ãã»ãŒãžãšã³ãã³ãã¯å¿
ãé
ä¿¡
ããå¿
èŠããããŸãïŒããšãã°ããã¬ãŒã€ãŒãã²ãŒã ãé¢ãããšãããŸãã¯ãµãŒããŒãã¯ã©ã€ã¢ã³ãã«æ°ããã¬ãã«ãããŒãããå¿
èŠããããšãïŒã
ãã®ãã€ã³ãã£ã³ã°ã¯ãNetChannelã¢ãžã¥ãŒã«ã«ãã£ãŠæœè±¡åãããŠããŸããããã«ã€ããŠ
ã¯ã以åã®æçš¿ã®1ã€ã§æžã
ãŸãã ã
æšå¥šèªæž
éçºè
ã®1人ã§ãããã©ã€ã¢ã³ããã¯ã¯
ããããã¯ãŒã¯ã¢ãã«ã«é¢ããçãèšäºãæžããŸãã ã
é
ãã®ãªãèè
ããŒã«ããã€ã¹ããããã³ã
ãããã説æããŸãã ã
ä»®æ³ãã·ã³
以åã®ãšã³ãžã³ãä»®æ³ã²ãŒã ãã¬ã€ã®ã¿ãä»®æ³ãã·ã³ã«äžããå Žåãidtech3ã¯ãããéåžžã«éèŠãªã¿ã¹ã¯ã«ä»»ããŸãã ãšãããïŒ
- å¯èŠåã¯ã¯ã©ã€ã¢ã³ãä»®æ³ãã·ã³ã§å®è¡ãããŸãã
- é
延è£æ£ã¡ã«ããºã ã¯ãã¯ã©ã€ã¢ã³ãVMã«å®å
šã«å®è£
ãããŠããŸãã
ããã«ããã®èšèšã¯ã¯ããã«è€éã§ããQuake1ä»®æ³ãã·ã³ã®ä¿è·/移æ€æ§ãšãã€ãã£ãQuake2 DLLã®é«æ§èœãçµã¿åãããŠããŸãã ããã¯ããã€ãã³ãŒãããªã³ã¶ãã©ã€ã§x86ã³ãã³ãã«ã³ã³ãã€ã«ããããšã«ããå®çŸãããŸãã
èå³æ·±ãäºå®ïŒä»®æ³ãã·ã³ã¯ããšããšåçŽãªãã€ãã³ãŒãã€ã³ã¿ãŒããªã¿ãŒã§ããã¯ãã§ããããããã©ãŒãã³ã¹ã¯éåžžã«äœãã£ãã§ãã ãããã£ãŠãéçºããŒã ã¯ã©ã³ã¿ã€ã x86ã³ã³ãã€ã©ãŒãäœæããŸããã
1999幎8æ16æ¥ä»ã®
.planãã¡ã€ã«ã«ãããš
ããã®ã¿ã¹ã¯ã¯1æ¥ã§å®äºããŸããã
建ç¯
Quake IIIä»®æ³ãã·ã³ã¯QVMãšåŒã°ããŸãã ãã®3ã€ã®éšåã¯åžžã«ããŒããããŠããŸãã

- ã¯ã©ã€ã¢ã³ãåŽïŒ2ã€ã®ä»®æ³ãã·ã³ãããŒããããŸãã ã²ãŒã ã®ç¶æ
ã«å¿ããŠãã¡ãã»ãŒãžã¯ãããã®1ã€ã«éä¿¡ãããŸãã
cgame
ïŒããã«ãã§ãŒãºã§ã¡ãã»ãŒãžãåä¿¡ããŸãã äžå¯èŠã®ã°ã©ãã£ãã¯ã¹ã®ã¯ãªããã³ã°ãäºæž¬ãããã³renderer.lib
å¶åŸ¡ã®ã¿ãå®è¡ãrenderer.lib
ãq3_ui
ïŒã¡ãã¥ãŒã¢ãŒãã§ã¡ãã»ãŒãžãåä¿¡ããŸãã ã·ã¹ãã ã³ãŒã«ã䜿çšããŠã¡ãã¥ãŒãã¬ã³ããªã³ã°ããŸãã
- ãµãŒããŒåŽïŒ
game
ïŒåžžã«ã¡ãã»ãŒãžãåä¿¡ããã²ãŒã ããžãã¯ãå®è¡ããAIæäœã«bot.lib
ã䜿çšããŸãã
QVMå
éš
QVMã®äœ¿çšã«ã€ããŠèª¬æããåã«ããã€ãã³ãŒãã®çææ¹æ³ã確èªããŸãããã ãã€ãã®ããã«ãç§ã¯ã€ã©ã¹ããšç°¡åãªä»éããã¹ãã䜿çšããŠèª¬æããããšã奜ã¿ãŸãïŒ

quake3.exe
ãšãã®ãã€ãã³ãŒãã€ã³ã¿ãŒããªã¿ãŒã¯Visual Studioã䜿çšããŠçæãããŸãããVMãã€ãã³ãŒãã¯ãŸã£ããç°ãªãã¢ãããŒãã䜿çšããŸãã
- å.cãã¡ã€ã«ïŒç¿»èš³ã¢ãžã¥ãŒã«ïŒã¯ãLCCã䜿çšããŠåå¥ã«ã³ã³ãã€ã«ãããŸãã
- LCCã¯ãåºåãPEïŒWindows Portable ExecutableïŒã§ã¯ãªããã¹ã¿ãã¯ããããã·ã³ã®ããã¹ãã¢ã»ã³ããªã§ããäžéè¡šçŸã§ãããããç¹å¥ãªãã©ã¡ãŒã¿ãŒãšå
±ã«äœ¿çšãããŸãã äœæãããåãã¡ã€ã«ã¯ã
text
ã®äžéšã data
ãããã³æåã®ãšã¯ã¹ããŒããšã€ã³ããŒããå«ãbss
ã§æ§æãããŸãã q3asm.exe
ãšåŒã°ããç¹å¥ãªidãœãããŠã§ã¢ããŒã«ã¯ããã¹ãŠã®ã¢ã»ã³ããªããã¹ããã¡ã€ã«ãåãåãããããããŸãšããŠ.qvmãã¡ã€ã«ã«åéããŸãã ããã«ããã¹ãŠã®æ
å ±ãããã¹ããããã€ããªã«å€æããŸãïŒãã€ãã£ãã®å€æãã¡ã€ã«ã䜿çšã§ããªãå Žåã®ããã«ãé床ãäžããããïŒã q3asm.exe
ã¯ãã·ã¹ãã ã«ãã£ãŠåŒã³åºãããã¡ãœãããèªèããŸãã- ãã€ããªãã€ãã³ãŒããããŠã³ããŒãããåŸã
quake3.exe
ãããx86ã³ãã³ãã«å€æããŸãïŒå¿
é ã§ã¯ãããŸããïŒã
å
éšLCC
以äžã¯ãä»®æ³ãã·ã³ã§å®è¡ããå¿
èŠãããé¢æ°ããå§ãŸãç¹å®ã®äŸã§ãã
extern int variableA; int variableB; int variableC=0; int fooFunction(char* string){ return variableA + strlen(string); }
å€æ
module.c
lcc.exe
ããŠãã
module.c
lcc.exe
ãWindows PEãªããžã§ã¯ãã®çæãåé¿ããäžéè¡šçŸã«åºåããããã«ãç¹å¥ãªãã©ã°ã§åŒã³åºãããŸãã ããã¯ãäžèšã®Cé¢æ°ã«å¯Ÿå¿ãã.obj LCCåºåãã¡ã€ã«ã§ãã
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
ïŒã«åå²ããtext
ïŒ bss
ïŒåæåãããŠããªãå€æ°ïŒã data
ïŒåæåãããå€æ°ïŒãããã³code
ïŒéåžžtext
ãšåŒã°ãtext
ïŒ - é¢æ°ã¯ã
proc
ã endproc
ãµã³ãã€ããã䜿çšããŠå®çŸ©ãããŸãã - LCCã®äžéè¡šçŸã¯ã¹ã¿ãã¯ããããã·ã³ã§ãããã¹ãŠã®æäœã¯ã¹ã¿ãã¯äžã§å®è¡ãããCPUã¬ãžã¹ã¿ã«é¢ããä»®å®ã¯è¡ãããŸããã
- LCCãã¬ãŒãºã®æåŸã«ãå€æ°/é¢æ°ãã€ã³ããŒã/ãšã¯ã¹ããŒããããã¡ã€ã«ã®ã°ã«ãŒãããããŸãã
- åã¢ããŠã³ã¹ã¡ã³ãã¯ãæäœã®ã¿ã€ãïŒ
ARGP4
ã ADDRGP4
ã CALLI4
ãªã©ïŒã§CALLI4
ãŸãã åãã©ã¡ãŒã¿ãŒãšçµæã¯ã¹ã¿ãã¯ã«ããã·ã¥ãããŸãã - ã€ã³ããŒããšãšã¯ã¹ããŒãã¯ããã«ãããããã¢ã»ã³ãã©ã¯ç¿»èš³ã¢ãžã¥ãŒã«ãããªã³ã¯ãã§ããŸãã
import strlen
ã䜿çšãããããšã«æ³šæããŠãã ãããq3asm.exeãVMã€ã³ã¿ãŒããªã¿ãŒãæšæºCã©ã€ãã©ãªã«ã¢ã¯ã»ã¹ããªãããã strlen
ã¯ã·ã¹ãã ã³ãŒã«ãšèŠãªãããä»®æ³ãã·ã³ã«ãã£ãŠå®è¡ãããŸãã
ãã®ãããªããã¹ããã¡ã€ã«ã¯ãVMã¢ãžã¥ãŒã«ã®å.cãã¡ã€ã«ã«å¯ŸããŠçæãããŸãã
Q3asm.exeã®å
éš
q3asm.exe
ã¯ãLCC
q3asm.exe
ããã¹ããã¡ã€ã«ãåä¿¡ãããããã.qvmãã¡ã€ã«ã«åéããŸãã

ããã§æ¬¡ã®ããšãããããŸãã
- q3asmã¯ãããã¹ããã¡ã€ã«ã®åã€ã³ããŒã/ãšã¯ã¹ããŒãæåãç解ããŸãã
- äžéšã®ã¡ãœããã¯ãã·ã¹ãã ã³ãŒã«ã®ããã¹ããã¡ã€ã«ã§äºåå®çŸ©ãããŠããŸãã ã¯ã©ã€ã¢ã³ãVMããã³ãµãŒããŒVMã® syscallã確èªã§ããŸã ã ã·ã¹ãã ã³ãŒã«ã·ã³ãã«ã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒãèªèã§ããããã«ãè² ã®æŽæ°å€ã®åœ¢åŒã®å±æ§ããããŸãã
- q3asmã¯ãã¹ããŒã¹ãšé床ã確ä¿ããããã«ãã¬ãŒã³ããŒã·ã§ã³ãããã¹ããããã€ããªã«å€æŽããŸãããããã§ã¯æé©åã¯è¡ãããŸããã
- çµã¿ç«ãŠãããæåã®ã¡ãœããã¯ãå
¥åã¡ãã»ãŒãžãããŒãžã£ã§ããããã
vmMain
ã§ããå¿
èŠããããŸãã ããã«ããã€ãã³ãŒãã®0x2D
ããã¹ãã»ã°ã¡ã³ãã«0x2D
ããŠããå¿
èŠããããŸãã
QVMïŒä»çµã¿
ç¹°ãè¿ããŸãããã¹ã±ãžã¥ãŒãªã³ã°ãå®è¡ããäžæã®ãšã³ããªãã€ã³ããšäžæã®åºå£ãã€ã³ãã瀺ãç»åïŒ

ããã€ãã®è©³çŽ°ïŒ
ã¡ãã»ãŒãžïŒQuake3-> VMïŒã¯ã次ã®ããã«ä»®æ³ãã·ã³ã«éä¿¡ãããŸãã- Quake3ã®ã©ã®éšåã§ã
VM_Call( vm_t *vm, int callnum, ... )
ãåŒã³åºãããšãã§ããŸãã VMCall
ã¯ãæ倧11åã®ãã©ã¡ãŒã¿ãŒãåãåããå4ãããå€ã0x00ãã0x26ã®VMãã€ãã³ãŒãïŒ vm_t *vm
ïŒã«æžã蟌ã¿ãŸããVMCall
ã¯ãã¡ãã»ãŒãžèå¥åãVMCall
æžã蟌ã¿ãŸãã- ã€ã³ã¿ãŒããªã¿ãŒã¯ã0x2DïŒ
q3asm.exe
ãq3asm.exe
æžã蟌ãã vmMain
ïŒã®ãªãã³ãŒãã®è§£éãéå§ããŸãã vmMain
ã察å¿ãããã€ãã³ãŒãã¡ãœããã«ã¡ãã»ãŒãžããã£ã¹ãããããã³ã«ãŒãã£ã³ã°ããããã«äœ¿çšãããŸãã
ã¯ã©ã€ã¢ã³ãVMãš
ãµãŒããŒVMã«ãã£ãŠéä¿¡ãããã¡ãã»ãŒãžã®ãªã¹ãã¯ãåãã¡ã€ã«ã®æåŸã«è¡šç€ºãããŸãã
ã·ã¹ãã ã³ãŒã«ïŒVM-> Quake3ïŒã¯æ¬¡ã®ããã«è¡ãããŸãã- ã€ã³ã¿ãŒããªã¿ãŒã¯1ã€ãã€ãVMãªãã³ãŒãïŒ
VM_CallInterpreted
ïŒãå®è¡ããŸãã CALLI4
ãªãã³ãŒããæ€åºãããšãintã®ã¡ãœããã®ã€ã³ããã¯ã¹ããã§ãã¯ããŸãã- å€ãè² ã®å ŽåãåŒã³åºãã¯ã·ã¹ãã ã§ãã
- ã·ã¹ãã ã³ãŒã«é¢æ°ãžã®ãã€ã³ã¿ãŒïŒ
int (*systemCall)( int *parms )
ïŒã¯ãã©ã¡ãŒã¿ãŒã§åŒã³åºãããŸãã systemCall
ãæãé¢æ°ã䜿çšããŠãã·ã¹ãã ã³ãŒã«ãquake3.exeã®ç®çã®éšåã«ãã£ã¹ãããããã³ã«ãŒãã£ã³ã°ããŸãã
ã¯ã©ã€ã¢ã³ãVMãš
ãµãŒããŒVMã«ãã£ãŠæäŸãããã·ã¹ãã ã³ãŒã«ã®ãªã¹ãã¯ãåãã¡ã€ã«ã®äžéšã«ãããŸãã
: , (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ã«ã³ã³ãã€ã«ãããã³ãŒã
æšå¥šèªæž



人工ç¥èœ
modderã³ãã¥ããã£ã¯ã以åã®ãã¹ãŠã®idTechãšã³ãžã³çšã®ãããã·ã¹ãã ãäœæããŸããããã€ãŠã2ã€ã®ã·ã¹ãã ãéåžžã«æåã§ããã- Quake1ã¯Omicronã§ããã
- Quake2ã§GladiatorãäœæããŸããã
ããããidTech3ã®å Žåããããã·ã¹ãã ã¯ã²ãŒã ãã¬ã€ã®åºæ¬çãªéšåã§ãã£ãããã瀟å
ã§éçºããå¿
èŠããããæåã¯ã²ãŒã ã«ååšããå¿
èŠããããŸãããããããéçºäžã«æ·±å»ãªåé¡ãçºçããŸãããåºå
žïŒMasters of Doomããã¯ã®275ããŒãžïŒâ . â , . , . Quake III, , . .
, . , , , . .
, , . , , . . 1999 , .
建ç¯
- (Mr.Elusive), , «Omicron» «Gladiator». ,
bot.lib
:

, - (Jean-Paul van Waveren)
103- . , (Alex J. Champandard)
, , . Quake3.