
ããã«ã¡ã¯ãRiotã®ãšã³ãžãã¢ã§ããTony Albrechtã§ãã ãããã¡ã€ã«ãšæé©åã奜ãã§ãã ãã®èšäºã§ã¯ããããã¡ã€ãªã³ã°ã®åºæ¬ã«ã€ããŠèª¬æããWindowsãã·ã³ã§ã®ãããã¡ã€ãªã³ã°äžã«C ++ã³ãŒãã®äŸãåæããŸãã æãåçŽãªãã®ããå§ããåŸã
ã«äžå€®åŠçè£
眮ã®å
èãæãäžããŠãããŸãã æé©åã®æ©äŒã«åºäŒã£ãããå€æŽãå®è£
ããŸãã次ã®èšäºã§ã¯ãLeague of Legendsã®ã³ãŒãããŒã¹ã®å®éã®äŸãåæããŸãã è¡ããïŒ
ã³ãŒãã¬ãã¥ãŒ
æåã«ããããã¡ã€ã«ããã³ãŒããèŠãŠãã ããã ç§ãã¡ã®ããã°ã©ã ã¯ãã·ã³ãã«ãªå°ããªOpenGLã¬ã³ãã©ãŒããªããžã§ã¯ãæåãéå±€ã·ãŒã³ããªãŒã§ãã ç§ã¯ãªãœãŒã¹çã«ã¡ã€ã³ãªããžã§ã¯ãObjectãåŒã³åºããŸãã-ã·ãŒã³å
ã®ãã¹ãŠã¯ãããã®åºæ¬ã¯ã©ã¹ã®1ã€ããç¶æ¿ããŸãã ã³ãŒãã§ã¯ãNodeãCubeãããã³Modifierã®ã¿ãObjectããç¶æ¿ãããŸãã

ãã¥ãŒãã¯ãç»é¢äžã§ããèªäœããã¥ãŒããšããŠã¬ã³ããªã³ã°ãããªããžã§ã¯ãã§ãã ã¢ãã£ãã¡ã€ã€ã¯ãã·ãŒã³ããªãŒå
ã§ãåç¶ããããªããžã§ã¯ãã§ãããæŽæ°ããããšãããã«è¿œå ããããªããžã§ã¯ããå€æããŸãã ããŒãã¯ãä»ã®ãªããžã§ã¯ããå«ãå¯èœæ§ã®ãããªããžã§ã¯ãã§ãã
ã·ã¹ãã ã¯ãããŒãã«ãã¥ãŒããè¿œå ããããä»ã®ããŒãã«äžéšã®ããŒããè¿œå ãããããŠããªããžã§ã¯ãã®éå±€ãäœæã§ããããã«èšèšãããŠããŸãã ïŒä¿®é£Ÿåã䜿çšããŠïŒããŒããå€æãããšãããŒãã«å«ãŸãããã¹ãŠã®ãªããžã§ã¯ããå€æãããŸãã ãã®åçŽãªã·ã¹ãã ã䜿çšããŠãäºãã«åšåãããã¥ãŒãããªãŒãäœæããŸããã

ææ¡ãããã³ãŒãã¯ã·ãŒã³ããªãŒã®æé©ãªå®è£
ã§ã¯ãããŸãããã倧äžå€«ã§ãããã®ã³ãŒãã¯ãã®åŸã®æé©åã«å¿
èŠã§ãã å®éãããã¯2009幎ã«ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®èœãšãç©Žã®ããã©ãŒãã³ã¹ãåæããããã«æžããPlayStation3®ã®äŸã®çŽæ¥ç§»æ€ã§ãã ä»æ¥ã®èšäºã9幎åã®èšäºãšéšåçã«æ¯èŒããŠããã€ãŠPS3ã«ã€ããŠåŠãã æèšãææ°ã®ããŒããŠã§ã¢ãã©ãããã©ãŒã ã«åœãŠã¯ãŸããã©ããã確èªã§ããŸãã
ãããããã¥ãŒãã«æ»ããŸãããã äžèšã®gifã¯ãçŽ55ååã®å転ããç«æ¹äœã瀺ããŠããŸãã ã·ãŒã³ã®ã¬ã³ããªã³ã°ã®ãããã¡ã€ã«ãäœæããã®ã§ã¯ãªããã¬ã³ããªã³ã°æã®ã¢ãã¡ãŒã·ã§ã³ãšã«ãªã³ã°ã®ã¿ããããã¡ã€ã«ããããšã«æ³šæããŠãã ããã ãµã³ãã«ã®äœæã«é¢ä¿ããã©ã€ãã©ãªïŒ 芪æãªãImguiãšBulletã® Vectormathãäž¡æ¹ãšãç¡æã ãããã¡ã€ãªã³ã°ã«ã¯ãAMD Code XLãšããã®èšäºã®éæ»ã«çµã¿èŸŒãŸããã·ã³ãã«ãªèšè£
ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŸããã
ä»äºã«åããããåã«
åäœ
æåã«ãããã©ãŒãã³ã¹æž¬å®ã«ã€ããŠèª¬æããŸãã ã²ãŒã ã§ã¯ã1ç§ãããã®ãã¬ãŒã æ°ïŒFPSïŒãææšãšããŠãã䜿çšãããŸãã ããã¯åªããããã©ãŒãã³ã¹ã€ã³ãžã±ãŒã¿ã§ããããã¬ãŒã ã®äžéšãåæããããããŸããŸãªæé©åã«ããæ¹åãæ¯èŒããããããšãã«ã¯åœ¹ã«ç«ã¡ãŸããã ãã²ãŒã ã¯ä»ã§ã¯æ¯ç§20ãã¬ãŒã é«éã«ãªããŸããïŒããšèšã£ãŠã¿ãŸããã-ããã¯äžè¬çã«ã©ããããé«éã§ããïŒ
ããã¯ç¶æ³æ¬¡ç¬¬ã§ãã 60 FPSïŒãŸãã¯ãã¬ãŒã ããã1000/60 = 16.666ããªç§ïŒã§ãçŸåš80 FPSïŒãã¬ãŒã ããã1000/80 = 12.5ããªç§ïŒã®å Žåãæ¹åã¯16.666ããªç§-12.5ããªç§= 4.166ããªç§ã§ããã¬ãŒã ããšã ããã¯è¯ãã²ã€ã³ã§ãã
ãããã20 FPSããããä»ã§ã¯40 FPSã«ãªã£ãŠããå Žåãæ¹åã¯æ¢ã«çãããªããŸãïŒ1000/20-1000/40ïŒ= 50 ms-25 ms =ãã¬ãŒã ããã25 msïŒ ããã¯ãã²ãŒã ããåçäžèœãããã蚱容å¯èœãã«å€ããããšãã§ãã匷åãªããã©ãŒãã³ã¹ããŒã¹ãã§ãã FPSã¡ããªãã¯ã®åé¡ã¯çžå¯Ÿå€ã§ãããããåžžã«ããªç§ã䜿çšããŸãã åžžã«ã
枬å®ãã
ãããã¡ã€ã©ãŒã«ã¯ããã€ãã®çš®é¡ããããããããã«é·æãšçæããããŸãã
èšè£
æ©åš
èšè£
ããããããã¡ã€ã©ãŒã®å Žåãããã°ã©ããŒã¯ãããã©ãŒãã³ã¹ã枬å®ããå¿
èŠãããã³ãŒããæåã§ããŒã¯ããå¿
èŠããããŸãã ãããã®ãããã¡ã€ã©ãŒã¯ãäžæã®ããŒã«ãŒã«çŠç¹ãåãããŠããããã¡ã€ã«ããããã©ã°ã¡ã³ãã®éå§æéãšçµäºæéãæ€åºããŠä¿åããŸãã äŸïŒ
void Node::Update() { FT_PROFILE_FN for(Object* obj : mObjects) { obj->Update(); } }
ãã®å Žåã FT_PROFILE_FN
ã¯ãäœææéãä¿®æ£ãããªããžã§ã¯ããäœæããã¹ã³ãŒãå€ã«ãªã£ããšãã«ç Žæ£ããŸãã ãããã®æç¹ã¯ãé¢æ°ã®ååãšãšãã«ããã®åŸã®åæãšèŠèŠåã®ããã«ãããçš®ã®é
åã«ä¿åãããŸãã è©ŠããŠã¿ããšãã³ãŒãã§èŠèŠåãå®è£
ã§ããŸãããŸãã¯ã Chromeãã¬ãŒã¹ãªã©ã®ããŒã«ã§ãå°ãç°¡åã«å®è£
ã§ããŸã ã
ãã¹ããããã¡ã€ãªã³ã°ã¯ãã³ãŒãããã©ãŒãã³ã¹ã®èŠèŠåãšããŒã¹ãã®æ€åºã«æé©ã§ãã ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ç¹æ§ãéå±€ã®åœ¢ã§æ瀺ãããŠããå Žåãã©ã®é¢æ°ãå
šäœãšããŠæããã£ããåäœããä»ã®ã»ãšãã©ã®æ©èœãåŒãèµ·ãããå®è¡æéãæãå€åãããããªã©ãããã«ç¢ºèªã§ããŸãã

ãã®å³ã§ã¯ãåè²ã®ãµã€ã³ããæ©èœã«å¯Ÿå¿ããŠããŸãã ä»ã®ãµã€ã³ãã®ããäžã«ãããµã€ã³ãã¯ããäžæµãæ©èœãšåŒã°ããæ©èœã瀺ããŸãã ãã¬ãŒãã®é·ãã¯ãæ©èœã®æç¶æéã«æ¯äŸããŸãã
èšè£
ãããã¡ã€ãªã³ã°ã¯è²ŽéãªèŠèŠæ
å ±ãæäŸããŸãããäŸç¶ãšããŠæ¬ é¥ããããŸãã ããã°ã©ã ã®å®è¡ãé
ããªããŸãã枬å®ããã»ã©ãããã°ã©ã ã¯é
ããªããŸãã ãããã£ãŠã枬å®ããã³å¶åŸ¡ãããã¡ã€ã©ãŒãäœæãããšãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæå°éã«æããŠãã ããã ã¹ããŒæ©èœãã¹ããããããšããããã¡ã€ã«ã«å€§ããªã®ã£ããã衚瀺ãããŸãã ãŸããã³ãŒãã®åè¡ã®é床ã«é¢ããæ
å ±ã¯åŸãããŸãããå¯èŠé åã®ã¿ãç°¡åã«ããŒã¯ã§ããŸããã枬å®ãšãããã¡ã€ãªã³ã°ã®ãªãŒããŒãããã¯éåžžãåã
ã®è¡ã®å¯äžãç¡å¹ã«ããããããããã枬å®ããã ãã§ã¯åœ¹ã«ç«ã¡ãŸããã
ãµã³ããªã³ã°ãããã¡ã€ã©ãŒ
ãµã³ããªã³ã°ãããã¡ã€ã©ãŒã¯ããããã¡ã€ãªã³ã°ããããã»ã¹ã®å®è¡ã¹ããŒã¿ã¹ãèŠæ±ããŸãã å®è¡äžã®åœä»€ã瀺ãããã°ã©ã ã«ãŠã³ã¿ãŒïŒããã°ã©ã ã«ãŠã³ã¿ãŒãPCïŒãå®æçã«ä¿åããçŸåšã®åœä»€ãå«ãŸããŠããé¢æ°ãåŒã³åºããé¢æ°ã調ã¹ãããã«ã¹ã¿ãã¯ãä¿åããŸãã ã»ãšãã©ã®ãµã³ãã«ãå«ãé¢æ°ãŸãã¯è¡ãæãé
ãé¢æ°ãŸãã¯è¡ã«ãªãããããã®æ
å ±ã¯ãã¹ãŠæçšã§ãã ãµã³ããªã³ã°ãããã¡ã€ã©ã®æç¶æéãé·ãã»ã©ãããå€ãã®åœä»€ãšã¹ã¿ãã¯ã®ãµã³ãã«ãåéãããçµæãæ¹åãããŸãã

ãµã³ããªã³ã°ãããã¡ã€ã©ãŒã䜿çšãããšãå¶åŸ¡ããã³æž¬å®ãããã¡ã€ã©ãŒã®å Žåã®ããã«ãããã°ã©ã ããã©ãŒãã³ã¹ã®éåžžã«äœã¬ãã«ã®ç¹æ§ãåéã§ããæåã®ä»å
¥ãå¿
èŠãšããŸããã ããã«ãããã°ã©ã ã®å®è¡ç¶æ
å
šäœãèªåçã«ã«ããŒããŸãã ãããã®ãããã¡ã€ã©ãŒã«ã¯2ã€ã®äž»ãªæ¬ ç¹ããããŸããåãã¬ãŒã ã®ããŒã¹ãã決å®ããã®ã«ã¯ããŸã圹ã«ç«ããããŸããç¹å®ã®é¢æ°ãä»ã®é¢æ°ã«å¯ŸããŠãã€åŒã³åºãããããç¥ãããšãã§ããŸããã ã€ãŸããåªããå¶åŸ¡ããã³æž¬å®ãããã¡ã€ã©ãŒãšæ¯èŒããŠãéå±€åŒã³åºãã«é¢ããæ
å ±ãå°ãªããªããŸãã
å°éã®ãããã¡ã€ã©ãŒ
ãããã®ãããã¡ã€ã©ãŒã¯ãç¹å®ã®ããã»ã¹æ
å ±ãæäŸããŸãã éåžžã¯ãäžå€®åŠçè£
眮ããããªã«ãŒããªã©ã®ããŒããŠã§ã¢èŠçŽ ã«é¢é£ä»ããããŠãããããšãã°ãã£ãã·ã¥ãã¹ã誀ã£ãåå²äºæž¬ãªã©ããŠãŒã¶ãŒãèå³ãæã£ãŠããç¹å®ã®ã€ãã³ããçæããããšãã§ããŸãã æ©åšã¡ãŒã«ãŒã¯ããããã®ã€ãã³ãã枬å®ããæ©èœãåããŠãããããããã©ãŒãã³ã¹ã®äœäžã®åå ãç°¡åã«èŠã€ããããšãã§ããŸãã ãããã£ãŠããããã®ãããã¡ã€ã«ãç解ããã«ã¯ã䜿çšããããŒããŠã§ã¢ã®ç¥èãå¿
èŠã§ãã
ã²ãŒã åºæã®ãããã¡ã€ã©ãŒ
ããäžè¬çãªã¬ãã«ã§ã¯ãã²ãŒã åºæã®ãããã¡ã€ã©ãŒã¯ãããšãã°ãç»é¢äžã®ãããªã³ã®æ°ãããã£ã©ã¯ã¿ãŒã®èŠéå
ã®ç®ã«èŠããç²åã®æ°ãã«ãŠã³ãã§ããŸãã ãã®ãããªãããã¡ã€ã©ãŒãéåžžã«äŸ¿å©ã§ãã²ãŒã ããžãã¯ã®é«ã¬ãã«ã®ãšã©ãŒãç¹å®ããã®ã«åœ¹ç«ã¡ãŸãã
ãããã¡ã€ãªã³ã°
æ¯èŒæšæºãªãã§ã¢ããªã±ãŒã·ã§ã³ããããã¡ã€ãªã³ã°ããããšã¯æå³ããªããªããããæé©åãããšãã«ã¯ãä¿¡é Œã§ãããã¹ãã¹ã¯ãªãããæå
ã«çšæããå¿
èŠããããŸãã èŠãç®ã»ã©åçŽã§ã¯ãããŸããã ææ°ã®ã³ã³ãã¥ãŒã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ã ãã§ãªããæ°çŸããããã¯æ°çŸã®ä»ã®ããã»ã¹ãå®è¡ãã絶ããããããåãæ¿ããŸãã ã€ãŸããä»ã®ããã»ã¹ã¯ãããã€ã¹ãžã®ã¢ã¯ã»ã¹ïŒããšãã°ãããã€ãã®ããã»ã¹ããã£ã¹ã¯ããã®èªã¿åããè©Šã¿ãŠããïŒãããã»ããµ/ãããªã«ãŒããªãœãŒã¹ã®ç«¶åã«ããããããã¡ã€ãªã³ã°ããŠããããã»ã¹ã®é床ãäœäžãããå¯èœæ§ããããŸãã ãããã£ãŠãé©åãªéå§ç¹ãåŸãã«ã¯ãã¿ã¹ã¯ã«åããããåã«ãããã€ãã®ãããã¡ã€ãªã³ã°æäœãéããŠã³ãŒããå®è¡ããå¿
èŠããããŸãã å®è¡ã®çµæã倧ããç°ãªãå Žåã¯ãçç±ãææ¡ããŠãã®å€åãåãé€ãããå°ãªããšããããæžããå¿
èŠããããŸãã
çµæã®å¯èœãªéãæå°ã®åºãããéæããåŸãã·ã¹ãã ã®ããã€ãºãã§å€±ãããå¯èœæ§ããããããå°ããªæ¹åïŒå©çšå¯èœãªå€åæ§ãããå°ããïŒã¯æž¬å®ãé£ããããšãå¿ããªãã§ãã ããã ã²ãŒã ã®ç¹å®ã®ã·ãŒã³ããã¬ãŒã ããšã«14ã18ããªç§ã®ç¯å²ã§è¡šç€ºãããå¹³åã§16ããªç§ã§ãããšããŸãã é¢æ°ã®æé©åããªãããã¡ã€ãªã³ã°ããã¬ãŒã ããã15.5ããªç§ã®ååŸã«2é±éãè²»ãããŸããã éãã§ããïŒ æ£ç¢ºã«èª¿ã¹ãã«ã¯ãã²ãŒã ãäœåºŠãå®è¡ããŠããã®ã·ãŒã³ããããã¡ã€ãªã³ã°ããç®è¡å¹³åå€ãèšç®ããåŸåãããããããå¿
èŠããããŸãã ããã§èª¬æããã¢ããªã±ãŒã·ã§ã³ã§ã¯ãæ°çŸã®ãã¬ãŒã ã枬å®ããçµæãå¹³åããŠä¿¡é Œã§ããååãªå€ãååŸããŸãã
ããã«ãå€ãã®ã²ãŒã ã¯è€æ°ã®ã¹ã¬ããã§å®è¡ãããŸãããã®é åºã¯ããŒããŠã§ã¢ãšOSã«ãã£ãŠæ±ºå®ãããé決å®çãªåäœãå°ãªããšãç°ãªãå®è¡æéã«ã€ãªããå¯èœæ§ããããŸãã ãããã®èŠå ã®åœ±é¿ãå¿ããªãã§ãã ããã
äžèšã«é¢é£ããŠããããã¡ã€ãªã³ã°ãšæé©åã®ããã®å°ããªãã¹ãã¹ã¯ãªãããäœæããŸããã ç解ããã®ã¯ç°¡åã§ãããããã©ãŒãã³ã¹ã倧å¹
ã«åäžããããªãœãŒã¹ãããã»ã©è€éã§ãã ç°¡åã«ããããã«ããããã¡ã€ãªã³ã°æã«ã¬ã³ããªã³ã°ããªãã«ããŠãäžå€®åŠçè£
眮ã«é¢é£ããèšç®ã³ã¹ãã®ã¿ã衚瀺ããããšã«æ³šæããŠãã ããã
ã³ãŒãã®ãããã¡ã€ãªã³ã°
以äžã¯æé©åããã³ãŒãã§ãã 1ã€ã®äŸããããã¡ã€ãªã³ã°ã®ã¿ãæããŠãããããšãå¿ããªãã§ãã ããã ç¬èªã®ã³ãŒãã®ãããã¡ã€ãªã³ã°ã§äºæ³å€ã®å°é£ã«ééããããšã¯ééããããŸããããã®èšäºãç¬èªã®èšºæãã¬ãŒã ã¯ãŒã¯ã®äœæã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
{ FT_PROFILE("Update"); mRootNode->Update(); } { FT_PROFILE("GetWBS"); BoundingSphere totalVolume = mRootNode->GetWorldBoundingSphere(Matrix4::identity()); } { FT_PROFILE("cull"); uint8_t clipFlags = 63; mRootNode->Cull(clipFlags); } { FT_PROFILE("Node Render"); mRootNode->Render(mvp); }
ããŸããŸãªã¹ã³ãŒãã«å¶åŸ¡ãã¯ãFT_PROFILE()
ãè¿œå ããŠãã³ãŒãã®ããŸããŸãªéšåã®å®è¡æéã枬å®ããŸããã 以äžã§ã¯ãåãã©ã°ã¡ã³ãã®ç®çã«ã€ããŠè©³ãã説æããŸãã
ã³ãŒããå®è¡ãã枬å®ããããããã¡ã€ã«ããããŒã¿ãæžã蟌ããšãChromeã§æ¬¡ã®ç»åã衚瀺ãããŸããïŒ//ãã¬ãŒã¹ïŒ

ããã¯åäžã®ãã¬ãŒã ãããã¡ã€ã«ã§ãã ããã§ã¯ãåé¢æ°åŒã³åºãã®çžå¯Ÿçãªæéã確èªããŸãã å®è¡é åºã確èªã§ããããšã«æ³šæããŠãã ããã ãããã®é¢æ°åŒã³åºãã«ãã£ãŠåŒã³åºãããé¢æ°ã枬å®ãããšã芪é¢æ°ã®ãµã€ã³ãã®äžã«è¡šç€ºãããŸãã ããšãã°ã Node::Update()
ã枬å®ãããã®ååž°åŒã³åºãæ§é ãååŸããŸããã

枬å®äžã®ãã®ã³ãŒãã®1ãã¬ãŒã ã®å®è¡æéã¯æ°ããªç§ç°ãªããããå°ãªããšãæ°çŸãã¬ãŒã ã®ç®è¡å¹³åãåããå
ã®æšæºãšæ¯èŒããŸãã ãã®å Žåã297ãã¬ãŒã ã枬å®ãããå¹³åå€ã¯17.5ããªç§ã§ãäžéšã®ãã¬ãŒã ã¯19ããªç§ãŸã§å®è¡ããããã®ä»ã¯16.5ããªç§æªæºã§ããããããããã§ã»ãŒåãããšãå®è¡ãããŸããã ããã¯ããã¬ãŒã ã®æé»çãªå€åã§ãã ç¹°ãè¿ãå®è¡ããŠçµæãå®å®ããŠæ¯èŒãããšãçŽ17.5ããªç§ãåŸãããããããã®å€ã¯ä¿¡é Œã§ããåºçºç¹ãšèããããšãã§ããŸãã

ã³ãŒãã®ãã§ãã¯ããŒã¯ãç¡å¹ã«ããŠã AMD CodeXLãµã³ããªã³ã°ãããã¡ã€ã©ãŒã§å®è¡ãããšã次ã®å³ã衚瀺ãããŸãã

æããèŠæ±ãããã5ã€ã®é¢æ°ãåæãããšã次ã®çµæãåŸãããŸãã

æãé
ãé¢æ°ã¯è¡åä¹ç®ã®ããã§ãã ãããã®ãã¹ãŠã®å転ã«å¯ŸããŠãé¢æ°ã¯å€ãã®èšç®ãå®è¡ããå¿
èŠããããããè«ççã«èãããŸãã äžã®å³ã§ã¹ã¿ãã¯éå±€ãããèŠããšã Modifier::Update()
ã Node::Update()
ã GetWorldBoundingSphere()
ããã³Node::Render()
ã䜿çšããŠè¡åä¹ç®æŒç®åãåŒã³åºãããŠããããšãGetWorldBoundingSphere()
ãŸãã éåžžã«å€ãã®å Žæããé »ç¹ã«åŒã³åºãããããããã®æŒç®åã¯æé©åã®è¯ãåè£ãšèŠãªãããšãã§ããŸãã
ãããªãã¯ã¹::æŒç®å*
ãµã³ããªã³ã°ãããã¡ã€ã©ãŒã䜿çšããŠãä¹ç®ã«é¢äžããã³ãŒããåæãããšãåè¡ã®ãã³ã¹ãããããããŸãã

æ®å¿µãªããšã«ãè¡åä¹ç®ã³ãŒãã®é·ãã¯ïŒå¹çã®ããïŒ1è¡ã®ã¿ã§ããããããã®çµæã¯ã»ãšãã©åŸãããŸããã ãŸãã¯ãããã»ã©å°ãããªãã§ããïŒ
ã¢ã»ã³ãã©ãèŠããšãæ©èœã®ããããŒã°ãšãšãããŒã°ãç¹å®ã§ããŸãã

ããã¯ãå
éšé¢æ°åŒã³åºãåœä»€ã®ã³ã¹ãã§ãã ããããŒã°ã§ã¯ãæ°ããã¹ã¿ãã¯ã¹ããŒã¹ãæå®ããïŒESPã¯çŸåšã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒãEBPã¯çŸåšã®ã¹ã¿ãã¯ãã¬ãŒã ã®ããŒã¹ãã€ã³ã¿ãŒïŒããšãããŒã°ã¯ã¯ãªãŒã³ã¢ããããŠæ»ããŸãã ã€ã³ã©ã€ã³ã§ã¯ãªããããçš®ã®ã¹ã¿ãã¯ã¹ããŒã¹ã䜿çšããïŒã€ãŸããããŒã«ã«å€æ°ãæã£ãŠããïŒé¢æ°ãåŒã³åºããã³ã«ãããããã¹ãŠã®åœä»€ãæ¿å
¥ããŠåŒã³åºãããšãã§ããŸãã
é¢æ°ã®æ®ãã®éšåãå±éããŠãè¡åã®ä¹ç®ãå®éã«è¡ãããšãèŠãŠã¿ãŸãããã

ãããŒãããããã®ã³ãŒãïŒ ãããŠãããã¯æåã®ããŒãžã®ã¿ã§ãã å®å
šãªæ©èœã¯250-300åœä»€ã§1ãããã€ã以äžã®ã³ãŒããå¿
èŠãšããŸãïŒ é¢æ°ã®å§ãŸããåæããŸãã

éè²ã§åŒ·èª¿è¡šç€ºãããäžã®è¡ã¯ãåèšå®è¡æéã®çŽ10ïŒ
ããããŸãã é£æ¥ãããã®ããããã£ãšé
ãã®ã¯ãªãã§ããïŒ ãã®MOVSSåœä»€ã¯ãeax + 34hã§ã¡ã¢ãªããæµ®åå°æ°ç¹å€ãååŸããxmm4ã¬ãžã¹ã¿ã«æ ŒçŽããŸãã äžèšã®è¡ã¯xmm1ã¬ãžã¹ã¿ã§ãåãã§ãããã¯ããã«é«éã§ãã ãªãã§ïŒ
ãã£ãã·ã¥ãã¹ããã¹ãŠã§ãã
ããèŠãŠã¿ãŸãããã åã
ã®æ瀺ã®ãµã³ããªã³ã°ã¯ãããŸããŸãªç¶æ³ã«é©çšã§ããŸãã ææ°ã®ããã»ããµã¯ãã€ã§ãè€æ°ã®åœä»€ãå®è¡ãã1ã¯ããã¯ãµã€ã¯ã«äžã«å€ãã®åœä»€ãåãœãŒãïŒãªã¿ã€ã¢ïŒã§ããŸãã ã€ãã³ãããŒã¹ã®ãµã³ããªã³ã°ã§ãããã€ãã³ããééã£ãæ瀺ã«èµ·å ãããããšãã§ããŸãã ãããã£ãŠãã¢ã»ã³ãã©ã®ãµã³ããªã³ã°ãåæãããšãã¯ãäœããã®ããžãã¯ã«å°ãããå¿
èŠããããŸãã ãã®äŸã§ã¯ãæããµã³ããªã³ã°ãããåœä»€ãæãé
ããªãããšã¯ãããŸããã ãã®ç·ã«é¢é£ããäœãã®é
ãåäœã«ã€ããŠã¯ãããçšåºŠã®ç¢ºå®æ§ããã£ãŠã®ã¿èšãããšãã§ããŸãã ãŸããããã»ããµã¯ã¡ã¢ãªãšã®éã§å€æ°ã®MOVãå®è¡ããããããããã®MOVãããã©ãŒãã³ã¹ã®äœäžã®åå ã§ãããšæ³å®ããŸãã ããã確èªããã«ã¯ããã£ãã·ã¥ãã¹ã®ã€ãã³ãããŒã¹ã®ãµã³ããªã³ã°ãæå¹ã«ããŠãããã¡ã€ã«ãå®è¡ããçµæã確èªããŸãã ããããä»ã®ãšããã¯ãæ¬èœãä¿¡é Œãããã£ãã·ã¥ãã¹ã®ä»®èª¬ã«åºã¥ããŠãããã¡ã€ã«ãå®è¡ããŸãããã
L3ãã£ãã·ã¥ã®ã¹ãããã«ã¯100ãµã€ã¯ã«ä»¥äžïŒå Žåã«ãã£ãŠã¯æ°çŸãµã€ã¯ã«ïŒããããL2ãã£ãã·ã¥ã®ãã¹ã«ã¯çŽ40ãµã€ã¯ã«ããããŸãããããã¯ãã¹ãŠããã»ããµã«äŸåããŸãã ããšãã°ãx86 åœä»€ã¯1ããçŽ100ãµã€ã¯ã«ããããŸããããããã®ã»ãšãã©ã¯20ãµã€ã¯ã«æªæºã§ãïŒé€ç®åœä»€ã®äžã«ã¯ãããªãé
ãããŒããŠã§ã¢ã§åäœãããã®ããããŸãïŒã ç§ã®Core i7ã§ã¯ãä¹ç®ãå ç®ãé€ç®ã®åœä»€ã«æ°ãµã€ã¯ã«ããããŸããã åœä»€ããã€ãã©ã€ã³ã«å
¥ããããè€æ°ã®åœä»€ãåæã«åŠçãããŸãã ããã¯ãL3ãã£ãã·ã¥ã®1ã€ã®ãã¹-ã¡ã¢ãªããçŽæ¥ããŒãããããš-ãå®äºãããŸã§ã«æ°çŸã®åœä»€ãå¿
èŠã«ãªãããšãæå³ããŸãã ç°¡åã«èšãã°ãã¡ã¢ãªããã®èªã¿åãã¯éåžžã«é
ãããã»ã¹ã§ãã

修食å::æŽæ°ïŒïŒ
ãã®ãããã¡ã¢ãªã¢ã¯ã»ã¹ã«ããã³ãŒãã®å®è¡ãé
ããªãããšãããããŸãã æ»ã£ãŠããã®åŒã³åºãã«ã€ãªããã³ãŒãã®å
容ã確èªããŸãããã ã³ã³ãããŒã«ãããã¡ã€ã©ãŒã¯ã Node::Update()
å®è¡ãé
ãããšã瀺ããŠãããã¹ã¿ãã¯ã«é¢ãããµã³ãã©ãŒãããã¡ã€ã«ã¬ããŒãããã Modifier::Update()
é¢æ°ãç¹ã«ãã£ããããŠããããšãæããã§ãã ããããæé©åãéå§ããŸãã
void Modifier::Update() { for(Object* obj : mObjects) { Matrix4 mat = obj->GetTransform(); mat = mTransform*mat; obj->SetTransform(mat); } }
Modifier::Update()
ã¯ããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã®ãã¯ãã«ãmTransform
ãå€æè¡åãmTransform
ãã mTransform
Modifierè¡åã§ä¹ç®ããŠããããã®å€æããªããžã§ã¯ãã«é©çšããŸãã äžèšã®ã³ãŒãã§ã¯ãå€æã¯ãªããžã§ã¯ãããã¹ã¿ãã¯ã«ã³ããŒãããä¹ç®ãããŠããã³ããŒãããŸãã
GetTransform()
åã«mTransform
ã³ããŒãè¿ããŸããã SetTransform()
ã¯æ°ãããããªãã¯ã¹ãmTransform
ã³ããŒãããã®ãªããžã§ã¯ãã®mDirty
ç¶æ
ãèšå®ããŸãã
void SetDirty(bool dirty) { if (dirty && (dirty != mDirty)) { if (mParent) mParent->SetDirty(dirty); } mDirty = dirty; } void SetTransform(Matrix4& transform) { mTransform = transform; SetDirty(true); } inline const Matrix4 GetTransform() const { return mTransform; }
ãã®ãªããžã§ã¯ãã®å
éšããŒã¿ã¬ã€ã€ãŒã¯æ¬¡ã®ããã«ãªããŸãã
protected: Matrix4 mTransform; Matrix4 mWorldTransform; BoundingSphere mBoundingSphere; BoundingSphere mWorldBoundingSphere; bool m_IsVisible = true; const char* mName; bool mDirty = true; Object* mParent; };
ããããããããããã«ãNodeãªããžã§ã¯ãã®ã¡ã¢ãªå
ã®ãšã³ããªã«è²ãä»ããŸããã

æåã®ãšã³ããªã¯ä»®æ³ããŒãã«ãã€ã³ã¿ãŒã§ãã ããã¯ãC ++ç¶æ¿å®è£
ã®äžéšã§ãããã®ç¹å®ã®ããªã¢ãŒãã£ãã¯ãªããžã§ã¯ãã®ä»®æ³é¢æ°ãšããŠæ©èœããé¢æ°ãã€ã³ã¿ãŒã®é
åãžã®ãã€ã³ã¿ãŒã ãªããžã§ã¯ããããŒãã修食åãããã³ããŒã¹ããç¶æ¿ãããã¯ã©ã¹ã«ã¯ãç°ãªãä»®æ³ããŒãã«ããããŸãã
ãã®4ãã€ããã€ã³ã¿ãŒã®åŸã«ãæµ®åå°æ°ç¹æ°ã®64ãã€ãé
åãç¶ããŸãã mTransform
ãããªãã¯ã¹ã®åŸãã«ã¯ã mTransform
ãããªãã¯ã¹ãmTransform
ã次ã«2ã€ã®å¢ççãmTransform
ãŸãã 次ã®ãšã³ããªm_IsVisible
ã¯ã·ã³ã°ã«ãã€ãã§ã4ãã€ãå¿
èŠã§ãã 次ã®ãšã³ããªã¯å°ãªããšã4ãã€ãã®å¢ç調æŽãå¿
èŠãªãã€ã³ã¿ãŒã§ãããããããã¯æ£åžžã§ãã m_IsVisible
åŸã«å¥ã®ããŒã«å€m_IsVisible
å
¥ãããšãå©çšå¯èœãª3ãã€ãã«ããã¯ãããŸãã 次ã«ã mName
ãã€ã³ã¿ãŒïŒ4ãã€ãã®ã¢ã©ã€ã¡ã³ãïŒãããŒã«å€ã®mDirty
ïŒåããç·©ããã«ããã¯ïŒã次ã«èŠªãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒãmDirty
ãŸãã ãããã¯ãã¹ãŠãªããžã§ã¯ãåºæã®ããŒã¿ã§ãã åŸç¶ã®ãã¯ãã«mObjects
ã¯ããã§ã«Nodeãã¯ãã«ãåç
§ããŠããããã®ãã©ãããã©ãŒã ã§ã¯12ãã€ããå æããŸãããä»ã®ãã©ãããã©ãŒã ã§ã¯ãµã€ãºãç°ãªãå ŽåããããŸãã
Modifier::Update()
ã®ã³ãŒããèŠããšããã£ãã·ã¥ãã¹ã®åå ãäœã§ããããããããŸãã
void Modifier::Update() { for(Object* obj : mObjects) {
ãŸãã泚æããŠãã ããïŒãã¯ãã«mObjects
ã¯ãã¡ã¢ãªã«åçã«å²ãåœãŠããããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã®é
åã§ãã ãã®ãã¯ãã«ã®ç¹°ãè¿ãã¯ããã£ãã·ã¥ïŒäžå³ã®èµ€ãç¢å°ïŒã§ããŸãæ©èœããŸããããã¯ããã€ã³ã¿ãŒã次ã
ãšç¶ãããã§ãã ããã€ãã®ãã¹ããããŸããããããã¯ãããããã£ãã·ã¥ã§åäœããããã«é©åãããŠããªãäœãã瀺ããŠããŸãã ãŸããåãªããžã§ã¯ãã¯æ°ãããã€ã³ã¿ãŒã§ã¡ã¢ãªã«é
眮ããããããå¹²æžã¯ã¡ã¢ãªå
ã®ã©ããã«ãããšããèšããŸããã

Objectãžã®ãã€ã³ã¿ãŒãååŸãããã GetTransform()
åŒã³åºããŸãã
Matrix4 mat = obj->GetTransform()
ãã®ã€ã³ã©ã€ã³é¢æ°ã¯ã mTransform
ãªããžã§ã¯ãã®ã³ããŒãè¿ãã ããªã®ã§ãåã®è¡ã¯ãããšåçã§ãã
Matrix4 mat = obj->mTransform;
å³ãããããããã«ã mObjects
é
åå
ã®ãã€ã³ã¿ãŒã«ãã£ãŠåç
§ããããªããžã§ã¯ãã¯ãã¡ã¢ãªãŒå
šäœã«æ£åšããŠããŸãã æ°ãããªããžã§ã¯ããè¿œå ããŠGetTransform()
ãåŒã³åºãmTransform
ã mTransform
ã«ããŒãããŠã¹ã¿ãã¯ã«mTransform
ãããšãå¿
ããã£ãã·ã¥ãã¹ãçºçããŸãã ç§ã䜿çšããæ©åšã§ã¯ããã£ãã·ã¥ã©ã€ã³ã¯64ãã€ãã䜿çšãããããéãè¯ããã°ããªããžã§ã¯ãã64ãã€ãã®å¢çã®4ãã€ãåã«éå§ããããšã mTransform
ã¯ããã«ãã£ãã·ã¥ã«ããŒããããŸãã ãã ãã mTransform
ãããŒããããš2ã€ã®ãã£ãã·ã¥ãã¹ãçºçããå¯èœæ§ãé«ãç¶æ³ã§ãã Modifier::Update()
ã®ãµã³ããªã³ã°ãããã¡ã€ã«ããããããªãã¯ã¹ã®é
眮ãä»»æã§ããããšã¯æããã§ãã

ãã®ã¹ããããã§ã¯ã edx
ã¯ãªããžã§ã¯ãã®å Žæã§ãã ãããŠãç¥ã£ãŠããããã«ã mTransform
ã¯ãªããžã§ã¯ãã®éå§ã®4ãã€ãåã«éå§ããŸãã ãããã£ãŠããã®ã³ãŒãã¯mTransform
ã¹ã¿ãã¯ã«ã³ããŒããŸãïŒMOVUPSã¯4ã€ã®éæŽåæµ®åå°æ°ç¹å€ãã¬ãžã¹ã¿ã«ã³ããŒããŸãïŒã 3ã€ã®MOVUPSåœä»€ãžã®åŒã³åºãã®7ïŒ
ãæ¯æããŸãã ããã¯ãMOVã®å Žåã«ããã£ãã·ã¥ãã¹ãçºçããããšã瀺ããŠããŸãã ã¹ã¿ãã¯äžã®æåã®MOVUPSãä»ã®MOVUPSã«ä»ã®æéã»ã©æéãããããªãçç±ã¯ããããŸããã ãã€ãã©ã€ã³ååœä»€ã®ç¹æ§ã«ããããã³ã¹ããã¯åŸç¶ã®MOVUPã«åçŽã«è»¢éãããããã«æããŸãã ãããããããã«ãããã¡ã¢ãªã«ã¢ã¯ã»ã¹ããããã®ã³ã¹ããé«ãããšã®èšŒæ ãåãåã£ãã®ã§ãããã䜿ã£ãŠäœæ¥ããŸãã
void Modifier::Update() { for(Object* obj : mObjects) { Matrix4 mat = obj->GetTransform(); mat = mTransform*mat; obj->SetTransform(mat); } }
è¡åãä¹ç®ãããåŸã Object::SetTransform()
ãåŒã³åºããŸããããã¯ãä¹ç®ã®çµæïŒã¹ã¿ãã¯ã«æ°ããé
眮ãããïŒãååŸããObjectã€ã³ã¹ã¿ã³ã¹ã«ã³ããŒããŸãã å€æã¯ãã§ã«ãã£ãã·ã¥ãããŠããããã³ããŒã¯é«éã§ããã mDirty
ãã©ã°ãèªã¿åãããSetDirty()
ã¯äœéã§ããããããããã£ãã·ã¥ã«ãããŸããã ãã®ããããã®1ãã€ãããã¹ãããå Žåã«ãã£ãŠã¯æ±ºå®ããããã«ãããã»ããµã¯åšå²ã®63ãã€ããèªã¿åãå¿
èŠããããŸãã
ãããã«
æåŸãŸã§èªãã ã-ããã§ããŸããïŒ ç¹ã«ã¢ã»ã³ãã©ã«æ
£ããŠããªãå Žåã¯ãæåã¯é£ãããããããŸããã ããããã³ã³ãã€ã©ãŒãæžããã³ãŒãã§ã³ã³ãã€ã©ãŒãäœãããããæéããããŠç¢ºèªããããšã匷ããå§ãããŸãã ããã«ã¯Compiler Explorerã䜿çšã§ããŸãã
ãµã³ãã«ã³ãŒãã®ããã©ãŒãã³ã¹ã®åé¡ã®äž»ãªåå ã¯ã¡ã¢ãªã¢ã¯ã»ã¹ãã€ã³ã¿ãŒã§ãããšãã蚌æ ãéããŸããã 次ã«ãã¡ã¢ãªã«ã¢ã¯ã»ã¹ããã³ã¹ããæå°éã«æããããã©ãŒãã³ã¹ãå床枬å®ããŠãæ¹åãéæããããã©ããã確èªããŸãã ããã次åã®äºå®ã§ãã