![ç»å](https://habrastorage.org/getpro/habr/post_images/422/cf3/817/422cf381796e390e765c8e00c9bfd90b.jpg)
[翻蚳è 泚ïŒãã®èšäºã®æåã®éšåã®ç¿»èš³ã¯ãã§ã«Habréã«ãããŸããããã®èè ã¯äœããã®çç±ã§äœæ¥ãå®äºããŸããã§ããã]
ã¬ã³ãã©ãŒQuake III
Quake IIIã¬ã³ãã©ãŒã¯ãQuake IIããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã¿ã¬ã³ãã©ãŒã®é²åçéçºã§ãããå€å žçãªéšåã¯ããã€ããªåå²ã/ãæœåšçã«èŠããã»ãããã®ã¢ãŒããã¯ãã£äžã«æ§ç¯ãããŠããŸããã次ã®2ã€ã®éèŠãªåŽé¢ãè¿œå ãããŠããŸãã
- OpenGL 1.Xåºå®ãã€ãã©ã€ã³ã®äžã«æ§ç¯ãããã·ã§ãŒããŒã·ã¹ãã ããã¯1999幎ã«ãšã£ãŠå€§ããªææã§ããã ããã¯ãä»æ¥ã©ãã«ã§ãããé ç¹ã·ã§ãŒããŒã幟äœåŠã·ã§ãŒããŒãããã³ãã©ã°ã¡ã³ãã·ã§ãŒããŒã®æ代ã«é©æ°ã®ããã®å€§ããªã¹ããŒã¹ãæäŸããŸããã
- ãã«ãã³ã¢ã¢ãŒããã¯ãã£ã®ãµããŒãïŒOpenGLã¯ã©ã€ã¢ã³ããµãŒããŒã¢ãã«ã¯äžéšã®ã¡ãœããããããã¯ããã¹ã¬ããã·ã¹ãã ã¯ãã®åé¡ãéšåçã«è§£æ±ºããŸãã
建ç¯
renderer.lib
å®å šã«å«ãŸããŠããã
quake3.exe
ãšéçã«ãªã³ã¯ãããŠã
quake3.exe
ïŒ
![](https://habrastorage.org/getpro/habr/post_images/87a/44d/f19/87a44df198af43f93e51f1bf1490fd08.png)
å šäœçãªã¢ãŒããã¯ãã£ã¯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ã解åãã å®éã«èŠãããã®ã決å®ããŸãã
- ãã«ãããªãŽã³ã䜿çšããŠãããªãŽã³ããšã«ãç §æããããšè²ãçµã¿åãããŸãã
ãšã³ãžã³ãå€æŽããŠãã©ã¡ããäžæ¹ã®ã¿ã衚瀺ãããšããã«ããã¯ã¹ãã£ãªã³ã°ãšç §æãããã®æ®µéãã¯ã£ãããšããããŸãã
ã¬ãã«ãã¶ã€ããŒ/ã¢ãŒãã£ã¹ããæãããã¯ã¹ãã£ïŒ
![](https://habrastorage.org/getpro/habr/post_images/dcc/6eb/546/dcc6eb5469a7618bee635b3eca07b798.jpg)
q3light.exe
ã«ãã£ãŠçæãããç §æãããïŒ
![](https://habrastorage.org/getpro/habr/post_images/5c1/63e/a3b/5c163ea3b930043741c7ba9777ace874.jpg)
å®è¡æã«ãã«ããã¯ã¹ãã£ãªã³ã°ã䜿çšããŠæ¥ç¶ããå Žåã®æçµçµæïŒ
![](https://habrastorage.org/getpro/habr/post_images/5b2/705/deb/5b2705deb11919a99100334561ea3118.jpg)
ã¬ã³ããªã³ã°ã¢ãŒããã¯ãã£ã¯ã1999幎ã®ã²ãŒã éçºè äŒè°ã§Brian Hookã«ãã£ãŠã¬ãã¥ãŒãããŸããã æ®å¿µãªããã GDC Vaultã®ãããªã¯å©çšã§ããªããªããŸããïŒ [ãã ãã YouTubeã«ãããŸãã]
ã·ã§ãŒããŒ
ã·ã§ãŒããŒã·ã¹ãã ã¯OpenGL 1.Xåºå®ãã€ãã©ã€ã³ã®äžã«æ§ç¯ãããŠãããããéåžžã«é«äŸ¡ã§ãã éçºè ã¯é ç¹ã®å€æŽãããã°ã©ã ã§ããŸããããã¯ã¹ãã£ãã¹ãè¿œå ã§ããŸãã ããã«ã€ããŠã¯ãQuake 3 Shaderãã€ãã«ã·ã§ãŒããŒãã€ãã«ã§è©³ãã説æããŠããŸãã
![](https://habrastorage.org/getpro/habr/post_images/719/e31/fa1/719e31fa12eb77bacb63cfea747c5dcd.png)
ãã«ãã³ã¢ã¬ã³ãã©ãŒãšSMPïŒå¯Ÿç§°åãã«ãããã»ãã·ã³ã°ïŒ
å€ãã®äººã¯ãQuake III Arenaãcvariable
r_smp
ã䜿çšããSMPãµããŒãä»ãã§ãªãªãŒã¹ãããããšãç¥ããŸããã ããã³ããšã³ããšããã¯ãšã³ãã¯ãæšæºã®Producer-Consumerã¹ããŒã ãä»ããŠæ å ±ã亀æããŸãã
r_smp
ã®å€ã1ã®å Žåããã€ã³ãããããµãŒãã§ã¹ã¯ãRAMã«ããããã«ãããã¡ãŒã«äº€äºã«ä¿åãããŸãã ããã³ããšã³ãïŒãã®äŸã§ã¯ã¡ã€ã³ã¹ã¬ãããšåŒã°ããŸã ïŒã¯ãããã¡ãŒã®1ã€ã«äº€äºã«æžã蟌ã¿ãŸãããããã¯ãšã³ãã¯ããäžæ¹ïŒãã®äŸã§ã¯ã¬ã³ãã©ãŒã¹ã¬ãããšåŒã°ããŸãïŒããèªã¿åããŸãã
äŸã¯ããã¹ãŠãã©ã®ããã«æ©èœãããã瀺ããŠããŸãã
t0-t1ïŒ
- ã¡ã€ã³ã¹ã¬ãããæç»ãããã®ã決å®ãããµãŒãã§ã¹ãsurfacebuffer1ã«æžã蟌ã¿ãŸãã
- ã¬ã³ãã©ãŒã¹ã¬ããã®ããŒã¿ããªãããããããã¯ãããŸãã
- GPUã¹ã¬ãããäœãããŸããã
![](https://habrastorage.org/getpro/habr/post_images/ffe/355/9be/ffe3559beb531b6bd587035c0f582117.png)
t1-t2ïŒããã»ã¹ã¯ã©ãã§ãéå§ããŸãïŒ
- ã¡ã€ã³ã¹ã¬ããã¯ã次ã®ãã¬ãŒã ã§äœã衚瀺ãããã決å®ããŸãã ãµãŒãã§ã¹ãsurfacebuffer2ã«æžã蟌ã¿ãŸããããã¯ãããã«ãããã¡ãªã³ã°ã®å žåçãªäŸã§ãã
- äžæ¹ãRendererã¹ã¬ããã¯OpenGLåŒã³åºããè¡ããGPUã¹ã¬ããããã¹ãŠãå®å šãªå Žæã«ã³ããŒããã®ãèŸæ±åŒ·ãåŸ ã¡ãŸãã
- GPUã¹ã¬ããã¯ãã¬ã³ãã©ãŒã¹ã¬ãããæãå Žæããè¡šé¢ãèªã¿åããŸãã
t2ã§ã¯æ¬¡ã®ããšã«æ³šæããŠãã ããã
- ã¬ã³ãã©ãŒã¹ã¬ããã¯ãŸã ããŒã¿ãGPUã«è»¢éããŠããŸãïŒSurfaceBuffer1ã䜿çšãããŸãã
- ã¡ã€ã³ã¹ã¬ããã¯SurfaceBuffer2ãžã®æžã蟌ã¿ãçµäºããŸããããSurfaceBuffer1ãžã®æžã蟌ã¿ãéå§ã§ããŸããïŒããã¯ãããŠããŸã
ãã®ã±ãŒã¹ïŒã¬ã³ãã©ãŒã¹ã¬ãããã¡ã€ã³ã¹ã¬ããããããã¯ããå ŽåïŒã¯ãQuake IIIã®ãã¬ã€äžã«éåžžã«é »ç¹ã«çºçããŸãã
OpenGL APIã¡ãœããã®1ã€ããããã¯ããå¶éã瀺ããŸãã
![](https://habrastorage.org/getpro/habr/post_images/c7d/16a/d68/c7d16ad68d4768463f271e74b43bf7d1.png)
t2ã®åŸïŒ
- ã¬ã³ãã©ãŒã¹ã¬ãããSurfaceBuffer1ïŒt3ïŒã§çµäºãããšããã«ãSurfaceBuffer2ãããµãŒãã§ã¹ã®ã¢ããããŒããéå§ããŸãã
- ããã¯ã解é€ããããšïŒt3ïŒãã¡ã€ã³ã¹ã¬ããã¯æ¬¡ã®ãã¬ãŒã ã§åäœãéå§ããSurfaceBuffer1ã«æžã蟌ã¿ãŸãã
- ãã®æ§æã§ã¯ãGPUã¯ã»ãšãã©ã¢ã€ãã«ç¶æ ã«ãªããŸããã
![](https://habrastorage.org/getpro/habr/post_images/636/421/ec4/636421ec45a20c218ebaea9d77abc826.png)
泚ïŒåæã¯ã winglimp.cã® Windowsã€ãã³ããªããžã§ã¯ããä»ããŠå®è¡ãããŸã ïŒäžéšã«SMPã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããŸãïŒã
ãããã¯ãŒã¯ã¢ãã«
Quake3ãããã¯ãŒã¯ã¢ãã«ã¯ãééããªããšã³ãžã³ã®æããšã¬ã¬ã³ããªéšåã§ãã äœã¬ãã«ã§ã¯ãQuake IIIã¯äŸç¶ãšããŠãQuake Worldã§åããŠç»å ŽããNetChannelã¢ãžã¥ãŒã«ãšã®ããŒã¿äº€æãæœè±¡åããŸã ã ç解ããæãéèŠãªããšïŒ
å€åã®éããªãºã ã®ç°å¢ã§ã¯ãæåã®è»¢éäžã«åä¿¡ãããªãã£ãæ å ±ã¯ããããé³è åãããããåéä¿¡ãã䟡å€ã¯ãããŸããã
ãããã£ãŠãçµæãšããŠããšã³ãžã³ã¯UDP / IPã䜿çšããŸãããä¿¡é Œæ§ã®ããéä¿¡ãã«ãã蚱容ã§ããªãé 延ãçºçãããããã³ãŒãã«ã¯TCP / IPãã¬ãŒã¹ããããŸããã ãããã¯ãŒã¯ã¹ã¿ãã¯ã¯ãçžäºã«æä»çãª2ã€ã®ã¬ã€ã€ãŒã§åŒ·åãããŠããŸãã
- äºåéä¿¡ããŒã䜿çšããæå·åã
- äºåã«èšç®ããããããã³ããŒã䜿çšããå§çž®ã
![](https://habrastorage.org/getpro/habr/post_images/6e4/deb/fa5/6e4debfa5e4c343b2ac03d9c338edf11.png)
ããããæãçŽ æŽãããèšèšã¯ãµãŒããŒåŽã«ããããšã¬ã¬ã³ããªã·ã¹ãã ãåUDPããŒã¿ã°ã©ã ã®ãµã€ãºãæå°åããUDPã®ä¿¡é Œæ§ãè£ããŸããã¹ãããã·ã§ããå±¥æŽã¯ãã¡ã¢ãªã€ã³ããã¹ãã¯ã·ã§ã³ã䜿çšããŠãã«ã¿å¯æšãçæããŸãã
建ç¯
ãããã¯ãŒã¯ã¢ãã«ã®ã¯ã©ã€ã¢ã³ãåŽã¯éåžžã«åçŽã§ããã¯ã©ã€ã¢ã³ãã¯ããã¬ãŒã ããšã«ãµãŒããŒã«ã³ãã³ããéä¿¡ããã²ãŒã ã¹ããŒã¿ã¹ã®æŽæ°ãåä¿¡ããŸãã ãµãŒããŒåŽã¯ãUDPãã±ããã®æ倱ãèæ ®ããŠã²ãŒã ã®äžè¬çãªç¶æ ãåã¯ã©ã€ã¢ã³ãã«éä¿¡ããå¿ èŠããããããããå°ãè€éã§ãã ãã®ã¡ã«ããºã ã«ã¯ã3ã€ã®äž»èŠãªèŠçŽ ãå«ãŸããŸãã
![](https://habrastorage.org/getpro/habr/post_images/f0d/547/d6b/f0d547d6b01ad4237fe0cf2998f48c3c.png)
- ãã¹ã¿ãŒ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ã«ç¶æ ãæž¡ããšãã§ãã
![](https://habrastorage.org/getpro/habr/post_images/260/c8c/58e/260c8c58ef4fe726eacda0250a6108af.png)
ã¡ãã»ãŒãžãçæããããã«ããããã¯ãŒã¯ã¢ãžã¥ãŒã«ã¯åžžã«æ¬¡ã®ããšãè¡ããŸãã
- ã²ãŒã ã®äžè¬çãªç¶æ ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã®æ¬¡ã®ã¹ãããã«ã³ããŒããŸãã
- å¥ã®ã¹ãããã·ã§ãããšæ¯èŒããŸãã
ããã次ã®ç»åã«èŠããããã®ã§ãã
- ã²ãŒã ã®äžè¬çãªç¶æ ïŒMaster gamestateïŒã¯ãã€ã³ããã¯ã¹0ã§Client1ã®å±¥æŽã«ã³ããŒãããŸãïŒçŸåšã¯ãSnapshot1ããšåŒã°ããŠããŸãã
- ããã¯æåã®æŽæ°ã§ãããããClient1ã®å±¥æŽã«ã¯æ£ããã¹ãããã·ã§ãããååšããããããšã³ãžã³ã¯ãã¹ãŠã®ãã£ãŒã«ãããªã»ããããã空ã®ã¹ãããã·ã§ããããããŒã¹ãããã·ã§ãããã䜿çšããŸãã åãã£ãŒã«ãã¯NetChannelã«éä¿¡ããããããããã«ããå®å šãªæŽæ°ãè¡ãããŸãã
![](https://habrastorage.org/getpro/habr/post_images/044/4a6/720/0444a67205e9c39364b725220a2ae768.png)
ããã§æãéèŠãªããšã¯ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã«æ£ããã¹ãããã·ã§ãããå«ãŸããŠããªãå Žåããšã³ãžã³ã空ã®ã¹ãããã·ã§ãããååŸããŠãã«ã¿ã¡ãã»ãŒãžãçæããããšãç解ããããšã§ãã ããã«ããã132ãããã§ã¯ã©ã€ã¢ã³ãã«å®å šãªæŽæ°ãéä¿¡ãããŸãïŒåãã£ãŒã«ãã®åã«ã¯ãããããŒã¯ã³ ïŒïŒ
[1 A_on32bits 1 B_on32bits 1 B_on32bits 1 C_on32bits]
ã
ãã¬ãŒã 2ãµãŒããŒïŒ
次ã«ãå°ãå ã«é²ãã§ã¿ãŸãããããµãŒããŒã®2çªç®ã®ãã¬ãŒã ã§ãã ã芧ã®ããã«ãåã¯ã©ã€ã¢ã³ãã¯ã³ãã³ããéä¿¡ããããããã¹ãŠãã²ãŒã ã®äžè¬çãªç¶æ ã«åœ±é¿ãäžããŸããããã¹ã¿ãŒgamestateïŒClient2ã¯Y軞ã«æ²¿ã£ãŠç§»åãããããpos [1]ã¯EïŒéïŒã«çãããªããŸãã Client1ãã³ãã³ããéä¿¡ããŸããããããã«éèŠãªããšã«ã以åã®æŽæ°ã®åä¿¡ã確èªãããããSnapshot1ã¯ç¢ºèªæžã¿ïŒãACKãïŒãšããŠããŒã¯ãããŸããã
![](https://habrastorage.org/getpro/habr/post_images/440/cf4/932/440cf49322d5563fa77e0c373b1d2d2e.png)
åãããã»ã¹ãå®è¡ãããŸãã
- ã²ãŒã ã®äžè¬çãªç¶æ ã¯ã次ã®ã¯ã©ã€ã¢ã³ãå±¥æŽã¹ãããã«ã³ããŒãããŸãïŒïŒã€ã³ããã¯ã¹1ïŒïŒããã¯Snapshot2ã§ã
- ä»åã¯ãã¯ã©ã€ã¢ã³ãã®å±¥æŽã«æ£ããã¹ãããã·ã§ããããããŸãïŒsnapshot1ïŒã ããã2ã€ã®ã¹ãããã·ã§ãããæ¯èŒãã
ãã®çµæãéšåçãªæŽæ°ã®ã¿ããããã¯ãŒã¯çµç±ã§éä¿¡ãããŸãïŒpos [1] = EïŒã ããããã®ãã¶ã€ã³ã®çŸããã§ããããã»ã¹ã¯åžžã«åãã§ãã
![](https://habrastorage.org/getpro/habr/post_images/4fc/a81/b40/4fca81b404ae1a2bc00b0654c4949394.png)
泚ïŒåãã£ãŒã«ãã®åã«ã¯ãããããŒã«ãŒ ïŒ1 =å€æŽã0 =å€æŽãªãïŒããããããäžèšã®äŸã®éšåçãªæŽæ°ã«ã¯36ãããã䜿çšãããŸãïŒ
[0 1 32bitsNewValue 0 0]
ã
ãã¬ãŒã 3ãµãŒããŒïŒ
ã·ã¹ãã ã倱ãããããã±ãŒãžãã©ã®ããã«åŠçããããèŠãããã«ããã«äžæ©é²ãã§ã¿ãŸãããã ãã¬ãŒã 3ã«ãªããŸãããã¯ã©ã€ã¢ã³ãã¯åŒãç¶ãã³ãã³ãããµãŒããŒã«éä¿¡ããŸãã
Client2ã¯æ害ãåãããã«ã¹ã¯çŸåšHã§ããããããClient1ã¯ææ°ã®æŽæ°ã確èªããŸããã§ããã UDPãµãŒããŒã倱ãããå¯èœæ§ããããã¯ã©ã€ã¢ã³ãACKã倱ãããå¯èœæ§ããããŸããããã®çµæã䜿çšã§ããŸããã
![](https://habrastorage.org/getpro/habr/post_images/a4c/341/275/a4c3412752eaf6f167279b0a002295fb.png)
ããã«ãããããããããã»ã¹ã¯åããŸãŸã§ãã
- ã²ãŒã ã®äžè¬çãªç¶æ ãã¯ã©ã€ã¢ã³ãå±¥æŽã®æ¬¡ã®ã¹ãããã«ã³ããŒããŸãïŒïŒã€ã³ããã¯ã¹2ïŒïŒããã¯Snapshot3ã§ã
- æåŸã®æå¹ãªç¢ºèªæžã¿ã¹ãããã·ã§ããïŒsnapshot1ïŒãæ¯èŒããŸãã
![](https://habrastorage.org/getpro/habr/post_images/1c2/ed7/d05/1c2ed7d05941b0f9bbcf3afe8e1bcfff.png)
ãã®çµæãã¡ãã»ãŒãžã¯éšåçã«éä¿¡ããå€ãå€æŽãšæ°ããå€æŽã®çµã¿åãããå«ã¿ãŸãïŒïŒ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; // ... #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
ãŸãã 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ã€ã®éšåã¯åžžã«ããŒããããŠããŸãã
![](https://habrastorage.org/getpro/habr/post_images/06d/911/c55/06d911c55e261aabc8a643ac37e2665a.png)
- ã¯ã©ã€ã¢ã³ãåŽïŒ2ã€ã®ä»®æ³ãã·ã³ãããŒããããŸãã ã²ãŒã ã®ç¶æ
ã«å¿ããŠãã¡ãã»ãŒãžã¯ãããã®1ã€ã«éä¿¡ãããŸãã
-
cgame
ïŒããã«ãã§ãŒãºã§ã¡ãã»ãŒãžãåä¿¡ããŸãã äžå¯èŠã®ã°ã©ãã£ãã¯ã¹ã®ã¯ãªããã³ã°ãäºæž¬ãããã³renderer.lib
å¶åŸ¡ã®ã¿ãå®è¡ãrenderer.lib
ã -
q3_ui
ïŒã¡ãã¥ãŒã¢ãŒãã§ã¡ãã»ãŒãžãåä¿¡ããŸãã ã·ã¹ãã ã³ãŒã«ã䜿çšããŠã¡ãã¥ãŒãã¬ã³ããªã³ã°ããŸãã
-
- ãµãŒããŒåŽïŒ
-
game
ïŒåžžã«ã¡ãã»ãŒãžãåä¿¡ããã²ãŒã ããžãã¯ãå®è¡ããAIæäœã«bot.lib
ã䜿çšããŸãã
-
QVMå éš
QVMã®äœ¿çšã«ã€ããŠèª¬æããåã«ããã€ãã³ãŒãã®çææ¹æ³ã確èªããŸãããã ãã€ãã®ããã«ãç§ã¯ã€ã©ã¹ããšç°¡åãªä»éããã¹ãã䜿çšããŠèª¬æããããšã奜ã¿ãŸãïŒ
![](https://habrastorage.org/getpro/habr/post_images/10a/f0f/05a/10af0f05ada087bde98a7d422d29b4b0.png)
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ãã¡ã€ã«ã«åéããŸãã
![](https://habrastorage.org/getpro/habr/post_images/845/d4a/c44/845d4ac44899e6f6e6da5daa092c8ddd.png)
ããã§æ¬¡ã®ããšãããããŸãã
- q3asmã¯ãããã¹ããã¡ã€ã«ã®åã€ã³ããŒã/ãšã¯ã¹ããŒãæåãç解ããŸãã
- äžéšã®ã¡ãœããã¯ãã·ã¹ãã ã³ãŒã«ã®ããã¹ããã¡ã€ã«ã§äºåå®çŸ©ãããŠããŸãã ã¯ã©ã€ã¢ã³ãVMããã³ãµãŒããŒVMã® syscallã確èªã§ããŸã ã ã·ã¹ãã ã³ãŒã«ã·ã³ãã«ã«ã¯ãã€ã³ã¿ãŒããªã¿ãŒãèªèã§ããããã«ãè² ã®æŽæ°å€ã®åœ¢åŒã®å±æ§ããããŸãã
- q3asmã¯ãã¹ããŒã¹ãšé床ã確ä¿ããããã«ãã¬ãŒã³ããŒã·ã§ã³ãããã¹ããããã€ããªã«å€æŽããŸãããããã§ã¯æé©åã¯è¡ãããŸããã
- çµã¿ç«ãŠãããæåã®ã¡ãœããã¯ãå
¥åã¡ãã»ãŒãžãããŒãžã£ã§ããããã
vmMain
ã§ããå¿ èŠããããŸãã ããã«ããã€ãã³ãŒãã®0x2D
ããã¹ãã»ã°ã¡ã³ãã«0x2D
ããŠããå¿ èŠããããŸãã
QVMïŒä»çµã¿
ç¹°ãè¿ããŸãããã¹ã±ãžã¥ãŒãªã³ã°ãå®è¡ããäžæã®ãšã³ããªãã€ã³ããšäžæã®åºå£ãã€ã³ãã瀺ãç»åïŒ
![](https://habrastorage.org/getpro/habr/post_images/04f/f05/ea7/04ff05ea7fc1635298d262a3ca824c7f.png)
ããã€ãã®è©³çŽ°ïŒ
ã¡ãã»ãŒãžïŒ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 , :
![](https://habrastorage.org/getpro/habr/post_images/899/35b/869/89935b869c382c9d33ebf10da2a20cbe.png)
, :
- 解éããããã€ãã³ãŒã
- x86ã³ãã³ãã«ã³ã³ãã€ã«ããããã€ãã³ãŒã
- Windows DLLã«ã³ã³ãã€ã«ãããã³ãŒã
æšå¥šèªæž
![](https://habrastorage.org/getpro/habr/post_images/f23/ff8/79a/f23ff879a8a061c15558b82290f3d18e.jpg)
![](https://habrastorage.org/getpro/habr/post_images/86f/219/802/86f219802c8253665457fed5dbe4efc0.png)
![](https://habrastorage.org/getpro/habr/post_images/095/37b/c64/09537bc64c10656d55e9b796d52a8231.png)
人工ç¥èœ
modderã³ãã¥ããã£ã¯ã以åã®ãã¹ãŠã®idTechãšã³ãžã³çšã®ãããã·ã¹ãã ãäœæããŸããããã€ãŠã2ã€ã®ã·ã¹ãã ãéåžžã«æåã§ããã
- Quake1ã¯Omicronã§ããã
- Quake2ã§GladiatorãäœæããŸããã
ããããidTech3ã®å Žåããããã·ã¹ãã ã¯ã²ãŒã ãã¬ã€ã®åºæ¬çãªéšåã§ãã£ãããã瀟å ã§éçºããå¿ èŠããããæåã¯ã²ãŒã ã«ååšããå¿ èŠããããŸãããããããéçºäžã«æ·±å»ãªåé¡ãçºçããŸããã
åºå žïŒMasters of Doomããã¯ã®275ããŒãžïŒ
â . â , . , . Quake III, , . .
, . , , , . .
, , . , , . . 1999 , .
建ç¯
- (Mr.Elusive), , «Omicron» «Gladiator». ,
bot.lib
:
![](https://habrastorage.org/getpro/habr/post_images/4b5/701/93f/4b570193fcddd75148251154d01b9a3a.png)
, - (Jean-Paul van Waveren)
103- . , (Alex J. Champandard) , , . Quake3.