
2011幎11æ23æ¥idãœãããŠã§ã¢ã¯ç¬èªã®äŒçµ±ãç¶æãã以åã®ãšã³ãžã³ã®ãœãŒã¹ã³ãŒããå ¬éããŸããã
ä»åã¯ãPreyãQuake 4ããããŠãã¡ããDoom 3ã§äœ¿çšãããŠããidTech4ãç»å ŽããŸãã ããããæ°æéã§ãGitHubã«400ãè¶ ãããªããžããªã®ãã©ãŒã¯ãäœæããã人ã ã¯ã²ãŒã ã®å éšã¡ã«ããºã ã調ã¹ãããä»ã®ãã©ãããã©ãŒã ã«ç§»æ€ãããããŸããã ãŸããåå ããããšã«æ±ºããMac OS Xçšã®IntelããŒãžã§ã³ãäœæããŸãããJohnCarmackã芪åã«å®£äŒããŸãã ã
ã¯ãªãŒã³ããšã³ã¡ã³ãã®èŠ³ç¹ãããããã¯ã Doom iPhoneã³ãŒãããŒã¹ïŒåŸã§ãªãªãŒã¹ããããããã³ã¡ã³ãã¢ãŠãããã»ããããïŒä»¥æ¥ã®id Softwareã³ãŒãã®æé«ã®ãªãªãŒã¹ã§ãã ãã®ãšã³ãžã³ãç 究ããçµã¿ç«ãŠãå®éšããããšã匷ããå§ãããŸãã
ããã«ç§ãç解ããããšã«é¢ããã¡ã¢ããããŸãã ãã€ãã®ããã«ãç§ã¯ãããããããã«ããŸããã圌ããæ°æé誰ããæã£ãŠããããŠåœŒãã®ããã°ã©ããŒã¹ãã«ãæ¹åããããã«ã³ãŒããåŠã¶ããã«èª°ãã奚å±ããããšãæã¿ãŸãã
ããŒã1ïŒæŠèŠ
ã³ãŒãããŒã¹ã説æããããã«ããŸããŸãå€ãã®ã€ã©ã¹ãã䜿çšããããã¹ããæžãããŠããããšã«æ°ä»ããŸããã 以åã¯ãã®ããã«gliffyã䜿çšããŠããŸããããé¢åãªå¶éããããŸãïŒããšãã°ãã¢ã«ãã¡ãã£ãã«ã®æ¬ åŠïŒã SVGãšJavascriptã«åºã¥ããŠã3Dãšã³ãžã³ã®ã€ã©ã¹ãå°çšã«ç¬èªã®ããŒã«ãäœæããããšãæ€èšããŠããŸãã 䌌ããããªãã®ãæ¢ã«ããã®ã§ããããïŒ ãŸããã³ãŒãã«æ»ã£ãŠ...
ã¯ããã«
ãã®ãããªçŽ æŽããããšã³ãžã³ã®ãœãŒã¹ã³ãŒãã«ã¢ã¯ã»ã¹ã§ããããšã¯éåžžã«çŽ æŽãããããšã§ãã 2004幎ã®ãªãªãŒã¹ã®æç¹ã§ãDoom IIIã¯ãªã¢ã«ã¿ã€ã ãšã³ãžã³ã®æ°ããã°ã©ãã£ãã¯ã¹ãšãµãŠã³ãã®æšæºãèšå®ããŸããããã®äžã§æã泚ç®ãã¹ããã®ã¯ãUnified Lighting and Shadowsã§ããã ãã¯ãããžãŒã«ãããã¢ãŒãã£ã¹ãã¯ããªãŠããã®ãã¡ãã·ã§ã³ã§èªåèªèº«ãè¡šçŸã§ããããã«ãªããŸããã 8幎åŸã§ããDelta-Labs-4ã§ã®HellKnightãšã®æåã®äŒè°ã¯äŸç¶ãšããŠä¿¡ããããªãã»ã©å£®èŠ³ã§ãã
æåã®é£çµ¡
ãœãŒã¹ã³ãŒãã¯Githubãä»ããŠé åžãããããã«ãªããŸãããããã¯ãIDãœãããŠã§ã¢FTPãµãŒããŒãã»ãŒåžžã«çœ®ãããŠããããéè² è·ã«ãªã£ãŠããããã§ãã

ãªãªãžãã«ã® TTimo ãªãªãŒã¹ã¯ ãVisual Studio 2010 Professionalã䜿çšããŠæ£åžžã«ã³ã³ãã€ã«ãããŸãã æ®å¿µãªãããVisual Studio 2010 "Express"ã«ã¯MFCããªãããã䜿çšã§ããŸããã ãªãªãŒã¹åŸãããã¯å°ãæ®å¿µã§ããã äŸåé¢ä¿ã¯åé€ãããŸãã ã
Windows 7 :
===========
git clone https://github.com/TTimo/doom3.gpl.git

ã³ãŒãã®èªã¿åããšèª¿æ»ã«ã¯ãMac OS Xã§Xcode 4.0ã䜿çšããããšã奜ã¿ãŸããSpotLightããã®æ€çŽ¢é床ãå€æ°ã®åŒ·èª¿è¡šç€ºãé©åãªå Žæã«ç§»åããããã®ãã³ãã³ãã¯ãªãã¯ãã«ãããVisual Studioãããäœæ¥ã䟿å©ã«ãªããŸãã Xcodeãããžã§ã¯ãã¯ãªãªãŒã¹äžã«ç ŽæããŸããããä¿®æ£ããã®ã¯éåžžã«ç°¡åã§ãããMac OS X Lionã§æ£åžžã«åäœãããŠãŒã¶ãŒãäžè¯ã»ã¯ã¿ãŒãã®GithubãªããžããªããããŸãã
MacOS X :
=========
git clone https://github.com/badsector/Doom3-for-MacOSX-
æ³šïŒ Visual Studio 2010 Productivity Power Toolsãã€ã³ã¹ããŒã«ããåŸãVisual Studio 2010ã§å€æ°ã匷調衚瀺ããŠãControl-Clickããã¯ãªãã¯ããããšãã§ããŸã ã ããããããã©ãã€ã³ã¹ããŒã«ããã±ãŒãžã«å«ãŸããŠããªãçç±ãããããŸããã
äž¡æ¹ã®ã³ãŒãããŒã¹ãæé©ãªç¶æ ã«ãªããŸããã1åã¯ãªãã¯ããã ãã§å®è¡å¯èœãã¡ã€ã«ããã«ãã§ããŸãã
- ã³ãŒããããŠã³ããŒãããŸãã
- F8 / Command-BãæŒããŸãã
- èµ°ããŸãïŒ
èå³æ·±ãäºå®ïŒã²ãŒã ãéå§ããã«ã¯ãDoom 3ãªãœãŒã¹ãå«ã
base
ãã©ã«ããŒãå¿ èŠã§ããDoom3 CDããããããæœåºããŠæŽæ°ããã®ã«æéãç¡é§ã«ããããªãã£ãã®ã§ãSteamããããŒãžã§ã³ãããŠã³ããŒãããŸããã å ¬éãããVisual Studioãããžã§ã¯ãã®ãããã°èšå®ã«
"+set fs_basepath C:\Program Files (x86)\Steam\steamapps\common\doom 3"
ããŸã ãããããid Softwareã®äººãã¡ãåãããšãããããã§ãïŒ
èå³æ·±ãäºå®ïŒãã®ãšã³ãžã³ã¯Visual Studio .NETïŒ ãœãŒã¹ ïŒã§éçºãããŸããã ãã ããã³ãŒãå ã®CïŒã«ã¯åäžè¡ããªããã³ã³ãã€ã«çšã«å ¬éãããããŒãžã§ã³ã«ã¯Visual Studio 2010 Professionalãå¿ èŠã§ãã
èå³æ·±ãäºå®ïŒ Id SoftwareããŒã ã¯Matrixãã©ã³ãã£ã€ãºã®ãã¡ã³ã§ããããã§ããQuakeIIIã®ã¯ãŒãã³ã°ããŒã ã¯ãTrinityãã§ãDoom IIIã®ã¯ãŒãã³ã°ããŒã ã¯ãNeoãã§ãã ããã¯ããã¹ãŠã®ãœãŒã¹ã³ãŒãã
neo
ãµããã©ã«ããŒã«ããçç±ã説æããŠããŸãã
建ç¯
ã²ãŒã ã¯ããšã³ãžã³ã®å šäœçãªã¢ãŒããã¯ãã£ãåæ ãããããžã§ã¯ãã«åå²ãããŸãã
ãããžã§ã¯ã
| çµç«
| 泚é
| |
---|---|---|---|
çª
| Mac OS X
| ||
ã²ãŒã
| gamex86.dll
| gamex86.so
| Doom3ã²ãŒã ãã¬ã€
|
Game-d3xp
| gamex86.dll
| gamex86.so
| ã²ãŒã ãã¬ã€Doom3 eXPensionïŒRessurectionïŒ
|
MayaImport
| MayaImport.dll
| - | ãªãœãŒã¹äœæããŒã«ãã§ãŒã³ã®äžéšïŒMayaãã¡ã€ã«ãéããã¢ã³ã¹ã¿ãŒãã«ã¡ã©ã«ãŒããããããã€ã³ããŒãããããã«å®è¡æã«ããŒããããŸãã
|
éåœ3
| Doom3.exe
| Doom3.app
| ãã¥ãŒã 3ãšã³ãžã³
|
Typeinfo
| TypeInfo.exe
| - | RTTIå
éšãã«ããŒãã¡ã€ã«ïŒ GameTypeInfo.h
çæããŸãã GameTypeInfo.h
ã¯ããã¹ãŠã®ã¿ã€ãã®Doom3ã¯ã©ã¹ãšåèŠçŽ ã®ãµã€ãºã®ãããã§ãã ããã«ãããTypeInfoã¯ã©ã¹ã䜿çšããŠã¡ã¢ãªããããã°ã§ããŸãã |
ã«ãŒã«ãªã
| Curllib.lib
| - | ãã¡ã€ã«ã®ããŠã³ããŒãã«äœ¿çšãããHTTPã¯ã©ã€ã¢ã³ãïŒgamex86.dllããã³doom3.exeã«éçã«ãªã³ã¯ïŒã
|
idLib
| idLib.lib
| idLib.a
| IDãœãããŠã§ã¢ã©ã€ãã©ãªã ããŒãµãŒãã¬ãã·ã«ã«ã¢ãã©ã€ã¶ãŒãèŸæž...ïŒéçã«gamex86.dllããã³doom3.exeã«ãªã³ã¯ïŒãå«ãŸããŠããŸãã
|
idTech2ããå§ãŸãä»ã®ãã¹ãŠã®ãšã³ãžã³ãšåæ§ã«ã1ã€ã®ã¯ããŒãºããœãŒã¹ãã€ããªãã¡ã€ã«ïŒdoom.exeïŒãš1ã€ã®ãªãŒãã³ãœãŒã¹ãã€ãããã¯ã©ã€ãã©ãªïŒgamex86.dllïŒã衚瀺ãããŸãã

ã³ãŒãããŒã¹ã®ã»ãšãã©ã¯ã2004幎10æ以éDoom3 SDKã§å©çšå¯èœã«ãªããŸããããDoom3å®è¡å¯èœãã¡ã€ã«ã®ãœãŒã¹ã³ãŒãã®ã¿ãæ¬ èœããŠããŸããã Modderã¯
idlib.a
ããã³
gamex86.dll
ãã«ãã§ããŸãããããšã³ãžã³ã³ã¢ã¯ãŸã éããããŠããŸããã
泚ïŒãšã³ãžã³ã¯æšæºC ++ã©ã€ãã©ãªã䜿çšããŸããããã¹ãŠã®ã³ã³ãããŒïŒãããããã€ã³ã¿ãŒä»ããªã¹ã...ïŒã¯æ°ãã«å®è£ ãããŸããã
libc
ãç©æ¥µçã«äœ¿çšãããŸãã
æ³šïŒ Gameã¢ãžã¥ãŒã«ã§ã¯ãåã¯ã©ã¹ã¯idClassãç¶æ¿ããŸãã ããã«ããããšã³ãžã³ã¯å éšRTTIãå®è¡ããã¯ã©ã¹åã§ã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åã§ããŸãã
èå³æ·±ãäºå®ïŒãã®å³ãèŠããšãå¿ èŠãªãã¬ãŒã ã¯ãŒã¯ïŒ
Filesystem
ãªã©ïŒã®äžéšãDoom3.exeãããžã§ã¯ãã«ããããšãããããŸãã gamex86.dllããªãœãŒã¹ãããŒãããå¿ èŠããããããããã¯åé¡ãåŒãèµ·ãããŸãã ãããã®ãµãã·ã¹ãã ã¯ãdoom3.exeããgamex86.dllã©ã€ãã©ãªã«ãã£ãŠåçã«ããŒããããŸãïŒãããå³ã®ç¢å°ã®æå³ã§ãïŒã PEãšã¯ã¹ãããŒã©ãŒã§DLLãéããšãgamex86.dllã1ã€ã®ã¡ãœããGetGameAPIããšã¯ã¹ããŒãããŠããããšãããããŸãã

ãªããžã§ã¯ãã«ãã€ã³ã¿ãŒãæž¡ãããšã§ãQuake2ãã¬ã³ãã©ãŒãšã²ãŒã ã®ddlãããŒãããã®ãšãŸã£ããåãããã«æ©èœããŸãã
Doom3.exeãããŒãããããšã次ã®ããã«ãªããŸãã
-
LoadLibrary
ã䜿çšããŠDLLãããã»ã¹ã¡ã¢ãªç©ºéã«ããŒãããŸãã -
GetProcAddress
win32ã䜿çšããŠãdllã®GetGameAPI
ã¢ãã¬ã¹ãååŸããŸãã -
GetGameAPI
åŒã³åºãGetGameAPI
ã
gameExport_t * GetGameAPI_t( gameImport_t *import );
ãã®ãæ¥ç¶ã»ããã¢ãããDoom3.exeã®æåŸã«ã¯ã
idGame
ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒããããGame.dllã«ã¯ãæ¬ èœããŠãããã¹ãŠã®ãµãã·ã¹ãã ãžã®è¿œå ãªã³ã¯ïŒäŸïŒ
idFileSystem
ãå«ã
gameImport_t
ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒããããŸãã
Gamex86ãDoom 3å®è¡å¯èœãªããžã§ã¯ããèªèããæ¹æ³ïŒ
typedef struct { int version; // API idSys * sys; // idCommon * common; // idCmdSystem * cmdSystem // idCVarSystem * cvarSystem; // idFileSystem * fileSystem; // idNetworkSystem * networkSystem; // idRenderSystem * renderSystem; // idSoundSystem * soundSystem; // idRenderModelManager * renderModelManager; // idUserInterfaceManager * uiManager; // idDeclManager * declManager; // idAASFileManager * AASFileManager; // AAS idCollisionModelManager * collisionModelManager; // } gameImport_t;
Doom 3ãGame / Moddãªããžã§ã¯ããèªèããæ¹æ³ïŒ
typedef struct { int version; // API idGame * game; // idGameEdit * gameEdit; // } gameExport_t;
泚ïŒåãµãã·ã¹ãã ãããããç解ããããã®åªãããªãœãŒã¹ã¯ã Doom3 SDKããã¥ã¡ã³ãããŒãžã§ãã2004幎ã«ã³ãŒããæ·±ãç解ãã人ïŒã€ãŸããéçºããŒã ã®1人ïŒã«ãã£ãŠæžãããããã§ãã
ã³ãŒã
解æããåã«ã
cloc
ããã®çµ±èšã以äžã«ç€ºããŸãã
./cloc-1.56.pl neo
2180 text files.
2002 unique files.
626 files ignored.
http://cloc.sourceforge.net v 1.56 T=19.0 s (77.9 files/s, 47576.6 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C++ 517 87078 113107 366433
C/C++ Header 617 29833 27176 111105
C 171 11408 15566 53540
Bourne Shell 29 5399 6516 39966
make 43 1196 874 9121
m4 10 1079 232 9025
HTML 55 391 76 4142
Objective C++ 6 709 656 2606
Perl 10 523 411 2380
yacc 1 95 97 912
Python 10 108 182 895
Objective C 1 145 20 768
DOS Batch 5 0 0 61
Teamcenter def 4 3 0 51
Lisp 1 5 20 25
awk 1 2 1 17
-------------------------------------------------------------------------------
SUM: 1481 137974 164934 601047
-------------------------------------------------------------------------------
éåžžãã³ãŒãã®è¡æ°ã§æ確ãªããšãèšãããšã¯ã§ããŸããããããã§ã¯ãšã³ãžã³ãç解ããããã«å¿ èŠãªäœæ¥ãè©äŸ¡ããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã ã³ãŒãã«ã¯601,047è¡ãããŸããã€ãŸãããšã³ãžã³ã¯Quake IIIã®2åãç解ããå°é£ã§ãã ã³ãŒãã®è¡æ°ã«ãããidãœãããŠã§ã¢ãšã³ãžã³ã®å±¥æŽã«é¢ããçµ±èšïŒ
ã³ãŒãã®è¡ | éåœ | idTech1 | idTech2 | idTech3 | idTech4 |
ãšã³ãžã³ | 39079 | 143855 | 135788 | 239398 | 601032 |
ããŒã« | 341 | 11155 | 28140 | 128417 | - |
åèš | 39420 | 155010 | 163928 | 367815 | 601032 |

æ³šïŒ idTech3ã®ããªã¥ãŒã ã®å€§å¹ ãªå¢å ã¯ãlccã³ãŒãããŒã¹ã®ããŒã«ã«ãããã®ã§ããïŒCã³ã³ãã€ã©ãŒã䜿çšããŠQVMãã€ãã³ãŒããçæããŸããïŒã
æ³šïŒ Doom3ã®å ŽåãããŒã«ã¯ãšã³ãžã³ã³ãŒãããŒã¹ã«å«ãŸããŠãããããèæ ®ãããŸããã
é«ã¬ãã«ã§ã¯ãããã€ãã®é¢çœãäºå®ã«æ°ä»ãããšãã§ããŸãã
- id Softwareã®æŽå²ã®äžã§åããŠãã³ãŒãã¯Cã§ã¯ãªãC ++ã§æžãããŸãããJohnCarmack ã¯ãããã€ã³ã¿ãã¥ãŒã§èª¬æããŸããã
- ã³ãŒãã¯ãæœè±¡åãšããªã¢ãŒãã£ãºã ãç©æ¥µçã«äœ¿çšããŠããŸãã ãã ããèå³æ·±ãããªãã¯ã䜿çšãããšãäžéšã®ãªããžã§ã¯ãã§vtableã®ããã©ãŒãã³ã¹ãäœäžããããšãåé¿ã§ããŸãã
- ãã¹ãŠã®ãªãœãŒã¹ã¯ã人éãèªããããã¹ã圢åŒã§ä¿åãããŸãã ãã以äžã®ãã€ããªã¯ãããŸããã ã³ãŒãã¯ãåå¥è§£æåš/ããŒãµãŒãç©æ¥µçã«äœ¿çšããŸãã ãžã§ã³ã»ã«ãŒããã¯ã¯ããã«ã€ããŠã€ã³ã¿ãã¥ãŒã§è©±ããŸããã
- ãã³ãã¬ãŒãã¯äœã¬ãã«ã®ãã«ããŒã¯ã©ã¹ïŒäž»ã«idLibïŒã§äœ¿çšãããŸãããäžäœã¬ãã«ã§ã¯äœ¿çšãããªããããã³ãŒãã¯Google V8ãšã¯ç°ãªããç®ãåºè¡ãããŸããã
- ã³ã¡ã³ãã®èŠ³ç¹ããã¯ãããã¯2çªç®ã«é«å質ã®idãœãããŠã§ã¢ã³ãŒãããŒã¹ã§ããã Doom iPhoneã®æ¹ãåªããŠããŸãã ã³ã¡ã³ãã®30ïŒ ã¯äŸç¶ãšããŠååºããçµæã§ããããã®ãããªååã«ææžåããããããžã§ã¯ããèŠã€ããããšã¯éåžžã«ãŸãã§ãïŒ ã³ãŒãã®äžéšïŒdmapã»ã¯ã·ã§ã³ãåç §ïŒã«ã¯ãã³ãŒããããå€ãã®ã³ã¡ã³ãããããŸãã
- OOPã«ãã»ã«åã«ãããã³ãŒããããç°¡æœã«ãªããèªã¿ããããªããŸããã
- äœã¬ãã«ã®ã¢ã»ã³ããªæé©åã®æ代ã¯éããŸããã
idMath::InvSqrt
ãšç©ºéããŒã«ãªãŒãŒã·ã§ã³ã®æé©åãªã©ã®ããã€ãã®ããªãã¯ã¯ä¿æãããŸããããåºæ¬çã«ã³ãŒãã¯äœ¿çšå¯èœãªããŒã«ïŒGPUã·ã§ãŒããŒãOpenGL VBOãSIMDãAltivecãSMPãL2æé©åïŒã¢ãã«åŠççšã®R_AddModelSurfaces
ïŒïŒã®ã¿ã䜿çšããŠããŸãã
John Carmackã«ãã£ãŠæžãããidTech4 Code Writing Standard ïŒ Mirror ïŒãèŠãã®ãèå³æ·±ãã§ãïŒç¹ã«ã
const
ã®å Žæã«é¢ããã³ã¡ã³ãã«æè¬ããŸãïŒã
ãµã€ã¯ã«ãæ¡å€§ãã
ãšã³ãžã³ã®æãéèŠãªéšåã§ã®ã¡ã€ã³ãµã€ã¯ã«ã®åæã¯æ¬¡ã®ãšããã§ãã
idCommonLocal commonLocal; // idCommon * common = &commonLocal; // ( Init , ) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Sys_SetPhysicalWorkMemory( 192 << 20, 1024 << 20 ); //Min = 201,326,592 Max = 1,073,741,824 Sys_CreateConsole(); // , : "" ( ) . for (int i = 0; i < MAX_CRITICAL_SECTIONS; i++ ) { InitializeCriticalSection( &win32.criticalSections[i] ); } common->Init( 0, NULL, lpCmdLine ); // VRAM ( OpenGL, ) Sys_StartAsyncThread(){ // . while ( 1 ){ usleep( 16666 ); // 60 common->Async(); // Sys_TriggerEvent( TRIGGER_EVENT_ONE ); // , pthread_testcancel(); // , ( ). } } Sys_ShowConsole while( 1 ){ Win_Frame(); // / common->Frame(){ session->Frame() // { for (int i = 0 ; i < gameTicsToRun ; i++ ) RunGameTic(){ game->RunFrame( &cmd ); // GameX86.dll. for( ent = activeEntities.Next(); ent != NULL; ent = ent->activeNode.Next() ) ent->GetPhysics()->UpdateTime( time ); // } } session->UpdateScreen( false ); // { renderSystem->BeginFrame idGame::Draw // . ! renderSystem->EndFrame R_IssueRenderCommands // . . } } } }
å®å šã«å解ããããµã€ã¯ã«ã®è©³çŽ°ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã ã³ãŒããèªããšããç§ã¯ãããããããšããŠäœ¿çšããŸããã
ããã¯idãœãããŠã§ã¢ãšã³ãžã³ã®æšæºã¡ã€ã³ã«ãŒãã§ãã
Sys_StartAsyncThread
é€ããŸããããã¯ãDoom3ããã«ãã¹ã¬ããã§ããããšãæå³ããŸãã ãã®ã¹ããªãŒã ã®ç®çã¯ããšã³ãžã³ããã¬ãŒã ã¬ãŒãã«ãã£ãŠå¶éããŠã¯ãªããªãã¿ã€ã ã¯ãªãã£ã«ã«ãªæ©èœã管çããããšã§ãã
- é³ã®ããã·ã³ã°ã
- ãŠãŒã¶ãŒå ¥åã®çæã
èå³æ·±ãäºå®ïŒãã¹ãŠã®idTech4ãããã¬ãã«ãªããžã§ã¯ãã¯ä»®æ³ã¡ãœãããæã€æœè±¡ã¯ã©ã¹ã§ãã éåžžãããã¯ããã©ãŒãã³ã¹ãäœäžãããŸããåä»®æ³ã¡ãœããã®ã¢ãã¬ã¹ã¯ãå®è¡æã«åŒã³åºãåã«vtableã§èŠã€ããå¿ èŠãããããã§ãã ãããããããåé¿ãããããªãã¯ãããããŸãã ãã¹ãŠã®ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ã¯ã次ã®ããã«éçã«äœæãããŸãã
idCommonLocal commonLocal; // idCommon * common = &commonLocal; // gamex86.dll
ããŒã¿ã»ã°ã¡ã³ãã«éçã«é 眮ããããªããžã§ã¯ãã¯æ¢ç¥ã®åã§ãããããã³ã³ãã€ã©ã¯
commonLocal
ã¡ãœãããåŒã³åºããšãã«vtableã®æ€çŽ¢ãæé©åã§ããŸãã æ¥ç¶ïŒãã³ãã·ã§ã€ã¯ïŒã確ç«ãããšããã€ã³ã¿ãŒãã§ã€ã¹ãã€ã³ã¿ãŒã䜿çšãããããã
doom3.exe
ã¯ãªããžã§ã¯ãåç §ã
gamex86.dll
ãšäº€æã§ããŸããããã®å Žåãvtableã§ã®æ€çŽ¢ã®ã³ã¹ãã¯æé©åãããŸããã
èå³æ·±ãäºå®ïŒ id Softwareãšã³ãžã³ã®ã»ãšãã©ãç 究ããçµæãdoom1ãšã³ãžã³ä»¥æ¥ãã¡ãœããåãå€æŽãããŠããªãããšã¯æ³šç®ã«å€ããŸããããŠã¹å ¥åãšãžã§ã€ã¹ãã£ãã¯ãèªã¿åãã¡ãœããã¯
IN_frame()
ã§ãã
ã¬ã³ãã©ãŒ
2ã€ã®éèŠãªéšåïŒ
- Doom3ã¯ããŒã¿ã«ã·ã¹ãã ã䜿çšããããã
dmap
åŸæ¥ã®bspãªã³ã«ãŒãšdmap
ãŸã£ããç°ãªããŸãã é¢é£ããã»ã¯ã·ã§ã³ã§ä»¥äžã確èªããŸããã
- ã©ã³ã¿ã€ã ã¬ã³ãã©ãŒã«ã¯éåžžã«èå³æ·±ãã¢ãŒããã¯ãã£ããããŸãã ããã³ããšã³ããšããã¯ãšã³ãã®2ã€ã®éšåã«åãããŠããŸãïŒããã«ã€ããŠã¯ã以äžã®ã¬ã³ãã©ãŒã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãïŒã
ãããã¡ã€ãªã³ã°
Xcodeã®Instrumentsã䜿çšããŠãCPUãµã€ã¯ã«ãäœãããŠãããã確èªããŸããã çµæãšåæã«ã€ããŠã¯ã以äžã®ããããã¡ã€ãªã³ã°ãã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
ã¹ã¯ãªãããšä»®æ³ãã·ã³
å補åã§ã¯ãidTech VMãšã¹ã¯ãªããèšèªãå®å šã«å€æŽãããŸãã...ãããŠidãå床å€æŽããŸããïŒè©³çŽ°ã«ã€ããŠã¯ããã¹ã¯ãªããVMãã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããïŒ
ã€ã³ã¿ãã¥ãŒ
ã³ãŒããèªãã§ããéãç§ã¯ããã€ãã®é©æ°ã«æžæã£ãŠããã®ã§ããžã§ã³ã»ã«ãŒããã¯ã«æçŽãæžããŸããã
- C ++ã
- ã¬ã³ãã©ãŒã2ã€ã®éšåã«åå²ããŸãã
- ããã¹ããªãœãŒã¹ã
- 解éããããã€ãã³ãŒãã
ããã«ãç§ã¯1ããŒãžã«ãã¹ãŠã®ãããªãšidTech4ã«ã€ããŠã®ãã¹ã³ããšã®ã€ã³ã¿ãã¥ãŒãéããŸããã ãããã¯ãã¹ãŠã€ã³ã¿ãã¥ãŒããŒãžã§åéãããŸã ã
ããŒã2ïŒDmap
ãã¹ãŠã®id Softwareãšã³ãžã³ãšåæ§ã«ãèšèšããŒã ã«ãã£ãŠäœæãããã«ãŒãã¯ããŠãŒãã£ãªãã£ã«ãã匷åãªäºååŠçãåããŠãå®è¡æã®ããã©ãŒãã³ã¹ãåäžãããŸãã
idTech4ã§ã¯ããã®ãŠãŒãã£ãªãã£ã¯
dmap
ãšåŒã°ãããã®ç®çã¯
.map
ãã¡ã€ã«ããå€é¢äœããã¹ãŒããèªã¿åããããŒã¿ã«ã«ãã£ãŠæ¥ç¶ãããé åãç¹å®ãã
.proc
ãã¡ã€ã«ã«ä¿åããããšã§ãã
ãã®ããŒã«ã®ç®çã¯ã
doom3.exe
ã©ã³ã¿ã€ã ããŒã¿ã«ã·ã¹ãã ã䜿çšããããš
doom3.exe
ã Seth Tellerã«ãã1992幎ã®é©ãã¹ãèšäºããããŸã ã ãå¯éããå€é¢äœç°å¢ã§ã®å¯èŠæ§ã®èšç®ã idTech4ãšã³ãžã³ãã©ã®ããã«æ©èœãããã«ã€ããŠãå€ãã®å³ãšãšãã«è©³çŽ°ã«èª¬æããŸãã
ãšãã£ã¿ãŒ
ãã¶ã€ããŒã¯ãCSGïŒConstructive Solid GeometryïŒã䜿çšããŠã¬ãã«ããããäœæããŸããéåžžã6ã€ã®é¢ãæã€å€é¢äœã䜿çšããŠããããäžã«é 眮ããŸãã
ãããã®ãããã¯ã¯ããã©ã·ããšåŒã°ããŸãã 次ã®å³ã§ã¯8ã€ã®ãã©ã·ã䜿çšãããŠããŸãïŒåããããã䜿çšããŠå
dmap
ã¹ãããã説æããŸãïŒã
ãã¶ã€ããŒã¯ãå éšãïŒæåã®å³ïŒãããç解ããŠãããããããŸãããã
dmap
ã¯ãã©ã·ããã¹ãŒãã®ã¿ãåãåããå éšãŸãã¯å€éšã«ã¯äœããããŸããïŒ2çªç®ã®å³ïŒã
ãã¶ã€ããŒãèŠããã® | .map
ãã¡ã€ã«ãããã©ã·ãèªã¿åããšãã« Dmap
ã衚瀺ãããã®ã |
![]() | ![]() |

ãã©ã·ã¯ãé¢ã§ã¯ãªããå¹³é¢ãéããŠå®çŸ©ãããŸãã é¢ã®ä»£ããã«å¹³é¢ãå®çŸ©ããã®ã¯éå¹çã«æãããããããŸããããåŸã§2ã€ã®ãµãŒãã§ã¹ãåãå¹³é¢äžã«ãããã©ããã確èªãããšãã«éåžžã«åœ¹ç«ã¡ãŸãã ãã¬ãŒã³ã¯ãåãããã«ãæ¹åä»ããããŠããªããããå éšãŸãã¯å€éšã®éšåã¯ãããŸããã å¹³é¢ã®åãã¯ãããªã¥ãŒã ã®å éšãšå€éšã§ç°ãªãå ŽåããããŸãã
ã³ãŒãã¬ãã¥ãŒ
Dmapã®ãœãŒã¹ã³ãŒãã¯éåžžã«ããã³ã¡ã³ãã¢ãŠããããŠããŸãããã®çªå·ãèŠãŠãã ãããã³ãŒããããã³ã¡ã³ããå€ãã§ãïŒ
bool ProcessModel( uEntity_t *e, bool floodFill ) { bspface_t *faces; // bsp- // faces = MakeStructuralBspFaceList ( e->primitives ); e->tree = FaceBSP( faces ); // , // MakeTreePortals( e->tree ); // FilterBrushesIntoTree( e ); // , bsp if ( floodFill && !dmapGlobals.noFlood ) { if ( FloodEntities( e->tree ) ) { // FillOutside( e ); } else { common->Printf ( "**********************\n" ); common->Warning( "******* leaked *******" ); common->Printf ( "**********************\n" ); LeakFile( e->tree ); // // "" , // -noFlood return false; } } // // , // ClipSidesByTree( e ); // , // , FloodAreas( e ); // BSP- , // , // PutPrimitivesInAreas( e ); // // , // // Prelight( e ); // - T- if ( !dmapGlobals.noOptimize ) { OptimizeEntity( e ); } else if ( !dmapGlobals.noTJunc ) { FixEntityTjunctions( e ); } // - FixGlobalTjunctions( e ); return true; }
0.ã¬ãã«ãžãªã¡ããªã®èªã¿èŸŒã¿
.map
ãã¡ã€ã«ã¯ããšã³ãã£ãã£ã®ãªã¹ãã§ãã ã¬ãã«ã¯ãworldspawnã¯ã©ã¹ãæã€ãã¡ã€ã«å ã®æåã®ãšã³ãã£ãã£ã§ãã ãšã³ãã£ãã£ã«ã¯ãã»ãšãã©åžžã«ãã©ã·ã§ããããªããã£ãã®ãªã¹ããå«ãŸããŠããŸãã æ®ãã®ãšã³ãã£ãã£ã¯ãå æºãã¢ã³ã¹ã¿ãŒããã¬ã€ã€ãŒã®ã¹ããŒã³ãã€ã³ããæŠåšãªã©ã§ãã
Version 2 // 0 { "classname" "worldspawn" // 0 { brushDef3 { ( 0 0 -1 -272 ) ( ( 0.0078125 0 -8.5 ) ( 0 0.03125 -16 ) ) "textures/base_wall/stelabwafer1" 0 0 0 ( 0 0 1 -56 ) ( ( 0.0078125 0 -8.5 ) ( 0 0.03125 16 ) ) "textures/base_wall/stelabwafer1" 0 0 0 ( 0 -1 0 -3776) ( ( 0.0078125 0 4 ) ( 0 0.03125 0 ) ) "textures/base_wall/stelabwafer1" 0 0 0 ( -1 0 0 192 ) ( ( 0.0078125 0 8.5 ) ( 0 0.03125 0 ) ) "textures/base_wall/stelabwafer1" 0 0 0 ( 0 1 0 3712 ) ( ( 0.006944 0 4.7 ) ( 0 0.034 1.90) ) "textures/base_wall/stelabwafer1" 0 0 0 ( 1 0 0 -560 ) ( ( 0.0078125 0 -4 ) ( 0 0.03125 0 ) ) "textures/base_wall/stelabwafer1" 0 0 0 } } // 1 { brushDef3 } // 2 { brushDef3 } } . . . // 37 { "classname" "light" "name" "light_51585" "origin" "48 1972 -52" "texture" "lights/round_sin" "_color" "0.55 0.06 0.01" "light_radius" "32 32 32" "light_center" "1 3 -1" }
åãã©ã·ã¯è€æ°ã®ãã¬ãŒã³ãšããŠèšè¿°ãããŸãã ãã©ã·ã®åŽé¢ã¯é¢ïŒãŸãã¯ãã³ãïŒãšåŒã°ããåé¢ã¯ãã©ã·ã®ä»ã®ãã¹ãŠã®é¢ã§é¢ãããªãã³ã°ããããšã«ãã£ãŠååŸãããŸãã
泚ïŒèªã¿èŸŒã¿æ®µéã§ã¯ãéåžžã«èå³æ·±ãé«éã®ãã¬ãŒã³ããã·ã³ã°ã·ã¹ãã ã䜿çšãããŸãïŒPlane Hashing SystemïŒïŒ
idHashIndex
idPlaneSet
äžã«äœæãããäžèŠã®äŸ¡å€ããããŸãã
1. MakeStructuralBspFaceListããã³FaceBSP
æåã®ã¹ãããã¯ããã€ããªã¹ããŒã¹ããŒãã£ã·ã§ã³ã䜿çšããŠããããã«ããããããšã§ãã ãããã®åäžéæãªé¢ã¯ãåé¢é¢ãšããŠäœ¿çšãããŸãã
次ã®ã»ãã¬ãŒã¿éžæãã¥ãŒãªã¹ãã£ãã¯ã䜿çšãããŸãã
1ïŒãããã«5,000ãŠããã以äžããå ŽåïŒã¹ããŒã¹ã®äžå€®ã§è»žæåå¹³é¢ïŒè»žæŽåå¹³é¢ïŒã䜿çšããŠã«ããããŸãã 以äžã®ç»åã§ã¯ã6000x6000ã®ã¹ããŒã¹ã3åã«ãããããŠããŸãã

2ïŒ 5000ãŠããããè¶ ããããŒããæ®ã£ãŠããªãå ŽåïŒ ãããŒã¿ã«ããšããŒã¯ãããé¢ã䜿çšããŸãïŒãããªã¢ã«
textures/editor/visportal
ïŒã 以äžã®å³ã§ã¯ãããŒã¿ã«ãã©ã·ã¯éã§ããŒã¯ãããŠããŸãã

3ïŒæ®ãã®ãšããžã䜿çšããŸãã ä»ã®ã»ãšãã©ãšåäžç·äžã«ããé¢ãéžæããæå°ã®é¢ãã«ããããŸãã 軞ã¹ããŒãµã奜ãŸããã åé¢é¢ã¯èµ€ã§ããŒã¯ãããŠããŸãã


䜿çšå¯èœãªé¢ããªãå Žåãããã»ã¹ã¯çµäºããŸããBSPããªãŒã®ã·ãŒãå šäœãåžéšå空éã§ãã

2. MakeTreePortals
çŸåšããããã¯åžéšå空éã«åå²ãããŠããŸããããããã®éšå空éã¯ãäºãã«ã€ããŠäœãç¥ããŸããã ãã®ã¹ãããã®ç®æšã¯ãããŒã¿ã«ãèªåçã«äœæããããšã«ãããåãªãŒãããã®é£æ¥ããŒãã«æ¥ç¶ããããšã§ãã ã¢ã€ãã¢ã¯ãããããå¶éãã6ã€ã®ããŒã¿ã«ããå§ããããšã§ãããå€éšãããå éšãã«ïŒBSPã®ã«ãŒãã§ïŒæ¥ç¶ããŸãã 次ã«ãBSPã®åããŒãã«ã€ããŠãããŒãå ã®åããŒã¿ã«ãåå²ããåé¢é¢ãããŒã¿ã«ãšããŠè¿œå ããååž°çã«ç¹°ãè¿ããŸãã


6ã€ã®ãœãŒã¹ããŒã¿ã«ã¯åå²ããããªãŒãã«å±éãããŸããããŒããåå²ããããã³ã«ãããã«æ¥ç¶ãããŠããåããŒã¿ã«ãåå²ããå¿ èŠããããããããã¯èŠããã»ã©ç°¡åã§ã¯ãããŸããã
å·Šã®å³ã§ã¯ã1ã€ã®ããŒã¿ã«ãBSPããªãŒå ã®2ã€ã®ãå åŒãããŒããæ¥ç¶ããŠããŸããå·Šã®åã·ãŒãããã©ããšããã®åå²é¢ã¯ããŒã¿ã«ã2ã€ã«åå²ããŸããä»ã®ããŒãã®ããŒã¿ã«ãæŽæ°ããŠããå åŒãããneãã«æ¥ç¶ããªãããã«ããå¿ èŠãããããšãããããŸãã
ããã»ã¹ã®æåŸã«ã6ã€ã®ãœãŒã¹ããŒã¿ã«ãæ°çŸã®ããŒã¿ã«ã«åå²ãããæ°ããããŒã¿ã«ãåé¢é¢ã«äœæãããŸããBSPã®
åã·ãŒãã¯ãå ±éã®ãšããžãæã€ãªãŒãã«æ¥ç¶ããããŒã¿ã«ã®ãªã³ã¯ãªã¹ãã®ãããã§ãé£æ¥ãèªèããŸãïŒ

3. FilterBrushesIntoTree

ãã®ã¹ããŒãžã¯ãBSPãããŒãã§ããã©ã·ãã·ã§ã€ãã§ããã·ã§ã€ãã®éžæãããåäŸåãã²ãŒã ã«äŒŒãŠããŸããäžéæãªèãæ€åºããããã«ãåãã©ã·ãBSPã«éãããŸãã
ãã®æ¹æ³ã¯ããã説æããããã¥ãŒãªã¹ãã£ãã¯ã®ãããã§æ©èœããŸãããã©ã·ãåé¢å¹³é¢ããããã«æšªåãããEPSILONãè¶ ããªãå Žåã代ããã«ããã©ã·ã®ä»ã®ãã¹ãŠã®èŠçŽ ãé 眮ãããŠããå¹³é¢ã®åŽé¢ã«å®å šã«è¡ããŸãã
ããã§ããå éšãéšåãšãå€éšãéšåã衚瀺ããå§ããŸãã
ãã©ã·ãæ¥è§Šããã·ãŒãã¯äžéæïŒåºäœïŒãšèŠãªãããããã«å¿ããŠããŒã¯ãä»ããããŸãã

4. FloodEntitiesããã³FillOutside
ãã¬ã€ã€ãŒã®ã¹ããŒã³ãšã³ãã£ãã£ã䜿çšããŠãå¡ãã€ã¶ãã¢ã«ãŽãªãºã ãåã·ãŒãã«å¯ŸããŠå®è¡ãããŸãã圌ã¯ãèããšã³ãã£ãã£ããå°éå¯èœã§ãããšããŒã¯ããŸãã

FillOutsideã®æçµæ®µéã¯åã·ãŒããééããå°éã§ããªãå Žåã¯äžéæãšããŠããŒã¯ããŸãã

åãµãã¹ããŒã¹ãéæå¯èœãŸãã¯äžéæãªã¬ãã«ãååŸããŸããããªãŒãããŒã¿ã«ãä»ããããã²ãŒã·ã§ã³ã¯åäžã«ãªããã¿ãŒã²ãããªãŒãã®äžéæ床ããã§ãã¯ããããšã§å®è¡ãããŸãã
5. ClipSidesByTree
ãã©ã·ã®äžèŠãªéšåãç Žæ£ããæãæ¥ãŸããããã©ã·ã®åãœãŒã¹åŽãBSPãäžã£ãŠãããŸããåŽé¢ãäžéæãªã¹ããŒã¹å ã«ããå Žåãç Žæ£ãããŸãããã以å€ã®å Žåã¯ã
visibleHull
é¢ä¿è ã®ãªã¹ãã«è¿œå ãããŸãã
ãã®çµæããã¹ãã³ãã¬ãã«ãååŸãããå¯èŠéšåã®ã¿ãä¿æãããŸãã

ãã以éãæ®ãã®æäœã«ã€ããŠã¯ã
visibleHull
é¢ä¿è ã®ãªã¹ãã®ã¿ãèæ ®ãããŸãã
6. FloodAreas
ä»
dmap
ã®ã°ã«ãŒãã®èã®èå¥åãšãªã¢ïŒåã·ãŒãã®å¡ãã€ã¶ãã¢ã«ãŽãªãºã ã®ããã圌ã¯ãã·ãŒãã«é¢é£ä»ããããŠããããŒã¿ã«ãéããŠãã¹ãŠãåããããšããŸãã
ããã§ããã¶ã€ããŒã®äœæ¥ã¯éåžžã«éèŠã§ãããšãªã¢ã¯ãããŒã¿ã«ïŒæé 1ã§èšåããããŒã¿ã«ã®ãã©ã·ïŒãæåã§ãããäžã«é 眮ããå Žåã«ã®ã¿èå¥ã§ããŸãããããããªããã°ããã
dmap
ã¯1ã€ã®é åã®ã¿ãèå¥ãããããªããã»ããµã®åãã¬ãŒã ã¯ã«ãŒãå šäœã«éä¿¡ãããŸãã
ååž°å¡ãã€ã¶ãã¢ã«ãŽãªãºã ã¯ããšãªã¢ããŒã¿ã«ãšäžéæããŒãã«ãã£ãŠã®ã¿åæ¢ãããŸãã以äžã®å³ã§ã¯ãèªåçæãããããŒã¿ã«ïŒèµ€ïŒã¯åŒãç¶ãå¡ãã€ã¶ãããŸããããã¶ã€ããŒã«ãã£ãŠé 眮ãããvisportalïŒéãareaportalãšãåŒã°ããŸãïŒã¯ã2ã€ã®é åãäœæããããšã§åæ¢ããŸãã


ããã»ã¹ã®æåŸã«ãåéé£ç¶ã·ãŒãã¯ãªãŒãžã§ã³ã«å±ãããªãŒãžã§ã³éããŒã¿ã«ïŒéïŒãå®çŸ©ãããŸãã

7. PutPrimitivesInAreas
ãã®æ®µéã§ãå¥ã®ã²ãŒã ã圢ç¶ãèŠã€ãããã§ãã¹ããã6ã§å®çŸ©ãããé åãšã¹ããã5ã§èšç®ãããvisibleHullãçµåãããŸããä»åã¯ããŒããé åã§ãããããŒã¹ãvisibleHullã§ãã
é åã®é åãéžæãããåãã©ã·ã®åvisibleHullãBSPã«éä¿¡ãããŸããã€ã³ããã¯ã¹areaIDã«ãããè¡šé¢ãé åã®é åã«è¿œå ãããŸãã
泚ïŒããªãã¹ããŒããªåã-ãã®æ®µéã§ã¯ããšã³ãã£ãã£ã®çæãæé©åãããŸããäžéšã®ãšã³ãã£ãã£ããfunc_staticããšããŠããŒã¯ãããŠããå Žåããããã®ã€ã³ã¹ã¿ã³ã¹ã¯ããã«äœæããããšãªã¢ã«ãã€ã³ããããŸãããããã£ãŠãããã¯ã¹ãæšœãæ€ åããã®é åã«ãæ¥çãããããšãã§ããŸãïŒãããã®åœ±ãäºåã«çæããããšã«ãã£ãŠãïŒã
8.ããªã©ã€ã
éçå æºããš
dmap
ã«ã圱ã®ããªã¥ãŒã ã®ãžãªã¡ããªãäºåã«èšç®ããŸãããããã®ããªã¥ãŒã ã¯åŸã§ä¿åãããŸã
.proc
ãå¯äžã®ç§isã¯
"_prelight_light"
ããšã³ãžã³ããã¡ã€ã«ã®å æº
.map
ãšãã¡ã€ã«ã®åœ±ã®ããªã¥ãŒã ãäžèŽãããããšãã§ããããã«ã圱ã®ããªã¥ãŒã ãå æºã®èå¥åã«æ¥ç¶ãããååã§ä¿åãããããšã§ã
.proc
ã
shadowModel { /* name = */ "_prelight_light_2900" /* numVerts = */ 24 /* noCaps = */ 72 /* noFrontCaps = */ 84 /* numIndexes = */ 96 /* planeBits = */ 5 ( -1008 976 183.125 ) ( -1008 976 183.125 ) ( -1013.34375 976 184 ) ( -1013.34375 976 184 ) ( -1010 978 184 ) ( -1008 976 184 ) ( -1013.34375 976 168 ) ( -1013.34375 976 168 ) ( -1008 976 168.875 ) ( -1008 976 168.875 ) ( -1010 978 168 ) ( -1008 976 167.3043518066 ) ( -1008 976 183.125 ) ( -1008 976 183.125 ) ( -1010 978 184 ) ( -1008 976 184 ) ( -1008 981.34375 184 ) ( -1008 981.34375 184 ) ( -1008 981.34375 168 ) ( -1008 981.34375 168 ) ( -1010 978 168 ) ( -1008 976 167.3043518066 ) ( -1008 976 168.875 ) ( -1008 976 168.875 ) 4 0 1 4 1 5 2 4 3 4 5 3 0 2 1 2 3 1 8 10 11 8 11 9 6 8 7 8 9 7 10 6 7 10 7 11 14 13 12 14 15 13 16 12 13 16 13 17 14 16 15 16 17 15 22 21 20 22 23 21 22 18 19 22 19 23 18 20 21 18 21 19 1 3 5 7 9 11 13 15 17 19 21 23 4 2 0 10 8 6 16 14 12 22 20 18 }
9. FixGlobalTjunctions
Tãžã§ã€ã³ãã®ä¿®æ£ã¯ãéåžžãèŠèŠçãªã¢ãŒãã£ãã¡ã¯ããåãé€ãããã«éèŠã§ãããidTech4ã§ã¯ããã«éèŠã§ãããã³ãã¬ãŒããããã¡ãŒãžã®æžã蟌ã¿æã«ãžãªã¡ããªã䜿çšããŠã·ã£ããŠãçæããããšãã§ããŸããTãžã§ã€ã³ãã«ã¯2ã€ã®åé¡ããããŸãã
10.ããŒã¿åºå
æåŸã«ãååŠçããããã¹ãŠã®ããŒã¿ããã¡ã€ã«ã«ä¿åãããŸã
.proc
ïŒ
- åé åã«ã€ããŠããµãŒãã§ã¹ã®å€ãã®é¢ããããªã¢ã«ããšã«ã°ã«ãŒãåãããŸãã
- èã®areaIDãæã€BSPããªãŒã
- ããŸããŸãªå°åéããŒã¿ã«ã
- 圱ã®ããªã¥ãŒã ã
ç©èª
ã³ãŒãã®å€ãã®ã»ã°ã¡ã³ãã¯ãQuakeïŒïŒãQuake 2ïŒïŒãããã³Quake 3ïŒïŒã®ååŠçããŒã«ã§äœ¿çšãããã³ãŒãã«
dmap
䌌ãŠããŸãããã®çç±ã¯ãæœåšçãªå¯èŠã»ããïŒPVSïŒãäžæçãªããŒã¿ã«ã·ã¹ãã ã䜿çšããŠçæãããããã§ãã
qbsp.exe
q2bsp.exe
q3bsp.exe
-
qbsp.exe
BSPããŒã¿ã«å ã®ãªãŒãéã®é¢ä¿ã«é¢ããæ å ±ãå«ã.map
ãã¡ã€ã«.prt
ãèªã¿åã£ãŠçæããŸããïŒãMakeTreePortalsãã®ã¹ããã2ãšãŸã£ããåãïŒã -
vis.exe
.prt
å ¥åãšããŠäœ¿çšãããŸããåã·ãŒãã«ã€ããŠïŒ
- ããŒã¿ã«ã¯ãã€ã³ãããããªãŒãã«ãã£ã¹ããããŸããã
- ã·ãŒãã«èšå ¥ããåã«ãå¯èŠæ§ã®ãã©ãããã«é¢é£ãã2ã€ã®åã®ããŒã¿ã«ã§æ¬¡ã®ããŒã¿ã«ãåæããããšã«ãããå¯èŠæ§ããã§ãã¯ããŸããïŒå¯èŠæ§ã¯äœåãã®å ç·ã®æŸå°ã«ãã£ãŠæ±ºå®ããããšèããããŠããŸãããããã¯å€ãã®äººã ããŸã ä¿¡ããŠããç¥è©±ã§ãïŒã
å³ã¯åžžã«åªããŠããŸããããšãã°ã
qbsp.exe
ããŒã¿ã«ã§æ¥ç¶ããã6ã€ã®ãªãŒããèŠã€ãã
vis.exe
PVSãçæããããã«å®è¡ãããããã«ãªããŸããããã®ããã»ã¹ã¯ã·ãŒãããšã«å®è¡ãããŸããããã®äŸã§ã¯ã·ãŒã1ã®ã¿ãèæ ®ããŸãã

ã·ãŒãã¯åžžã«ããèªäœããèŠãããããã·ãŒã1ã®åæPVSã¯æ¬¡ã®ããã«ãªããŸãã
ã·ãŒãID | 1 | 2 | 3 | 4 | 5 | 6 |
ããããã¯ãã«ïŒã·ãŒã1ã®PVSïŒ | 1 | ïŒ | ïŒ | ïŒ | ïŒ | ïŒ |
å å¡«ã¢ã«ãŽãªãºã ãéå§ãããŸããã«ãŒã«ã«ã¯ããã¹ã«2ã€ã®ããŒã¿ã«ã¯ãªãããã·ãŒãã¯éå§ç¹ããèŠãããšèŠãªãããŸããããã¯ã次ã®PVSã§ã·ãŒã3ã«å°éããããšãæå³ããŸãã
ã·ãŒãID | 1 | 2 | 3 | 4 | 5 | 6 |
ããããã¯ãã«ïŒã·ãŒã1ã®PVSïŒ | 1 | 1 | 1 | ïŒ | ïŒ | ïŒ |

ã·ãŒã3ã§ã¯ãå®éã«å¯èŠæ§ã確èªã§ããŸããããŒã¿ã«n-2ãšããŒã¿ã«n-1ãã2ã€ã®ãã€ã³ããååŸããŠãã¯ãªããã³ã°ãã¬ãŒã³ãçæããæœåšçãªå¯èŠæ§ã«ã€ããŠæ¬¡ã®ããŒã¿ã«ããã¹ãã§ããŸãã
å³ããããªãŒã4ãš6ã«ã€ãªããããŒã¿ã«ã¯ãã¹ãã«åæ Œãããã·ãŒã5ãžã®ããŒã¿ã«ã¯åæ ŒããããšãããããŸãã次ã«ãã·ãŒã6ã®ãã£ã«ã¢ã«ãŽãªãºã ãååž°çã«å®è¡ãããã·ãŒã1ã®PVSã®çµäºæã«æ¬¡ã®ããã«ãªããŸãã
ã·ãŒãID | 1 | 2 | 3 | 4 | 5 | 6 |
ããããã¯ãã«ïŒã·ãŒã1ã®PVSïŒ | 1 | 1 | 1 | 0 | 1 | 0 |
IdTech4ã¯PVSãçæããã代ããã«ããŒã¿ã«ããŒã¿ãä¿åãããŸããåãšãªã¢ã®å¯èŠæ§ã¯ãæ圱æã«ããŒã¿ã«ãç»é¢ã¹ããŒã¹ã«æ²ããŠãäºãã«å¯ŸããŠããªãã³ã°ããããšã«ããèšç®ãããŸãã
èå³æ·±ãäºå®ïŒ Michael Abrashã¯ãGDC Vaultããã®ãã®çŽ æŽããããããªã®ããŒã«ãŒã䜿çšããŠã10ç§ã§ããã»ã¹å šäœã説æããŸããïŒåçã¯ã¯ãªãã¯å¯èœã§ãïŒïŒ

ããŒã3ïŒã¬ã³ãã©ãŒ
idTech4ã¬ã³ãã©ãŒã¯ã3ã€ã®éèŠãªé©æ°ãè¡ããŸããã
- ãŠããã¡ã€ãã©ã€ãã£ã³ã°ãšã·ã£ããŠïŒã¬ãã«ãã§ãŒã¹ãšãšã³ãã£ãã£ãã§ãŒã¹ã¯ãåããã€ãã©ã€ã³ãšã·ã§ãŒããŒãééããŸãã
- å¯èŠè¡šé¢ã®æ±ºå®ïŒããŒã¿ã«ã·ã¹ãã ã§ã¯ãå®è¡æã«VSDãå®è¡ã§ããŸã-PVSã¯äžèŠã§ãã
- ããã«ããã¹ã¬ã³ããªã³ã°ãã
idTech4ã§æãéèŠãªã®ã¯ãã«ããã¹ã¬ã³ãã©ãŒã§ããèŠçå ã®åå æºã®åœ±é¿ã¯ãå ç®æ··åã䜿çšããŠãããªããã»ããµã®ãã¬ãŒã ãããã¡ã«èç©ãããŸãã Doom 3ã¯ããã¬ãŒã ãããã¡ãŒã®ã«ã©ãŒã¬ãžã¹ã¿ã転éã§ã¯ãªã飜åãå®è¡ãããšããäºå®ãæ倧éã«æŽ»çšããŸããå ç®ããã·ã³ã°ã説æããããã«ãç¬èªã®ã¬ãã«ãäœæããŸããã以äžã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ã3ã€ã®ãã¹ãå®è¡ããã3ã€ã®å æºã瀺ããŠããŸããåãã¹ã®çµæã¯ãã¬ãŒã ãããã¡ã«èç©ãããŸãããã¹ãŠã®å æºãæ··åãããŠããç»é¢äžå€®ã®çœè²å ã«æ³šç®ããŠãã ãããåéè·¯ãåé¢ããããã«ãšã³ãžã³ãå€æŽããŸããïŒéè·¯1ïŒéè²å æºéè·¯2ïŒç·è²å æºéè·¯3ïŒèµ€è²å æº
() :
============================
1111 1111
+ 0000 0100
---------
= 0000 0011
() :
==========================
1111 1111
+ 0000 0100
---------
= 1111 1111




ãšã³ãžã³ã«ä»ã®å€æŽãå ããŠãå æºã®åãã¹ã®åŸã«ãã¬ãŒã ãããã¡ãŒã®ç¶æ ã確èªããŸããïŒ

æåã®ãã¹

ã® åŸã®ãããªããã»ããµãŒãããã¡ãŒ2çªç®ã®ãã¹

ã® åŸã®ãããªããã»ããµãŒãã¬ãŒã ãããã¡ãŒ3çªç®ã®ãã¹ã®åŸã®ãããªããã»ããµãŒãã¬ãŒã ãããã¡ãŒ
èå³æ·±ãäºå®ïŒå æºã®åãã¹ã®çµæãååŸããããããæåã§æ··åããããšãã§ããŸãPhotoshopïŒOpenGLå ç®ããã·ã³ã°ãã·ãã¥ã¬ãŒãããç·åœ¢åé¿ïŒãšãŸã£ããåãçµæãååŸããŸãã
ã·ã£ããŠã®ãµããŒããšãã³ããããã³ã°ãçµã¿åãããã¢ãã£ãã£ããã¬ã³ãã¯ã2012幎ã®åºæºã§ãããšã³ãžã³ã«éåžžã«åªããç»åãäœæããŸãã

建ç¯
以åã®idTechãšã³ãžã³ãšã¯ç°ãªããã¬ã³ãã©ãŒã¯ã¢ããªã·ãã¯ã§ã¯ãããŸãããã2ã€ã®éšåïŒããã³ããšã³ããšããã¯ãšã³ãïŒã«åå²ãããŠããŸãã
- ããã³ããšã³ãïŒ
- , .
- (
def_view_t
) / VBO . - RC_DRAW_VIEW.
- :
- RC_DRAW_VIEW .
- VBO.

ã¬ã³ãã©ãŒã®ã¢ãŒããã¯ãã£ã¯ãQuake3ä»®æ³ãã·ã³ã®ãã€ãã³ãŒããçæããããã«äœ¿çšãããLCCã¯ãã¹ã³ã³ãã€ã©ãŒã«éåžžã«äŒŒãŠããŸãã

åœåãã¬ã³ãã©ãŒã®èšèšã¯LCCã®èšèšã«åœ±é¿ããããšèããŸããããSMPã·ã¹ãã ã§ãã«ãã¹ã¬ããã«ãªããããã¬ã³ãã©ãŒã¯2ã€ã®éšåã«åå²ãããŸãããããã³ããšã³ãã¯1ã€ã®ã³ã¢ã§å®è¡ãããããã¯ãšã³ãã¯å¥ã®ã³ã¢ã§å®è¡ãããããšã«ãªã£ãŠããŸããæ®å¿µãªãããäžéšã®ãã©ã€ããŒã¯äžå®å®ã§ãããããå¥ã®ã¹ã¬ãããç¡å¹ã«ããå¿ èŠããããäž¡æ¹ã®éšåãåãã¹ã¬ããã§å®è¡ãããŸããã
èµ·æºã«é¢ããèå³æ·±ãäºå®ïŒã³ãŒãã䜿çšãããšãèå€åŠçãªèª¿æ»ãå®è¡ããããšãã§ããŸã-ã¬ã³ãã©ãŒã®è©³çŽ°ãªã³ãŒããããèŠããšããšã³ãžã³ãC ++ããCïŒãªããžã§ã¯ãããéçã¡ãœããïŒã«ç§»è¡ããŠããããšãæ確ã«ããããŸãã
ããã¯ã³ãŒãå±¥æŽãåå ã§çºçããŸãããidTech4ã¬ã³ãã©ãŒã¯ãQuake3ãšã³ãžã³ïŒCã³ãŒãããŒã¹ïŒã«åºã¥ããŠJohn CarmackãC ++ã¹ãã·ã£ãªã¹ãã«ãªããŸã§äœæããŸãããã¬ã³ãã©ãŒã¯åŸã«C ++ã®idtech4ã³ãŒãããŒã¹ã«çµ±åãããŸããã
Doom3ã«ã¯Quakeãã©ãã ãæ®ã£ãŠããŸããïŒèšãã®ã¯é£ããã§ãããMac OS Xã®äž»ãªæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
- (void)quakeMain;
ããã³ããšã³ããããã¯ãšã³ãããããªããã»ããµãšã®çžäºäœçš
ãã®å³ã¯ãããã³ããšã³ããããã¯ãšã³ããããã³ãããªããã»ããµéã®çžäºäœçšã瀺ããŠããŸãã

- ããã³ããšã³ãã¯äžçã®ç¶æ
ãåæãã2ã€ã®çµæãçæããŸãã
- èŠéã«åœ±é¿ãäžããåå æºã®ãªã¹ããå«ãäžéãã¥ãŒãåå æºã«ã¯ããããšçžäºäœçšãããšã³ãã£ãã£ãµãŒãã§ã¹ã®ãªã¹ããå«ãŸããŠããŸãã
- , , . VBO .
- . OpenGL , . VBO .
- OpenGL .
Doom3
ããã³ããšã³ãã¯å°é£ãªã¿ã¹ã¯ãå®è¡ããŸãïŒå¯èŠãµãŒãã§ã¹ã®å®çŸ©ïŒå¯èŠãµãŒãã§ã¹æ±ºå®ãVSDïŒããã®ç®çã¯ãèŠéã«åœ±é¿ãäžããå æºãšãšã³ãã£ãã£ã®ãã¹ãŠã®çµã¿åãããèŠã€ããããšã§ãããã®ãããªçµã¿åããã¯ãçžäºäœçšãšåŒã°ããŸãããã¹ãŠã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãèŠã€ãããšãããã³ããšã³ãã¯ããã¯ãšã³ããå¿ èŠãšãããã¹ãŠããããªããã»ããµã®RAMã«ããŒãããŸãïŒãã€ã³ã¿ã©ã¯ã·ã§ã³ããŒãã«ãã䜿çšããŠãã¹ãŠã远跡ããŸãïŒãæåŸã®ã¹ãããã¯ãOpenGLã³ãã³ããçæããããã«ããã¯ãšã³ãã«ãã£ãŠèªã¿åãããäžéãã¥ãŒãçæããããšã§ãã
ã³ãŒãã§ã¯æ¬¡ã®ããã«ãªããŸãã
- idCommon::Frame - idSession::UpdateScreen - idSession::Draw - idGame::Draw - idPlayerView::RenderPlayerView - idPlayerView::SingleView - idRenderWorld::RenderScene - build params - ::R_RenderView(params) // { R_SetViewMatrix R_SetupViewFrustum R_SetupProjection // . static_cast<idRenderWorldLocal *>(parms->renderWorld)->FindViewLightsAndEntities() { PointInArea // BSP FlowViewThroughPortals // , , . } R_ConstrainViewFrustum // Z- . R_AddLightSurfaces // , , ( ) R_AddModelSurfaces // ( ) R_RemoveUnecessaryViewLights R_SortDrawSurfs // qsort C. C++ . R_GenerateSubViews R_AddDrawViewCmd }
æ³šïŒ CããC ++ãžã®ç§»è¡ã¯ããã§ã¯æããã§ãã
äŸãç解ããã®ã¯åžžã«ç°¡åãªã®ã§ãããã«ã¬ãã«ããããŸããé èšããããã¶ã€ããŒã®visplanesãšã³ãžã³ã¯ã次ã®4ã€ã®é åãèŠãŠããïŒ

ããŒããããš
.proc
ãšã³ãžã³ã¯ãŸããã¢ããããŒãããã
.map
ãã¹ãŠã®å æºã決å®ããå®äœã移ååããŸãããšã³ãžã³ã¯ãå æºããšã«ã圱é¿ãåãããã¹ãŠã®é åã®ãªã¹ããäœæããŸãããå®è¡æã«ããã¬ã€ã€ãŒã®äœçœ®ãšã¢ã³ã¹ã¿ãŒã圱ãèœãšãããã«ãªããŸãããã·ãŒã³ãæ£ç¢ºã«ããã«ã¯ããã¹ãŠã®ã¢ã³ã¹ã¿ãŒãšåœ±ãèŠã€ããå¿ èŠããããŸããããã»ã¹ã¯æ¬¡ã®ãšããã§ãã

1 :
=========
- 0
- 1
2 :
=========
- 1
- 2
- 3

- ãã¬ãŒã€ãŒãBSPããªãŒããã€ãã¹ããŠãããšãªã¢ãèŠã€ããŸã
PointInArea
ã -
FlowViewThroughPortals
: . . Realtime rendering :
, , , :
( /) :
==================================
1 - 0
1 - 1
1 - 1
2 - 1
2 - 1
: « 2 â 2», 2 . -
R_AddLightSurfaces
, , .
( /) :
==================================
1 - 0
1 - 1
1 - 1
2 - 1
2 - 1
2 - 2
-
R_AddModelSurfaces
ïŒãã¹ãŠã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãèŠã€ãããŸãããé ç¹ãšã€ã³ããã¯ã¹ããŸã ãªãå Žåã¯ããããªããã»ããµã®VBOã«èªã¿èŸŒã¿ãŸããããã«ãããã¢ãã¡ãŒã·ã§ã³ã¢ã³ã¹ã¿ãŒã®ãžãªã¡ããªã®ã€ã³ã¹ã¿ã³ã¹ïŒã¢ãã«ãšã·ã£ããŠã®ããªã¥ãŒã ïŒãäœæãããŸãã - ãã¹ãŠã®ãç¥çãäœæ¥ãå®äºããŸããããã«ãã䜿çšããŠãããã¯ãšã³ãã«ç»é¢ãžã®ã¬ã³ããªã³ã°ãéå§
R_AddDrawViewCmd
ãããã³ãã³ããçºè¡ããRC_DRAW_VIEW
ãŸãã
Doom3ããã¯ãšã³ãã¬ã³ãã©ãŒ
ããã¯ãšã³ãã¯ããããªããã»ããµã®å¶éãèæ ®ããŠãäžéãã¥ãŒãã¬ã³ããªã³ã°ããŸããDoom3ã¯ããããªããã»ããµãã¬ã³ããªã³ã°ãã5ã€ã®æ¹æ³ããµããŒãããŸããã
- R10ïŒGeForce256ïŒ
- R20ïŒGeForce3ïŒ
- R200ïŒRadeon 8500ïŒ
- ARBïŒOpenGL 1.XïŒ
- ARB2ïŒOpenGL 2.0ïŒ
2012幎ã«ã¯ãARB2ã®ã¿ãææ°ã®ãããªããã»ããµã§ãµããŒããããŠããŸãããã®èŠæ Œã¯ã移æ€æ§ãæäŸããã ãã§ãªããã²ãŒã ã®å¯¿åœã延ã°ããŸããã
ãããªã«ãŒãããã³ããããã³ã°ïŒæ°å¹Žåã«æžããHellknightã®äœ¿çšæ¹æ³ã«é¢ãããã¥ãŒããªã¢ã«ïŒãšãªãã¬ã¯ã·ã§ã³ãããããµããŒãããŠããå Žåãidtech4ã¯ãããããªã³ã«ããŸãããã次ã®æäœã§ãã¯ã»ã«ãã£ã«ã¬ãŒãã®ä¿åã«å šåãå°œãããŸããïŒ
- OpenGLã·ã¶ãŒãã¹ãïŒããã³ããšã³ãã«ãã£ãŠäœæãããåå æºã«å¯ŸããŠåå¥ã«ïŒ
- æåã®æ®µéã§Zãããã¡ãåããŸãã
詳现ãªããã¯ãšã³ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
idRenderSystemLocal::EndFrame R_IssueRenderCommands RB_ExecuteBackEndCommands RB_DrawView RB_ShowOverdraw RB_STD_DrawView { RB_BeginDrawingView // z-, .. RB_DetermineLightScale RB_STD_FillDepthBuffer // ( ) . // , _DrawInteractions { 5 GPU specific path switch (renderer) { R10 (GeForce256) R20 (geForce3) R200 (Radeon 8500) ARB (OpenGL 1.X) ARB2 (OpenGL 2.0) } // qglStencilFunc( GL_ALWAYS, 128, 255 ); RB_STD_LightScale // (, , ....) int processed = RB_STD_DrawShaderPasses( drawSurfs, numDrawSurfs ) // RB_STD_FogAllLights(); // _currentRender if ( processed < numDrawSurfs ) RB_STD_DrawShaderPasses( drawSurfs+processed, numDrawSurfs-processed ); }
ããã¯ãšã³ãã¹ããŒãžã段éçã«é²ããããã«ãæåãªç»é¢ãDoom3ã¬ãã«

ããååŸããèŠèŠåã®å段éã§ãšã³ãžã³ãåæ¢ããŸãã.Doom3ã¯æ¡æ£ãã¯ã¹ãã£ã®äžã«ãã³ããããã³ã°ãšåå°ãããã䜿çšããããããµãŒãã§ã¹ã¬ã³ããªã³ã°ã§ã¯3ã€ã®ãã¯ã¹ãã£ã§æ€çŽ¢ã䜿çšã§ããŸãããã¯ã»ã«ã¯5ã7åã®å æºã®åœ±é¿ãåããå¯èœæ§ããããããåæç»ãè¡ããªããŠãããã¯ã»ã«ãããæ倧21åã®ãã¯ã¹ãã£æ€çŽ¢ã®å¯èœæ§ãæ³å®ããã®ã¯çæ°ã§ã¯ãããŸãããåæç»ã0ã«ããã«ã¯ãããã¯ãšã³ãã®æåã®æ®µéãå¿ èŠã§ãããã¹ãŠã®ã·ã§ãŒããŒãç¡å¹ã«ãã深床ãããã¡ãŒã®ã¿ã«æžã蟌ã¿ããã¹ãŠã®ãžãªã¡ããªãã¬ã³ããªã³ã°ããŸãïŒ

深床ãããã¡ãŒããã£ã±ãã«ãªããŸããããã®æç¹ããã深床èšé²ã¯ç¡å¹ã«ãªãã深床ãã¹ãããªã³ã«ãªããŸãã
äž»ã«zãããã¡ãžã®ã¬ã³ããªã³ã°ã¯éå¹æã®ããã«æãããããããŸããããå®éã«ã¯ããã£ã«ã¬ãŒãã®ä¿åã«éåžžã«åœ¹ç«ã¡ãŸãã
- .
- .
- ( ), . .
ã«ã©ãŒãããã¡ã¯ã¯ãªãŒãã³ã°ãããé»ã§å¡ãã€ã¶ãããŠããããšã«æ³šæããŠãã ãããèªç¶ãªåœ¢ã§ã¯ãDoom3ã®äžçã¯å®å šã«é»ã§ãããã¢ã³ããšã³ããã©ã€ãã£ã³ã°ããªãããã§ã-衚瀺ããã«ã¯ãããªãŽã³/ãµãŒãã§ã¹ãå æºãšçžäºäœçšããå¿ èŠããããŸããããããDoom3ãéåžžã«æãçç±ã§ãã
ãã®åŸããšã³ãžã³ã¯11ãã¹ãå®è¡ããŸãïŒåå æºã«1ã€ã
ã¬ã³ããªã³ã°ããã»ã¹ãéšåã«åå²ããŸããã以äžã®å³ã¯ãå æºã®åã ã®ééã瀺ããŠããŸãã

å æºã®

å¹æ 1 å æºã®

å¹æ 2 å æºã®

å¹æ 3 å æºã®

å¹æ 4å æºã®å¹æ5

å æºã®

å¹æ 6å æºã®å¹æ7

å æºã® å¹æ8å æºã®

å¹æ9

å æºã®

å¹æ 10å æºã®å¹æ11

ã©ã¹ããã¹ïŒç°å¢å ã®éé
ãããŠããããªããã»ããµã®ãã¬ãŒã ãããã¡ãŒã§äœãèµ·ãããïŒ

å æº

ã®ééåŸ 1 å æº

ã®ééåŸ 2 å æº

ã®ééåŸ 3 å æº

ã®ééåŸ 4å æºã®ééåŸ5

å æº6ãééããåŸã

å æº7ãééåŸã«

å æº8ãééåŸã«

å æº9ãééåŸã«

å æº10ãééããåŸ

ãå æº11ã®ééåŸã«

å æº12ã®ééåŸã«

Rå æº13ãééãã次
ã®ãã³ãã¬ãŒãã¯ããã¹ããããã¡ãšã¯ãã¿ïŒ
å æºã«ãã£ãŠåœ±ãèœãšãããå Žåãåå æºãééããåã«ãã³ãã¬ãŒããã¹ããå®è¡ããå¿ èŠããããŸãã深床倱æ/深床ãã¹ã®ççŸãšæªåé«ãCreative Labsã®åãã«ã€ããŠã¯è©³ãã説æããŸãããå ¬éããããœãŒã¹ã³ãŒãã§ã¯ãé«å質ã®ã·ã£ããŠãæ§ç¯ããå¿ èŠãããããã深床ãã¹ã¢ã«ãŽãªãºã ãé ããªããŸãã誰ããæ·±ã倱æã¢ã«ãŽãªãºã ããœãŒã¹ã³ãŒãã«è¿ãããšãã§ããŸããããããã¯ãšãŒãããã§ã®ã¿åæ³ã§ããããšã«æ³šæããŠãã ããïŒ
å å¡«çãç¯çŽããããã«ãããã³ããšã³ãã¯ãOpenGLã®ã·ã¶ãŒãã¹ãã«äœ¿çšããç»é¢ã¹ããŒã¹ã®é·æ¹åœ¢ãçæããŸããããã«ãããå æºãŸã§ã®è·é¢ãåå ã§è¡šé¢ãé»ã®ãŸãŸã«ãªããã¯ã»ã«ã®ã·ã§ãŒããŒãäžèŠã«ãªããŸãã
ãã³ãã¬ãŒããããã¡ã¯ãå æº8ãééããçŽåã«é©çšãããŸããé»ä»¥å€ã®é åã¯ãã¹ãŠå¡ãã€ã¶ãããŸããä»ã®é åã§ã¯ããã¬ãŒã ãããã¡ãžã®æžã蟌ã¿ãå¶éãããŸãã

ãã³ãã¬ãŒããããã¡ãŒã¯ãå ã®éè·¯7ã®çŽåã«ãããŸãããã£ã«ã¬ãŒããç¯çŽããããã«ãã¯ã£ãããšèŠããããµãã§ãã
<img src = " fd.fabiensanglard.net/doom3/renderer/DOOM3-Context3-Static-StencilBuffer2.png "
ã€ã³ã¿ã©ã¯ãã£ããªè¡šé¢
ã¬ã³ããªã³ã°ã®æçµæ®µéã¯æ¬¡ã®
RB_STD_DrawShaderPasses
ãšããã§ããå ãå¿ èŠãšããªããã¹ãŠã®ãµãŒãã§ã¹ãã¬ã³ããªã³ã°ããŸãããããã«ã¯ãç»é¢ãšã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®èŠäºãªã€ã³ã¿ã©ã¯ãã£ããµãŒãã§ã¹ãå«ãŸããŸãããšã³ãžã³ã®ãã®éšåããžã§ã³ã»ã«ãŒããã¯ã¯æãèªãã«æã£ãŠããŸããã圌女ã¯åœŒå¥³ãè² ã£ãŠãããã¹ãŠã®å°æ¬ãåŸããšã¯æããªãã2004幎ãæåã®ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ã¯éåžžãã«ã¹ã¯ãªãŒã³ãããªã§ããããããªãå®æããåŸãã¬ãã«ãããŒãããããšã³ãžã³ãã±ãŒã¹ã«å ¥ããŸããããDoom IIIã«ã¯ãŸã£ããç°ãªãã¹ããŒãªãŒããããŸããã
ã¹ããŒãžïŒ
- ã¬ãã«ããŒãã£ã³ã°ã
- ã¯ãªããã®åçãå§ãŸããŸãã
- 5åç®ã®5ç§ã§ãã«ã¡ã©ãåŒãæ»ãããŸãã
- ä»èŠããããªã¯ãã²ãŒã ãšã³ãžã³ã®ã¹ã¯ãªãŒã³ã§ãïŒ
ãããåããŠèŠããšããç§ã¯ãããäœããã®ããªãã¯ã§ãããšæ±ºããããšãèŠããŠããŸãããããªãã¬ãŒã€ãŒãäžæããããã¶ã€ããŒããã£ã¹ãã¬ã€ç»é¢ã«ãã¯ã¹ãã£ãæ¿å ¥ããã«ã¡ã©ã®äœçœ®ããããªã®æåŸã®ãã¬ãŒã ã«å¯Ÿå¿ãããšèããŸãããç§ã¯ééã£ãŠããŸãããidTech4ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãµãŒãã§ã¹ã®ã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ã§ãããªãæ¬åœã«åçã§ããŸããRoQã¯ããã«äœ¿çšãããŸãããGrahamDevineãid Softwareã«æ¥ããšãã«åœŒã«ããããããã¯ãããžãŒã§ãã
èå³æ·±ãäºå®ïŒ
ã€ã³ããã§äœ¿çšãããRoQã¯2005幎ã«ã¯å°è±¡çã§ãã²ãŒã å ã®ç»é¢ã§äœ¿çšããããšã¯å€§èãªåãã§ããã
- ãããªã¯1ç§ããã30ãã¬ãŒã ã§åçãããŸãã
- åãã¬ãŒã ã®è§£å床ã¯512x512ã§ããåœæã¯ããªãé«ãã§ã
- åãã¬ãŒã ã¯
idCinematicLocal::ImageForTime
CPUå ã§çæããããã®å Žã§OpenGLãã¯ã¹ãã£ãšããŠãããªããã»ããµã«ããŒããããŸããã
ãã ããã¹ã¯ãªãããšãã€ãã£ãã¡ãœãããåŒã³åºãæ©èœã®ãããã§ãã€ã³ã¿ã©ã¯ãã£ããµãŒãã§ã¹ã¯ããã«å€ãã®æ©èœãåããŠããŸãã
誰ããéåžžã«èå³ãæã£ãŠããŠã圌ãã¯ã©ãã«ãããŠDoom 1ãããŒã³ãããŸããïŒ

èå³æ·±ãäºå®ïŒã€ã³ã¿ã©ã¯ãã£ããµãŒãã§ã¹ã®æè¡ã¯ããã¹ãŠã®Doom3ã¡ãã¥ãŒïŒèšå®ãã¡ã€ã³ç»é¢ãªã©ïŒã®äœæã«ã䜿çšãããŸããã
ããå€ãã®èå³æ·±ããã®...
ãã®ã»ã¯ã·ã§ã³ã¯ãã¬ã³ããªã³ã°ã®æ°·å±±ã®äžè§ã«ããããããã«æ·±ãç解ããããšãã§ããŸãã
ããŒã4ïŒãããã¡ã€ãªã³ã°
Xcodeã«ã¯ãåªãããããã¡ã€ãªã³ã°æ¹æ³ã§ããInstrumentsããããŸããã²ãŒã äžããµã³ããªã³ã°ã¢ãŒãã§äœ¿çšããŸããïŒã²ãŒã ã®èªã¿èŸŒã¿ãå®å šã«åé€ãããããªããã»ããµã§ã¬ãã«ãäºåãã£ãã·ã¥ããŸãïŒã
埩ç¿

é«ã¬ãã«ã®ã«ãŒãã§ã¯ãããã»ã¹ã§å®è¡ãããŠãã3ã€ã®ã¹ã¬ããããããŸãã
- ã²ãŒã ããžãã¯ãšèŠèŠåãå®è¡ãããã¡ã€ã³ã¹ã¬ããã
- ãŠãŒã¶ãŒå ¥åãèç©ãããå¹æé³ãæ··åãããè£å©ã¹ããªãŒã ã
- CoreAudioãäœæããå®æçã«åŒã³åºãé³æ¥œã¹ããªãŒã ïŒãªãœãŒã¹ã®8ïŒ
ãæ¶è²»ïŒ
idAudioHardwareOSX
ïŒæ³šïŒãµãŠã³ããšãã§ã¯ãã¯OpenALã䜿çšããŠæäŸãããŸãããç¬èªã®ã¹ããªãŒã ã§ã¯å®è¡ãããŸããïŒã
ã¡ã€ã³ã¹ããªãŒã

ã¡ã€ã³ã®Doom 3ã¹ã¬ããã¯...
QuakeMain
ïŒé©ããããšã«ãMac OS Xã«Quake 3ã移æ€ããããŒã ã¯å€ãã³ãŒããåå©çšããã«éããããŸãããæéã®åé åžã¯å éšã§å®è¡ãããŸãïŒ
- ã°ã©ãã£ãã¯ã¹ã®ã¬ã³ããªã³ã°ã«65ïŒ
ãäžããããŠããŸãïŒ
UpdateScreen
ïŒã - 25ïŒ ãã²ãŒã ããžãã¯ã«äžããããŸããidSoftwareã«ãã£ãŠäœæãããã²ãŒã ã®å Žåãé©ãã»ã©å€ãã§ãã
ã²ãŒã ããžãã¯

ã²ãŒã ããžãã¯ã¯ãã¹ããŒã¹gamex86.dllïŒãŸãã¯Mac OS Xã®game.dylibïŒã§å®è¡ãããŸãã
ã²ãŒã ããžãã¯ã¯ãã¡ã€ã³ã¹ã¬ããæéã®25ïŒ ãå¿ èŠãšããŸãããããã¯ç°åžžã«å€§éã§ããããã«ã¯2ã€ã®çç±ããããŸãã
- ã€ã³ããªãžã§ã³ããšãŒãžã§ã³ãïŒIAïŒïŒä»®æ³ãã·ã³ãå®è¡ãããŠããããšã³ãã£ãã£ã«æèãèš±å¯ããŠããŸãããã¹ãŠã®ãã€ãã³ãŒãã解éãããã¹ã¯ãªããèšèªãããŸãã«ãç©æ¥µçã«äœ¿çšãããŠããããã§ãã
- ç©çãšã³ãžã³ã¯ããè€éïŒç·åœ¢çžè£æ§åé¡ã®ãœã«ããŒïŒã§ããããã以åã®ã²ãŒã ãšæ¯èŒããŠé«äŸ¡ã§ããåãªããžã§ã¯ãã«å¯ŸããŠå®è¡ãããã©ã°ããŒã«ã¢ããªã³ã°ãšçžäºäœçšã®è§£æ±ºãå«ãŸããŸãã
ã¬ã³ãã©ãŒ

äžèšã®ããã«ãã¬ã³ãã©ãŒã¯2ã€ã®éšåã§æ§æãããŠããŸãã
- ããã³ããšã³ãïŒ
idSessionLocal::Draw
ïŒã¯ãã¬ã³ããªã³ã°ããã»ã¹ã®43.9ïŒ ãå ããŸããDraw
ããã³ããšã³ãã¯1ã€ã®OpenGLã¬ã³ããªã³ã°åŒã³åºããè¡ããªããããããã¯ããªãäžé©åãªååã§ããããšã«æ³šæããŠãã ããïŒ
- ããã¯ãšã³ãïŒ
idRenderSessionLocale:EndFrame
ïŒã¯ãã¬ã³ããªã³ã°ããã»ã¹ã®55.9ïŒ ãå ããŸãã
è² è·åæ£ã¯ååã«ãã©ã³ã¹ãåããŠãããããã¯é©ãããšã§ã¯ãããŸããã
- ããã³ããšã³ãã¯ãå¯èŠãµãŒãã§ã¹ã®å®çŸ©ã«é¢é£ããå€ãã®èšç®ãå®è¡ããŸãã
- ãŸããããã³ããšã³ãã¯ã¢ãã«ã®ã¢ãã¡ãŒã·ã§ã³åãšåœ±ã®ã·ã«ãšããã®æ€çŽ¢ã«åãçµãã§ããŸãã
- ããã³ããšã³ãã¯ãããŒã¯ããããªããã»ããµã«ããŒãããŸãã
- ããã¯ãšã³ãã¯ãã·ã§ãŒããŒãã©ã¡ãŒã¿ãŒã®èª¿æŽãšãããªããã»ããµãšã®ããŒã¿äº€æã«å€ãã®æéãè²»ãããŸãïŒããšãã°ããšã³ãã¹å å·¥ã®ãã¯ã¹ãã£ã®äžè§åœ¢ã€ã³ããã¯ã¹ãŸãã¯é ç¹æ³ç·ãããªãã¯ã¹ãéä¿¡ããŸã
glDrawElements
ïŒã
ã¬ã³ãã©ãŒïŒããã³ããšã³ã

ããã³ããšã³ãã¬ã³ãã©ãŒïŒ
é©ãããšã§ã¯ãããŸããããã»ãšãã©ã®æéïŒ91ïŒ ïŒãVBOãããããªããã»ããµãžã®ããŒã¿ã®èªã¿èŸŒã¿ã«è²»ããããŠããŸãïŒ
R_AddModelSurfaces
ïŒãæéã®ããäžéšïŒ4ïŒ ïŒããå°åéã®ç§»åãšãã¹ãŠã®çžäºäœçšã®æ€çŽ¢ã«è²»ããããŠããŸãïŒ
R_AddLightSurfaces
ïŒãæå°æéïŒ2.9ïŒ ïŒã¯ãç®ã«èŠããè¡šé¢ã®æ±ºå®ã«è²»ããããŸãïŒBSPããã€ãã¹ããããŒã¿ã«ã·ã¹ãã ãééããŸãã
ã¬ã³ãã©ãŒïŒããã¯ãšã³ã

ã¬ã³ãã©ãŒããã¯ãšã³ãïŒ
æããã«ãããã¯ãšã³ãã¯ãããã¡ãŒãå€æŽãïŒ
GLimp_SwapBuffers
ïŒãç»é¢ãšã®åæïŒ10ïŒ ïŒã«æéãè²»ãããŠããŸããããã¯ãã²ãŒã ãããã«ãããã¡ãŒç°å¢ã§å®è¡ãããããã§ãã5ïŒ ã¯ãæåã®ãã¹ã§å®å šãªåæç»ãåé¿ããã³ã¹ãã§ããããã¯ãäž»ã«Zãããã¡ãŒïŒ
RB_STS_FillDepthBuffer
ïŒãæºãããŸãã
裞ã®çµ±èš

Instrumentsãã¬ãŒã¹ãããŠã³ããŒãããèªåã§æ¢æ»ãéå§ããããã«èšå®ãããŠããå Žåããããã¡ã€ã«ãã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
ããŒã4ïŒã¹ã¯ãªããåãããä»®æ³ãã·ã³
idTech1ããidTech3ã«æ¯åå®å šã«å€æŽãããå¯äžã®éšåã¯ãã¹ã¯ãªããã·ã¹ãã ã§ããã
- idTech1ïŒä»®æ³ãã·ã³ã§å®è¡ãããŠããQuakeCã
- idTech2ïŒx86å ±æã©ã€ãã©ãªã«ã³ã³ãã€ã«ãããCïŒä»®æ³ãã·ã³ãªãïŒã
- idTech3ïŒCãLCCã䜿çšããŠãã€ãã³ãŒãã«ã³ã³ãã€ã«ãããQVMïŒQuake Virtual MachineïŒã§å®è¡ãããŸããx86ãã©ãããã©ãŒã ã§ã¯ããã€ãã³ãŒãã¯ããŒãæã«ãã€ãã£ãã³ãã³ãã«å€æãããŸããã
idTech4ãäŸå€ã§ã¯ãªãããã¹ãŠãåã³å€æŽãããŸããã
- ã¹ã¯ãªããã¯ãC ++ã«äŒŒããªããžã§ã¯ãæåèšèªã䜿çšããŠè¡ãããŸãã
- èšèªã¯ããªãå¶éãããŠããŸãïŒtypedefãªãã5ã€ã®åºæ¬åïŒã
- ããã¯åžžã«ä»®æ³ãã·ã³ã§è§£éãããŸããidTech3ã®ããã«ããã€ãã£ãã³ãã³ããžã®JITå€æã¯ãããŸããïŒãžã§ã³ã«ãŒããã¯ã¯ã€ã³ã¿ãã¥ãŒã§ããã«ã€ããŠè©³ãã説æããŸããïŒã
Doom3 Scripting SDKã«ã€ããŠã®æ³šæäºé ããå§ããã®ãè¯ãã§ãããã
建ç¯
å šäœåã¯æ¬¡ã®ãšããã§ãã
ã³ã³ãã€ã«ïŒ
idCompiler
1ã€ã®å®çŸ©æžã¿ãã¡ã€ã«ãããŒãæã«è»¢éãããŸã
.script
ãäžé£ã®ãã£ã¬ã¯ãã£ã
#include
ã¯ããã¹ãŠã®ã¹ã¯ãªããã®è¡ãšãã¹ãŠã®é¢æ°ã®ãœãŒã¹ã³ãŒããå«ãã¹ã¯ãªããã¹ã¿ãã¯ãäœæããŸããã¹ãã£ã³ãã
idLexer
ãåºæ¬ããŒã¯ã³ïŒããŒã¯ã³ïŒãçæãããŸããããŒã¯ã³ãå ¥ã
idParser
ã1ã€ã®å·šå€§ãªãã€ãã³ãŒããçæãããŸããããã¯ã·ã³ã°ã«ãã³ã«ä¿åãã
idProgram
ãŸããä»®æ³ãã·ã³ã®RAMãè¡šããVM
.text
ãšã®ã»ã°ã¡ã³ããå«ãŸããŸã
.data
ã

ä»®æ³ãã·ã³ïŒå®è¡æ
idThread
ã«ããªã³ã¯ãªã¹ãã®æåŸã«éãããŸã§ããšã³ãžã³ã¯åã¹ã¬ããã«å®éã®CPUã®æéãïŒæ¬¡ã ã«ïŒå²ãåœãŠãŸãããããã
idThread
ãå«ãŸããŠããŸã
idInterpreter
ä»®æ³ãã·ã³ã®CPUã®ç¶æ ãä¿åããŸããã€ã³ã¿ããªã¿ãéåžžèã«ãªãã500äžãè¶ ããåœä»€ã«åŸããªãéããCPUã¯ããã空ã«ããããšã¯ã§ããŸãããããã¯å ±åãã«ãã¿ã¹ã¯ã§ãã
ã³ã³ãã€ã©
ã³ã³ãã€ã«ãã€ãã©ã€ã³ã¯ãããªããã»ããµããªãããšãé€ãã°ãGoogle V8ãClangãªã©ã®ä»ã®ã³ã³ãã€ã©ãŒãèªããšãã«è¡šç€ºããããã®ãšäŒŒãŠããŸãããããã£ãŠããã³ã¡ã³ãã¹ããããããã¯ãããã£ã¬ã¯ãã£ãïŒïŒincludeãïŒifïŒãªã©ã®æ©èœã¯ãåå¥è§£æããã°ã©ã ãšããŒãµãŒã®äž¡æ¹ã§å®è¡ããå¿ èŠããããŸãã
以æ¥
idLexer
ãåºããã¹ãŠã®ããã¹ããªãœãŒã¹ïŒãããããšã³ãã£ãã£ã®ã«ãŒãã«ã¡ã©ïŒã解æããããã«ãšã³ãžã³åšãã«äœ¿çšãããã¯éåžžã«åå§çã§ããããšãã°ãåèš5çš®é¡ã®ããŒã¯ã³ãè¿ããŸãã
- TT_STRING
- TT_LITERAL
- TT_NUMBER
- TT_NAME
- TT_PUNCTUATION
ãããã£ãŠãããŒãµãŒã¯ãæšæºãã³ã³ãã€ã©ãŒãã€ãã©ã€ã³ãããå€ãã®äœæ¥ãè¡ããŸãã
ã²ãŒã ãéå§ããããšãidCompilerã¯æåã®ã¹ã¯ãªãããããŒãããŸãã
script/doom_main.script
ã·ãªãŒãº
#include
ã¯ã1ã€ã®å·šå€§ãªã¹ã¯ãªããã«æ¥ç¶ãããã¹ã¯ãªããã®ã¹ã¿ãã¯ãäœæããŸãã
ãšã³ãžã³ããŒãµãŒã¯ãååž°äžéãåããæšæºã®äžéããŒãµãŒã®ããã§ããã¹ã¯ãªããèšèªã®ææ³ã¯LLïŒ1ïŒã§ããã0ã®ãªã¿ãŒã³ãå¿ èŠãªããã§ãïŒã¬ãã·ã«ã«ã¢ãã©ã€ã¶ãŒã«ã¯åäžã®ããŒã¯ã³ã®èªã¿åãããã£ã³ã»ã«ããæ©èœããããŸãïŒããã§ã«ãã®æ¬ãèªãã§ããã°ãè¿·ãããšã¯ãããŸãã...ããããããã§ãªããªããããã¯ç解ãå§ããè¯ãçç±ã§ãã
éèš³
å®è¡æã«ãã€ãã³ãã¯äœæãããªã¬ãŒããŸã
idThread
ãããã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¹ã¬ããã§ã¯ãªããä»®æ³ãã·ã³ã¹ã¬ããã§ãã CPUã¯äžå®ã®æéãäžããŸãããããã
idThread
ã«
idInterpreter
ã³ãã³ããã€ã³ã¿ãŒã¢ãã¿ãŒãš2ã€ã®ã¹ã¿ãã¯ïŒ1ã€ã¯ããŒã¿/ãã©ã¡ãŒã¿ãŒçšããã1ã€ã¯é¢æ°åŒã³åºãã®è¿œè·¡çšïŒããããŸãã
å®è¡ã¯
idInterpreter::Execute
ãã€ã³ã¿ãŒããªã¿ãŒãä»®æ³ãã·ã³ã®å¶åŸ¡ãåæ¢ãããŸã§è¡ãããŸããããã¯ãå ±åãã«ãã¿ã¹ã¯ã§ãã
idThread::Execute bool idInterpreter::Execute(void) { doneProcessing = false; while( !doneProcessing && !threadDying ) { instructionPointer++; st = &gameLocal.program.GetStatement( instructionPointer ); //op - (unsigned short), 65 535 switch( st->op ) { . . . } } }
idInterpreter
å¶åŸ¡ãæž¡ããåŸã
idThread::Execute
ã©ã³ã¿ã€ã ãå¿ èŠãšããã¹ã¬ããããªããªããŸã§æ¬¡ã®ã¡ãœãããåŒã³åºãããŸããå šäœçãªã¢ãŒããã¯ãã£ã¯ãAnother Worldä»®æ³ãã·ã³ã®å³ã匷ãæãåºãããŸããã
èå³æ·±ãäºå®ïŒãã€ãã³ãŒãã¯ãã¢ã¯ãã£ããªäœ¿çšãç®çãšããŠããªããããx86ã³ãã³ãã«å€æãããŸããããããããã®çµæãå€ãã®ããšãã¹ã¯ãªãããä»ããŠè¡ããããããDoom3ã¯ãQuake3ã®ããã«ãJITããx86ã³ãã³ããžã®å€æãã倧ããªå©çãåŸãŸãã