ããããŒã°
ãã®è©±ã¯3幎以äžåã«å§ãŸããŸããã ç§ãã¡ã®å°ããªäŒç€ŸDAVAã¯Wargamingã®äžéšã«ãªãã次ã«ã©ã®ãããžã§ã¯ããè¡ãã¹ãããèãå§ããŸããã 3幎åã®ã¢ãã€ã«ãã©ã®ãããªãã®ã ã£ãããæãåºãããã«ãã¯ã©ãã·ã¥ãªãã¯ã©ã³ãããºã«ïŒãã©ãŽã³ãä»æ¥ã®éåžžã«æåãªãããžã§ã¯ãã®å€ãã¯ãªãã£ããšèšããŸãã ãããã³ã¢ã¯ãŸã å§ãŸã£ãã°ããã§ãã åžå Žã¯ä»æ¥ãããäœåãå°ããã£ãã
æåã¯ãæ°ãããŠãŒã¶ãŒã倧ããªãã¿ã³ã¯ãã«åŒãä»ããããã€ãã®å°ããªã²ãŒã ãäœæããããšã¯éåžžã«è¯ãèãã§ãããšçã«æãããŸããã äžé£ã®å®éšã®åŸãããã¯æ©èœããªãã£ãããšãå€æããŸããã ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§ã®åªããå€æã«ãããããããã¢ãã€ã«ããPCãžã®ç§»è¡ã¯ãŠãŒã¶ãŒã«ãšã£ãŠæ·±byã§ããããšãå€æããŸããã
ãã®åŸãéçºäžã«ããã€ãã®ã²ãŒã ããããŸããã ãããã®1ã€ã¯ã¹ãã€ããŒãšåŒã°ããŸããã äž»ãªã²ãŒã ãã¬ã€ã®ã¢ã€ãã¢ã¯ãã¹ãã€ããŒã¢ãŒãã§ãé²åŸ¡åŽã«ç«ã£ãŠããã¿ã³ã¯ãããAIã«ãã£ãŠå¶åŸ¡ãããå¿çããŠæ»æã§ããä»ã®ã¿ã³ã¯ã§å°æããããšã§ããã
ããæç¹ã§ãã¹ã¿ã³ãã£ã³ã°ã¿ã³ã¯ã¯éåžžã«éå±ã§ããããã«æããã1é±éã§ãããã¿ã€ãã®ãã«ããã¬ã€ã€ãŒãäœæããŸããã
ããããã¹ãŠã®å§ãŸãã§ãïŒ
ãã¹ãã€ããŒãã®éçºãéå§ãããšããã¢ãã€ã«ãã©ãããã©ãŒã ã§å©çšã§ãããã¯ãããžãŒãæ€èšããŸããã åœæãUnityã¯ãŸã éçºã®ããªãåæã®æ®µéã«ãããŸãããå®éãå¿ èŠãªãã¯ãããžãŒã¯ãŸã ååšããŠããŸããã§ããã
æ¬ ããŠããäž»ãªãã®ã¯ããã€ãããã¯ãªãã£ããŒã«ãåããã©ã³ãã¹ã±ãŒãã®ã¬ã³ããªã³ã°ã§ãããããã¯ããªãŒãã³ã¹ããŒã¹ã§ã²ãŒã ãäœæããããã«äžå¯æ¬ ã§ãã Unityã«ã¯ãµãŒãããŒãã£ã®ã©ã€ãã©ãªãããã€ããããŸãããããããã®å質ã¯äœãã£ãã§ãã
ãŸããCïŒã§ã¯ãéçºäžã®ããã€ã¹ãæ倧éã«æŽ»çšããããšã¯ã§ãããåžžã«å¶éãããããšãç解ããŠããŸããã
Unreal Engine 3ã¯ãå€ãã®åæ§ã®çç±ãããé©åã§ã¯ãããŸããã§ããã
ãã®çµæããšã³ãžã³ãæ¹è¯ããããšã«ããŸããïŒ
ããã¯ã以åã®ã«ãžã¥ã¢ã«ãããžã§ã¯ãã§æ¢ã«äœ¿çšãããŠããŸããã ãã®ãšã³ãžã³ã¯ããã©ãããã©ãŒã ã§ãµããŒããããiOSãPCãMacã®äœã¬ãã«ã®äœæ¥ãããªãããæžãããŠãããAndroidã§ã®äœæ¥ãéå§ãããŸããã 2Dã²ãŒã ãäœæããããã®å€ãã®æ©èœãèšè¿°ãããŠããŸãã ã€ãŸãã2Dã§äœæ¥ããããã®åªããUIãšå€ãã®ãã®ããããŸããã ã²ãŒã ã®1ã€ã¯å®å šã«3次å ã§ãã£ãããã3DããŒãã®æåã®ã¹ãããã§ããã
ãšã³ãžã³ã®3Déšåã«ãã£ããã®ïŒ
- ã·ãŒã³ã®æãåçŽãªã°ã©ãã
- éçã¡ãã·ã¥ãæç»ããæ©èœã
- éªšæ Œã¢ãã¡ãŒã·ã§ã³ã§ã¢ãã¡ãŒã·ã§ã³ã¡ãã·ã¥ãæç»ããæ©èœã
- ãªããžã§ã¯ããšã¢ãã¡ãŒã·ã§ã³ãCollada圢åŒãããšã¯ã¹ããŒãããŸãã
äžè¬ã«ãçé¢ç®ãªçŸä»£ã®ãšã³ãžã³ã®æ©èœã«ã€ããŠè©±ããšãã»ãšãã©äœããããŸããã§ããã
ä»äºã®å§ãŸã
ããã¯ãã¹ãŠãã¢ãã€ã«ããã€ã¹ã§æ¯èŠ³ãæãèœåã®èšŒæããå§ãŸããŸãããããã¯iPhone 4ãšiPad 1ã§ããã
æ°æ¥éã®äœæ¥ã®åŸãå®å šã«æ©èœããåçãªã©ã³ãã¹ã±ãŒããåŸãããŸãããããã¯éåžžã«ããŸãæ©èœãã8MBã®ã¡ã¢ãªãå¿ èŠãšãããããã®ããã€ã¹ã§60fpsãæäŸããŸããã ãã®åŸãã²ãŒã ã®å®å šãªéçºãéå§ããŸããã
çŽ6ãæãçµéããå°ããªãããããžã§ã¯ããBlitzã«ãªããŸããã å®å šã«æ°ããèŠä»¶ããããŸããMMOãAAAå質ãããã³ãã®åœæã®å ã®åœ¢åŒã®ãšã³ãžã³ã§ã¯ãã¯ãæäŸã§ããªãã£ããã®ä»ã®èŠä»¶ã§ãã ããããä»äºã¯æ¬æ Œçã§ããã ã²ãŒã ã¯ããŸããããããŸããã£ãã ãã ããããã©ãŒãã³ã¹ã¯å¹³åçã§ãã«ãŒãã«ã¯ãªããžã§ã¯ããã»ãšãã©ãªããå®éã«ã¯ä»ã®å€ãã®å¶éããããŸããã
ãã®æ®µéã§ãç§ãã¡ã¯ãšã³ãžã³ã«çœ®ããåºç€ãå®éã®ãããžã§ã¯ãã®å ±éã«èããããªãããšãç解ãå§ããŸããã
åœæã®ä»çµã¿
ãã¹ãŠã®ã·ãŒã³ã¬ã³ããªã³ã°ã¯ãã·ã³ãã«ãªã·ãŒã³ã°ã©ãã®ã³ã³ã»ããã«åºã¥ããŠããŸããã
äž»ãªæŠå¿µã¯2ã€ã®ã¯ã©ã¹ã§ããã
- ã·ãŒã³-ã·ãŒã³ã®ã³ã³ãããå éšã§ãã¹ãŠã®ã¢ã¯ã·ã§ã³ãè¡ãããŸãã
- ã¹ããŒãžäžã
- SceneNode-ã·ãŒã³å ã®ãã¹ãŠã®ã¯ã©ã¹ãç¶æ¿ããã·ãŒã³ããŒãã®åºæ¬ã¯ã©ã¹ïŒ
- MeshInstanceNode-ã¡ãã·ã¥ãã¬ã³ããªã³ã°ããããã®ã¯ã©ã¹ã
- LodNode-lodãåãæ¿ããã¯ã©ã¹ã
- SwitchNode-ã¹ã€ãããªããžã§ã¯ããåãæ¿ããããã®ã¯ã©ã¹ã
- SceneNodeã®ç¶æ¿è ã®ã¯ã©ã¹ã¯ããã«15åãããŸãã
SceneNodeã¯ã©ã¹ã«ãããä»®æ³ã¡ãœããã®ã»ããããªãŒããŒã©ã€ãããŠãããçš®ã®ã«ã¹ã¿ã æ©èœãå®è£ ã§ããŸããã
åå®çŸ©ã§ããäž»ãªæ©èœã¯æ¬¡ã®ãšããã§ãã
- æŽæ°-æŽæ°ã·ãŒã³ãäœæããããã«åããŒãã«å¯ŸããŠåŒã³åºãããé¢æ°ã
- Drawã¯ããã®ããŒããæç»ããããã«åããŒãã«å¯ŸããŠåŒã³åºãããé¢æ°ã§ãã
ç§ãã¡ãééããäž»ãªåé¡ã
ãŸããããã©ãŒãã³ã¹ïŒ
- ã¬ãã«å ã®ããŒãã®æ°ã5000ã«éãããšã空ã®æŽæ°é¢æ°ããã¹ãŠééããã®ã«çŽ3ããªç§ãããããšãå€æããŸããã
- Drawãå¿ èŠãšããªã空ã®ããŒãã§ãåæ§ã®æéãè²»ããããŸããã
- äœæ¥ã¯åžžã«ç°çš®ããŒã¿ã§è¡ãããŠãããããèšå€§ãªæ°ã®ãã£ãã·ã¥ãã¹ã
- è€æ°ã®ã³ã¢ã§äœæ¥ã䞊ååã§ããªãã
第äºã«ãäºæž¬äžå¯èœæ§ïŒ
- åºæ¬ã¯ã©ã¹ã®ã³ãŒããå€æŽãããšãã·ã¹ãã å šäœã«åœ±é¿ããŸããã€ãŸããSceneNode :: Updateã®ãã¹ãŠã®å€æŽã¯ãäœã§ãã©ãã§ãå£ããå¯èœæ§ããããŸãã äŸåé¢ä¿ã¯ãŸããŸãè€éã«ãªãããšã³ãžã³å ã®åå€æŽã«ãããé¢é£ãããã¹ãŠã®æ©èœã®ãã¹ããå¿ èŠã«ãªãããšãã»ãŒä¿èšŒãããŸããã
- ã·ãŒã³ã®æ®ãã®éšåãå·ã€ããªãããã«ãå€æãªã©ã§ããŒã«ã«ã«å€æŽããããšã¯äžå¯èœã§ããã éåžžã«å€ãã®å ŽåãLodNodeïŒlodãåãæ¿ããããã®ããŒãïŒã®æå°ã®å€æŽãã²ãŒã å ã®äœããå£ããŸããã
ç¶æ³ãæ¹åããããã®æåã®ã¹ããã
ãŸããããã©ãŒãã³ã¹ã®åé¡ãåŠçããããã«å®è¡ããããšã«ããŸããã
å®éã«ã¯ãåããŒãã«è¿œå ã®ãã©ã°NEED_UPDATEãå°å ¥ããããšã§ãããè¡ããŸããã 圌ã¯ããã®ãããªããŒããUpdateãšåŒã¶ã¹ããã©ããã決å®ããŸããã ããã«ããçç£æ§ã¯å€§å¹ ã«åäžããŸããããå€ãã®åé¡ãçºçããŸããã å®éãUpdateé¢æ°ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸããã
void SceneNode::Update(float timeElapsed) { if (!(flags & NEED_UPDATE))return; // the rest of the update function // process children }
ããã«ããããã©ãŒãã³ã¹ã®äžéšãè¿ãããŸããããå€ãã®è«ççãªåé¡ãäºæ³å€ã®å Žæããå§ãŸããŸããã
LodNodeãšSwitchNode-ããããïŒè·é¢ã«ããïŒlodã®åãæ¿ããšãªããžã§ã¯ãïŒããšãã°ãç Žå£ããããã®ãšç Žå£ãããŠããªããã®ïŒã®åãæ¿ããæ åœããããŒã-ã¯å®æçã«å£ãå§ããŸããã
æã ãæ éãä¿®æ£ããããšãã人ã¯æ¬¡ã®ããšãããŸããïŒåºæ¬ã¯ã©ã¹ã§NEED_UPDATEãç¡å¹ã«ãïŒçµå±ãåçŽãªè§£æ±ºçã§ããïŒãå®å šã«æ°ã¥ãããã«ãFPSã¯åã³èœã¡ãŸããã
NEED_UPDATEãã©ã°ããã§ãã¯ããã³ãŒãã3åã³ã¡ã³ãã¢ãŠãããããšããæ ¹æ¬çãªå€æŽã決å®ããŸããã äžåºŠã«ãã¹ãŠãè¡ãããšã¯ã§ããªãããšãç解ããããã段éçã«è¡åããããšã«ããŸããã
æåã®ã¹ãããã¯ãã¢ãŒããã¯ãã£ãæ·èšããããšã§ãããããã«ãããå°æ¥çºçãããã¹ãŠã®åé¡ã解決ã§ããŸãã
ç®æš
- ç¬ç«ãããµãã·ã¹ãã éã®äŸåæ§ã®æå°åã
- å€æã®å€æŽã¯lodã®ã·ã¹ãã ãç Žå£ããã¹ãã§ã¯ãããŸããã
- ãã«ãã³ã¢ã«ã³ãŒããé 眮ããæ©èœã
- ç°çš®ã®ç¬ç«ããã³ãŒããå®è¡ãããæŽæ°æ©èœãªã©ã¯ãããŸããã§ããã å€ãæ©èœãå®å šã«åãã¹ãããããšãªããæ°ããæ©èœã䜿çšããŠã·ã¹ãã ãç°¡åã«æ¡åŒµã§ããŸãã äžéšã®ãµãã·ã¹ãã ãå€æŽããŠããä»ã®ãµãã·ã¹ãã ã«ã¯åœ±é¿ããŸããã ãµãã·ã¹ãã ã®æ倧ã®ç¬ç«æ§ã
- æ倧ã®ããã©ãŒãã³ã¹ãåŸãããã«ãã¡ã¢ãªå ã§ããŒã¿ãçŽç·çã«é 眮ããæ©èœã
æåã®æ®µéã§ã®äž»ãªç®æšã¯ãããããã¹ãŠã®ç®æšãéæã§ããããã«ã¢ãŒããã¯ãã£ãåèšèšããããšã§ããã
ã³ã³ããŒãã³ããšããŒã¿é§ååã¢ãããŒãã®çµã¿åãã
ãã®åé¡ã®è§£æ±ºçã¯ãããŒã¿é§ååã¢ãããŒããšçµã¿åãããã³ã³ããŒãã³ãã¢ãããŒãã§ããã ããã«æ¬æã§ã¯ã翻蚳ãæåããªãã£ããããããŒã¿é§ååã®ã¢ãããŒãã䜿çšããŸãã
äžè¬ã«ãå€ãã®äººã¯ã³ã³ããŒãã³ãã¢ãããŒãã«ã€ããŠç°ãªãç解ãæã£ãŠããŸãã ããŒã¿é§ååã§ãåãã§ãã
ç§ã®ç解ã§ã¯ã ã³ã³ããŒãã³ãã¢ãããŒãã¯ãããã€ãã®å¿ èŠãªæ©èœãç¬ç«ããã³ã³ããŒãã³ãã«åºã¥ããŠæ§ç¯ãããå Žåã§ãã æãåçŽãªäŸã¯é»åæ©åšã§ãã ãããããããåãããã«ã¯å ¥åãšåºåããããŸãã ããããé©åããå Žåã¯ãæ¥ç¶ã§ããŸãã ãšã¬ã¯ãããã¯ã¹æ¥çå šäœã¯ããã®ã¢ãããŒãã«åºã¥ããŠæ§ç¯ãããŠããŸãã æ°åã®ç°ãªãã³ã³ããŒãã³ãããããŸããããããäºãã«çµã¿åããããšããŸã£ããç°ãªããã®ãååŸã§ããŸãã
ãã®ã¢ãããŒãã®äž»ãªå©ç¹ã¯ãåã³ã³ããŒãã³ããåé¢ãããŠãããç¬ç«æ§ãé«ãããšã§ãã ã³ã³ããŒãã³ãã誀ã£ãããŒã¿ãéä¿¡ããå¯èœæ§ããããããŒããçŒæãããšããäºå®ãèæ ®ããŠããŸããã ãã®ã¢ãããŒãã®å©ç¹ã¯æããã§ãã ä»æ¥ãèšå€§ãªæ°ã®æ¢è£œã®ããããåããæ°ããããã€ã¹ãçµã¿ç«ãŠãããšãã§ããŸãã
ããŒã¿é§ååãšã¯äœã§ããã ç§ã®ç解ã§ã¯ãããã¯ãœãããŠã§ã¢èšèšãžã®ã¢ãããŒãã§ãããããžãã¯ã§ã¯ãªãããŒã¿ãããã°ã©ã ãããŒã®åºç€ãšããŠäœ¿çšãããŸãã
ãã®äŸã§ã¯ã次ã®ã¯ã©ã¹éå±€ãæ³åããŠãã ããã
class SceneNode { // Matrix4 localTransform; Matrix4 worldTransform; virtual void Update(); virtual void Draw(); Vector<SceneNode*> children; } class LodNode { // c LodDistance lods[4]; virtual void Update(); // Update, , - virtual void Draw(); // }; class MeshNode { RenderMesh * mesh; virtual void Draw(); // };
ãã®éå±€ã®ãã€ãã¹ã³ãŒãã¯ã次ã®ããã«éå±€çã«èŠããŸãã
Main Loop: rootNode->Update(); rootNode->Draw();
ãã®C ++ç¶æ¿ã®éå±€ã«ã¯ã3ã€ã®ç°ãªãç¬ç«ããããŒã¿ã¹ããªãŒã ããããŸãã
- å€æ
- ãã
- ã¡ãã·ã¥
ããŒãã¯ããŒããéå±€å ã§çµåããã ãã§ãããåããŒã¿ã¹ããªãŒã ãé çªã«åŠçããæ¹ãããããšãç解ããããšãéèŠã§ãã éå±€åŠçã®å®éçãªå¿ èŠæ§ã¯ãå€æã«ã®ã¿å¿ èŠã§ãã
ããŒã¿é§ååã¢ãããŒãã§ã©ã®ããã«èŠããã¹ããæ³åããŠã¿ãŸãããã ã¢ã€ãã¢ãæ確ã«ãªãããã«ãæ¬äŒŒã³ãŒãã§èšè¿°ããŸãã
// Transform Data Loop: for (each localTransform in localTransformArray) { worldTransform = parent->worldTransform * localTransform; } // Lod Data Loop: for (each lod in lodArray) { // calculate lod distance and find nearest lod nearestRenderObject = GetNearestRenderObject(lod); renderObjectIndex = GetLodObjectRenderObjectIndex(lod); renderObjectArray[renderObjectIndex] = renderObject; } // Mesh Render Data Loop: for (each renderObject in renderObjectArray) { RenderMesh(renderObject); }
å®éãããã°ã©ã ã®äœæ¥ãµã€ã¯ã«ãéå§ãããã¹ãŠãããŒã¿ã«åºã¥ããŠããããã«ããŸããã
ããŒã¿é§ååã¢ãããŒãã®ããŒã¿ã¯ãããã°ã©ã ã®éèŠãªèŠçŽ ã§ãã ããžãã¯ã¯åãªãããŒã¿åŠçã¡ã«ããºã ã§ãã
æ°ããã¢ãŒããã¯ãã£
ããæç¹ã§ããšã³ãã£ãã£ãããŒã¹ã«ããã¢ãããŒãã§ã·ãŒã³ãæŽçããå¿ èŠãããããšãæããã«ãªããŸããããšã³ãã£ãã£ã¯ãå€ãã®ç¬ç«ããã³ã³ããŒãã³ãã§æ§æããããšã³ãã£ãã£ã§ããã ã³ã³ããŒãã³ããå®å šã«ä»»æã§ãããçžäºã«ç°¡åã«çµåã§ããããã«ãããã£ãã®ã§ãã
ãã®ãããã¯ã«é¢ããæ å ±ãèªãã§ãããšã T-Machineããã°ã«åºäŒããŸããã
圌ã¯ç§ã®è³ªåã«å€ãã®çãããããŸããããäž»ãªçãã¯æ¬¡ã®ãšããã§ãã
â¢ãšã³ãã£ãã£ã«ã¯ããžãã¯ã¯å«ãŸãããåãªãIDïŒãŸãã¯ãã€ã³ã¿ãŒïŒã§ãã
â¢ãšã³ãã£ãã£ã¯ãããã«å±ããã³ã³ããŒãã³ãIDïŒãŸãã¯ãã€ã³ã¿ïŒã®ã¿ãç¥ã£ãŠããŸãã
â¢ã³ã³ããŒãã³ãã¯åãªãããŒã¿ãã€ãŸãã§ãã ã³ã³ããŒãã³ãã«ã¯ããžãã¯ãå«ãŸããŠããŸããã
â¢ã·ã¹ãã ã¯ãç¹å®ã®ããŒã¿ã»ãããåŠçããåºåã§å¥ã®ããŒã¿ã»ãããåºåã§ããã³ãŒãã§ãã
ããã«æ°ä»ãããšããããŸããŸãªæ å ±ãããã«ç 究ããéçšã§ã Artemis Frameworkã«åºäŒãããã®ã¢ãããŒãã®é©åãªå®è£ ãèŠãŸããã
åã®ãªã³ã¯ãæ©èœããªãå Žåã®ãœãŒã¹ïŒ Artemis Original Java Source Code
Javaã§éçºããŠããå Žåã¯ããã²ã芧ãã ããã éåžžã«ã·ã³ãã«ã§æŠå¿µçã«æ£ãããã¬ãŒã ã¯ãŒã¯ã ä»æ¥ã§ã¯ãå€ãã®èšèªã«å€æãããŠããŸãã
ä»æ¥ã®Artemisã¯ECSïŒEntity Component SystemïŒãšåŒã°ããŠããŸãã ãšã³ãã£ãã£ãã³ã³ããŒãã³ããããã³ããŒã¿é§ååã«åºã¥ããŠã·ãŒã³ãæŽçããããã®å€ãã®ãªãã·ã§ã³ããããŸããããã®çµæãECSã¢ãŒããã¯ãã£ã«å°éããŸããã ãã®çšèªãã©ãã»ã©äžè¬çããèšãã®ã¯å°é£ã§ãããECSã¯ã ãšã³ãã£ãã£ãã³ã³ããŒãã³ããã·ã¹ãã ãšãããšã³ãã£ãã£ãããããšãæå³ããŸãã
ä»ã®ã¢ãããŒããšã®æãéèŠãªéãã¯ãã³ã³ããŒãã³ãã®åäœããžãã¯ã®å¿ é ã®æ¬ åŠãããã³ã·ã¹ãã ã®ã³ãŒãåé¢ã§ãã
ãã®ç¹ã¯ããæ£çµ±æŽŸãã³ã³ããŒãã³ãã¢ãããŒãã§ã¯éåžžã«éèŠã§ãã æåã®ååã«éåãããšãå€ãã®èªæããããŸãã æåã®1ã€ã¯ãã³ã³ããŒãã³ãã®ç¶æ¿ãè¡ãããšã§ãã
ãã®æè»æ§ã«ãããããããéåžžã¯ãã¹ã¿ã§çµãããŸãã
æåã¯ããã®ã¢ãããŒãã䜿çšãããšãåæ§ã®åäœãããããããã«ç°ãªãåäœãããå€ãã®ã³ã³ããŒãã³ããäœæã§ããããã«æãããŸãã å ±éã³ã³ããŒãã³ãã€ã³ã¿ãŒãã§ã€ã¹ã äžè¬ã«ãåã³ç¶æ¿ã®trapã«é¥ãããšããããŸãã ã¯ããããã¯å€å žçãªç¶æ¿ãããå°ãè¯ãã§ããããããã®trapã«é¥ããªãããã«ããŠãã ããã
ECSã¯ããã¯ãªãŒã³ãªã¢ãããŒãã§ãããããå€ãã®åé¡ã解決ããŸãã
ãããã¢ã«ããã¹ã§ã©ã®ããã«æ©èœãããã®äŸãèŠãã«ã¯ã ãã¡ããã芧ãã ãã ã
ãããã©ã®ããã«æ©èœãããããèŠãããŸãã
ã¡ã€ã³ã³ã³ããã¯ã©ã¹ã¯Entityã§ãã ããã¯ãã³ã³ããŒãã³ãã®é åãå«ãã¯ã©ã¹ã§ãã
2çªç®ã®ã¯ã©ã¹ã¯ã³ã³ããŒãã³ãã§ãã ç§ãã¡ã®å Žåãããã¯åãªãããŒã¿ã§ãã
以äžã¯ãä»æ¥ãšã³ãžã³ã§äœ¿çšãããŠããã³ã³ããŒãã³ãã®ãªã¹ãã§ãã
enum eType { TRANSFORM_COMPONENT = 0, RENDER_COMPONENT, LOD_COMPONENT, DEBUG_RENDER_COMPONENT, SWITCH_COMPONENT, CAMERA_COMPONENT, LIGHT_COMPONENT, PARTICLE_EFFECT_COMPONENT, BULLET_COMPONENT, UPDATABLE_COMPONENT, ANIMATION_COMPONENT, COLLISION_COMPONENT, // multiple instances PHYSICS_COMPONENT, ACTION_COMPONENT, // actions, something simplier than scripts that can influence logic, can be multiple SCRIPT_COMPONENT, // multiple instances, not now, it will happen much later. USER_COMPONENT, SOUND_COMPONENT, CUSTOM_PROPERTIES_COMPONENT, STATIC_OCCLUSION_COMPONENT, STATIC_OCCLUSION_DATA_COMPONENT, QUALITY_SETTINGS_COMPONENT, // type as fastname for detecting type of model SPEEDTREE_COMPONENT, WIND_COMPONENT, WAVE_COMPONENT, SKELETON_COMPONENT, //debug components - note that everything below won't be serialized DEBUG_COMPONENTS, STATIC_OCCLUSION_DEBUG_DRAW_COMPONENT, COMPONENT_COUNT };
3çªç®ã®ã¯ã©ã¹ã¯SceneSystemã§ãã
/** \brief This function is called when any entity registered to scene. It sorts out is entity has all necessary components and we need to call AddEntity. \param[in] entity entity we've just added */ virtual void RegisterEntity(Entity * entity); /** \brief This function is called when any entity unregistered from scene. It sorts out is entity has all necessary components and we need to call RemoveEntity. \param[in] entity entity we've just removed */ virtual void UnregisterEntity(Entity * entity);
RegisterEntityãUnregisterEntityé¢æ°ã¯ãã·ãŒã³ã«ãšã³ãã£ãã£ãè¿œå ãŸãã¯åé€ãããšãã«ãã·ãŒã³å ã®ãã¹ãŠã®ã·ã¹ãã ã«å¯ŸããŠåŒã³åºãããŸãã
/** \brief This function is called when any component is registered to scene. It sorts out is entity has all necessary components and we need to call AddEntity. \param[in] entity entity we added component to. \param[in] component component we've just added to entity. */ virtual void RegisterComponent(Entity * entity, Component * component); /** \brief This function is called when any component is unregistered from scene. It sorts out is entity has all necessary components and we need to call RemoveEntity. \param[in] entity entity we removed component from. \param[in] component component we've just removed from entity. */ virtual void UnregisterComponent(Entity * entity, Component * component);
RegisterComponentãUnregisterComponenté¢æ°ã¯ãã·ãŒã³å ã®ãšã³ãã£ãã£ã«ã³ã³ããŒãã³ããè¿œå ãŸãã¯åé€ãããšãã«ãã·ãŒã³å ã®ãã¹ãŠã®ã·ã¹ãã ã«å¯ŸããŠåŒã³åºãããŸãã
ãŸãã䟿å®äžãããã«2ã€ã®æ©èœããããŸãã
/** \brief This function is called only when entity has all required components. \param[in] entity entity we want to add. */ virtual void AddEntity(Entity * entity); /** \brief This function is called only when entity had all required components, and don't have them anymore. \param[in] entity entity we want to remove. */ virtual void RemoveEntity(Entity * entity);
ãããã®é¢æ°ã¯ãã³ã³ããŒãã³ãã®é åºã»ãããSetRequiredComponentsé¢æ°ã䜿çšããŠæ¢ã«äœæãããŠãããšãã«åŒã³åºãããŸãã
ããšãã°ãACTION_COMPONENTããã³SOUND_COMPONENTãæã€ãšã³ãã£ãã£ã®ã¿ã®åä¿¡ã泚æã§ããŸãã ãããSetRequiredComponentsã«æž¡ããŸãã
ãããã©ã®ããã«æ©èœããããç解ããããã«ãã©ã®ã·ã¹ãã ã䜿çšããŠããããäŸã§èª¬æããŸãã
- TransformSystem-å€æã®éå±€ãæ åœããã·ã¹ãã ã
- SwitchSystem-ç Žå£ãããç¶æ ãšç Žå£ãããŠããªãç¶æ ãªã©ãããã€ãã®ç¶æ ã«ãªãå¯èœæ§ã®ãããªããžã§ã¯ãã®åãæ¿ããæ åœããã·ã¹ãã ã
- LodSystem-è·é¢ã«ãã£ãŠlodãåãæ¿ãã圹å²ãæ ãã·ã¹ãã ã
- ParticleEffectSystem-ããŒãã£ã¯ã«å¹æãæŽæ°ããã·ã¹ãã ã
- RenderUpdateSystem-ã·ãŒã³ã°ã©ãããã¬ã³ããŒãªããžã§ã¯ããæŽæ°ããã·ã¹ãã ã
- LightUpdateSystem-ã·ãŒã³ã°ã©ãããå æºãæŽæ°ããã·ã¹ãã ã
- ActionUpdateSystem-ã¢ã¯ã·ã§ã³ãæŽæ°ããã·ã¹ãã ã
- SoundUpdateSystem-ãµãŠã³ãããã®äœçœ®ãšæ¹åãæŽæ°ããã·ã¹ãã ã
- UpdateSystem-ã«ã¹ã¿ã ãŠãŒã¶ãŒæŽæ°ãåŒã³åºãã·ã¹ãã ã
- StaticOcclusionSystem-éçãªã¯ã«ãŒãžã§ã³ã¢ããªã±ãŒã·ã§ã³ã·ã¹ãã ã
- StaticOcclusionBuildSystem-éçãªãªã¯ã«ãŒãžã§ã³æ§ç¯ã·ã¹ãã ã
- SpeedTreeUpdateSystem-ã¹ããŒãããªãŒããªãŒã®ã·ã¹ãã ãæŽæ°ããŸãã
- WindSystem-颚èšç®ã·ã¹ãã ã
- WaveSystem-ãžã£ããªã³ã°ããæ¯åãèšç®ããããã®ã·ã¹ãã ã
- FolliageSystem-æ¯èŠ³äžã®æ€çãèšç®ããããã®ã·ã¹ãã ã
ç§ãã¡ãéæããæãéèŠãªçµæã¯ãç°è³ªãªãã®ãæ åœããã³ãŒãã®é«åºŠãªå解ã§ãã ããã§ãTransformSystem :: Processé¢æ°ã§ãå€æã«é¢é£ãããã¹ãŠã®ã³ãŒããæ確ã«ããŒã«ã©ã€ãºãããŸããã 圌ã¯ãšãŠãã·ã³ãã«ã§ãã ããã€ãã®ã³ã¢ã«ç°¡åã«å解ã§ããŸãã ãããŠæãéèŠãªããšã¯ãå€æã®ã·ã¹ãã ã«è«ççãªå€æŽãå ããããšã«ãããå¥ã®ã·ã¹ãã ã§äœããå£ãããšã¯å°é£ã§ãã
ã»ãšãã©ãã¹ãŠã®ã·ã¹ãã ã§ãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
for ( ) { // // // }
ã·ã¹ãã ã¯ããªããžã§ã¯ãã®åŠçæ¹æ³ã«ãã£ãŠåé¡ã§ããŸãã
- ã·ã¹ãã å
ã«ãããã¹ãŠã®ãªããžã§ã¯ãã®åŠçãå¿
èŠã§ãã
- ç©çåŠ
- è¡çª
- ããŒã¯ããããªããžã§ã¯ãã®ã¿ãåŠçããå¿
èŠããããŸãã
- å€æã·ã¹ãã
- ã¢ã¯ã·ã§ã³ã·ã¹ãã
- é³å£°åŠçã·ã¹ãã
- ç²ååŠçã·ã¹ãã
- ç¹å¥ã«æé©åãããããŒã¿æ§é ã䜿çšããŸãã
- éçéå¡ã·ã¹ãã
ãã®ã¢ãããŒãã䜿çšãããšããªããžã§ã¯ããããã€ãã®ã³ã¢ã«åŠçããã®ãéåžžã«ç°¡åã§ãããšããäºå®ã«å ããŠãéåžžã®ããªã¢ãŒãã£ãºã ãã©ãã€ã ã§ã¯ããé£ããããšãéåžžã«ç°¡åã«å®è¡ã§ããŸãã ããšãã°ããã¬ãŒã ããšã«ãã¹ãŠã®lodã¹ã€ããã³ã°ãç°¡åã«å®è¡ããããšã¯ã§ããŸããã 倧èŠæš¡ãªãªãŒãã³ã¯ãŒã«ãã«éåžžã«å€ãã®å®¿æ³ãªããžã§ã¯ããååšããå Žåãåãã¬ãŒã ããããšãã°ãªããžã§ã¯ãã®3åã®1ã«åŠçããããšãã§ããŸãã ãã ããããã¯ä»ã®ã·ã¹ãã ã«ã¯åœ±é¿ããŸããã
ãŸãšã
- ã³ã³ããŒãã³ãã¢ãããŒãã«ããç©äºãããç¬ç«ããããããåå¥ã«è§£ããæé©åããããšãã§ãããããFPSãå€§å¹ ã«å¢å ããŸããã
- ã¢ãŒããã¯ãã£ãããã·ã³ãã«ã«ãªããç解ãããããªããŸããã
- è¿é£ã®ã·ã¹ãã ãã»ãšãã©æãªãããšãªãããšã³ãžã³ã®æ¡åŒµã容æã«ãªããŸããã
- ãlodã§äœããããŠãã¹ã€ãããå£ãããã·ãªãŒãºããã®ãã°ã¯å°ãªãããã®éããããŸãã
- ããããã¹ãŠããã€ãã®ã³ã¢ã«äžŠååããæ©äŒããããŸããã
- çŸæç¹ã§ã¯ããã¹ãŠã®ã·ã¹ãã ãå©çšå¯èœãªãã¹ãŠã®ã³ã¢ã§å®è¡ãããããã«ããããã«ããã§ã«åãçµãã§ããŸãã
ãšã³ãžã³ã³ãŒãã¯ãªãŒãã³ãœãŒã¹ã§ãã World of Tanks Blitzã§äœ¿çšãããŠãã圢åŒã®ãšã³ãžã³ã¯ã githubã®ãããã¯ãŒã¯ã§å®å šã«å©çšå¯èœã§ã ã
ãããã£ãŠãå¿ èŠã«å¿ããŠãå®è£ ã詳现ã«ç¢ºèªã§ããŸãã
ãã¹ãŠãå®éã®ãããžã§ã¯ãã§äœæããããšããäºå®ãèæ ®ããŠãã ããããã¡ãããããã¯åŠè¡çãªå®è£ ã§ã¯ãããŸããã
ä»åŸã®èšç»ïŒ
- ãããã®ã³ã³ããŒãã³ãã®ããå¹ççãªç®¡çãã€ãŸãã¡ã¢ãªå ã§ãããã®ã³ã³ããŒãã³ããç·åœ¢ã«å解ãããã£ãã·ã¥ãã¹ãæå°éã«æãã
- ãã¹ãŠã®ã·ã¹ãã ã§ãã«ãã¿ã¹ã¯ã«ç§»è¡ããŸãã
æåŸã«ããã¹ãããã®ãã¹ãŠã®æçšãªãªã³ã¯ïŒ