å°ãåãvkã®å ¬åŒUE4ã°ã«ãŒãã§ãã³ãã¥ããã£ãã©ã®ãããã¯ã«èå³ãããããå°ããŸãã:)æã人æ°ã®ããã¯ãšãªã®1ã€ã¯ããšã³ãžã³äžã®ãããã¯ãŒã¯ã§ã®äœæ¥ã§ããã
åãã¯ããã®ãããã¯ãäœããã®åœ¢ã§æããã«ãããèšåãããããã€ããã¯ãããŸããã§ããããèªåãããŒã ã«ãšã£ãŠãããã¹ããã©ã¯ãã£ã¹ããèšèšããã®ã¯è¯ãããšã ãšæããŸããã
ã§ãããã Armored WarfareïŒAssaultã®ãããã¯ãŒã¯ãäœæããæ¹æ³ã«èå³ããããªããcatãžããããã
ãšã³ãžã³ã®ãã¹ãŠã®ããŒãžã§ã³ãééããã©ã€ãã¢ããŒãã§ããUnreal Tournamentããåé¢ãããUnreal Engineãæ³åããããšã¯ã§ããŸããã ãã®çµæãUE4ã®åŒ·ã¿ã®1ã€ã¯ãåºæ¬ã¬ãã«ã§ãšã³ãžã³ã«çµ±åããã匷åãªãããã¯ãŒã¯ããŒã«ãããã§ãã ç§ã®å人çãªè©äŸ¡ã§ã¯ãåãã¬ãã«ã®è³ªåã«ã€ããŠåæ§ã«ç¶¿å¯ãªãšã³ãžã³ã¯Quake 3ãšã³ãžã³ã ãã§ãã
é«å質ã®ãã¯ãããžãŒã®ååšã¯ãéçºã«ãããŠèããå¿ èŠæ§ãç§ãã¡ãã奪ããŸããã æ®å¿µãªããããããã¯ãŒã¯ã®çµç¹ã«å¯Ÿããç¡è²¬ä»»ãªæ åºŠãæ²æšãªçµæããããããå€ãã®ãããžã§ã¯ããèŠãŠããŸããã
ãã®èšäºã¯æ±ºããŠãåå¿è åãã¬ã€ãããŸãã¯ãä»çµã¿ã®è©³çްãªèª¬æãã§ã¯ãããŸããã ããããããã¯ããããã¯ãŒã¯ã广çã«æé©åã§ããåçã®ç¹å®ã®èªåŒµããããã¥ãŒã§ãã
ä»çµã¿
UE4ã§ãã«ããã¬ãŒã€ãŒã§ã®äœæ¥ãéå§ããã«ã¯ã䜿çšå¯èœãª3ã€ã®éä¿¡ãã¹ãçè§£ããå¿ èŠããããŸãã
- 倿°ã®è€è£œïŒãµãŒããŒããã¯ã©ã€ã¢ã³ããžãããã§ãªãå Žåã ã©ã®ãããªç¶æ³ã§ãã¯ã©ã€ã¢ã³ãã¯å€æ°ã倿ŽããŠããµãŒããŒäžã®å€ã倿Žããããšã¯ã§ããŸããã
- RPCïŒãµãŒããŒããã¯ã©ã€ã¢ã³ããžã
- RPCïŒã¯ã©ã€ã¢ã³ããããµãŒããŒãžã
3çªç®ã®æ¹æ³ã¯ãã¯ã©ã€ã¢ã³ããããµãŒããŒã«ããŒã¿ãå ±åããå¯äžã®æ¹æ³ã§ãã 倿°è€è£œïŒæåã®ãã¹ïŒã¯ããµãŒããŒãšã¯ã©ã€ã¢ã³ãéã§ã»ã¯ã¿ãŒã®ç¶æ ãåæããããã«äœ¿çšãããŸãã ãµãŒããŒããã¯ã©ã€ã¢ã³ããžã®RPCã®éä¿¡ïŒ2çªç®ã®æ¹æ³ïŒã¯ãç¹å®ã®ããŒã¿ãéä¿¡ããããã®ã€ãã³ãã¢ãã«ã§ãã
ã€ãŸãããã®ããã«æ©èœããŸãã è€è£œãããåã»ã¯ã¿ãŒã«ã¯NetUpdateFrequencyãã©ã¡ãŒã¿ãŒããããŸãããã®ãã©ã¡ãŒã¿ãŒã¯ãããããã¯ãŒã¯äžã§äœã亀æããããã«ã€ããŠãã»ã¯ã¿ãŒã1ç§éã«äœåã¹ããŒã¿ã¹ããã§ãã¯ããããèšå®ããŸãã ããã©ã«ãã§ã¯ããã®ãã©ã¡ãŒã¿ãŒã¯éåžžèãª100.fã§ããã€ãŸã ã ã»ã¯ã¿ãŒãã¬ããªã±ãŒããããå ŽåãããŒã¿ã®åæãšéä¿¡ã®è©Šè¡ã¯ãã¹ãŠãã£ãã¯ã«ãªããŸãã
çµæã¯æçœã§æ²ãããã®ã§ãããã±ããã§ãããã¯ãŒã¯ãæ¥ç¶ããããšã¯åºæ¬çãªã¿ã¹ã¯ã«ãªããŸãã ãµãŒããŒã®CPUã®è² è·ãå¢å ããŸãã äžèŠã·ã³ãã«ãªãããžã§ã¯ãã§ãåã粟ç¥ã§ããã¹ãŠãé ãããäœãæ©èœããªãããããã£ã©ã¯ã¿ãŒããã¬ããŒãããããããä»ã®ãã¬ã€ã€ãŒãéããŠããããªã©ã§ãã
ãããã£ãŠãæåã®ã«ãŒã«ã«å°éããŸãã è€è£œããããã¹ãŠã®ã»ã¯ã¿ãŒã«é©åãªNetUpdateFrequencyãèšå®ããŸãã
ãé©åããšã¯ããã€ãã®ããã«æªè§£æ±ºã®è³ªåã§ãã çéå ¥ãã®å°éã®ãããªå°æã«ãšã£ãŠããã£ã©ã¯ã¿ãŒã«é¢ä¿ãããã¹ãŠã®ãã®-圌ã®åããšæŠåš-ã¯ãæå€§åšæ³¢æ°ãšåæãããã¹ãã§ãã ããããããã¯ç¹å®ã®ã±ãŒã¹ã§ããããã®ãããªãããžã§ã¯ãã«åãçµãã§ããå Žåãååãªãåºæ¬çãªãç¥èãšã¢ãããŒãã¯ãããŸãããé«å質ã®è£œåãå ¥æãããå Žåã¯ãããã«æãäžããŠãã ããã
ç¹å®ã®ãå¹³åçãªãã±ãŒã¹-ã¢ãŒã±ãŒããMOBAãã¢ãã€ã«ç©å ·ãããã³ã¿ã³ã¯ãªã©ã®ãã¹ããŒã·ã¥ãŒã¿ãŒãã§ã¯ããããã¯ãŒã¯æŽæ°ã®é »åºŠãã¯ããã«äœãããããšãã§ããŸãã AWïŒAssaultã§ã¯ãæŠè»ã®ãªãã¬ãã·ã¥ã¬ãŒãã1ç§éã«10å䜿çšããŸãã ãŸããã¡ã€ã³ãã£ã©ã¯ã¿ãŒã®ãããã¯ãŒã¯æŽæ°ã®é »åºŠã«åºã¥ããŠåäœãããããžã§ã¯ãã1ç§éã«6ã8åç¥ã£ãŠããŸãã
ãã®ä»ã®ãªããžã§ã¯ã-ããŸããŸãªããã£ããã£ãã€ã³ãããããã©ã°ãããã«ãŒããªããžãããã²ãŒã ã®ç¶æ ã-æŽæ°é »åºŠã¯ããã«äœããªããŸãã è¯ãäŸïŒããã©ã«ãã§ã¯ãPlayerStateãšã³ãžã³ã¯ã©ã¹ã¯1ç§éã«1åã ãè€è£œãããŸãã ã»ã¯ã¿ã®ç¶æ ã®çªç¶ã®å€æŽãå¯èœãªéãè¿ éã«é ä¿¡ãããå¿ èŠãããå Žåã ForceNetUpdateïŒïŒãåŒã³åºãæ©äŒãåžžã«ãããŸãã
ã»ã¯ã¿ãŒã®ã³ã³ããŒãã³ãã¯ãããã¯ãŒã¯æŽæ°ã®é »åºŠãç¶æ¿ããããã1ã€ã®ã»ã¯ã¿ãŒãæŽæ°é »åºŠã®ç°ãªãéšåã«ãåå²ãããããšã¯ããã«æãæµ®ãã¶ããšã«æ³šæããŠãã ãããã¿ã¹ã¯ã¯ç°¡åã§ã¯ãããŸããã ããæ£ç¢ºã«èšãã°ãäžéšã®ã³ã³ããŒãã³ããå šäœãšããŠç掻ã§ããã»ã¯ã¿ãŒãšã¯ç°ãªãåšæ³¢æ°ãå¿ èŠãšããå Žåãæ éã«å¥ã®ãšã³ãã£ãã£ã«ã«ããããå¿ èŠããããŸãã ã³ã³ããŒãã³ããææè ãããé ãããããã¯ãŒã¯äžã«ååšã§ããå Žåãææè ã¯ãã¹ãŠã®ãã£ãã¯ãæŽæ°ããããã§ã¯ãããŸãã-ããã¯æ£åžžãªç¶æ ã§ãã
ã«ãŒã«2ïŒ ä¿¡é Œã§ããRPCã¯çå£ã«æ£åœåãããå¿ èŠããããŸã ã ç§ãã¡ã®éšçœ²ã§ã¯ãä¿¡é Œã§ãããã¹ãŠã®rpcæ©èœãã眲åãã«ãã£ãŠãããã®çºè¡ããããšãããžã§ãŒã¯ãæã£ãŠããŸãã ãã¹ãŠã®ãžã§ãŒã¯ã«ã¯ãžã§ãŒã¯ããããŸãã
ããã¯é«äŸ¡ã§ããããšãå¿ã«çããŠããå¿ èŠããããŸãã ãšãŠãã RPCèªäœã®ãªãŒããŒãããã¯ãèããããçµæã»ã©å€§ãããããŸããã ãããã°ãªã»ãªã³ã®ããã«ãšåæ§ã«æ éã«åãæ±ã£ãŠãã ããã ç¹ã«ãã«ããã£ã¹ãã®å Žåã ããã¬ããŒããã忢ããåŸã«èµ·ããå¯èœæ§ã®ããææªã®äºæ ã¯ãä¿¡é Œã§ãããããã¡ãªã©ã®ãªãŒããŒãããŒãåå ã§ãµãŒããŒããã¯ã©ã€ã¢ã³ããåæããããšã§ãã ãã®ãããªã€ãã³ãã«åºã¥ããŠæ§ç¯ããããããã¯ãŒã¯ã¢ãŒããã¯ãã£ã¯ãpingããã³ãã±ããæå€±ã«å¯ŸããŠéæã«ãªããŸãã
ç°¡åãªäŸïŒã¢ã¯ã·ã§ã³ã«é¢ããéç¥ããµãŒããŒããã¯ã©ã€ã¢ã³ãã«éä¿¡ãããå Žåã ã¢ã«ã³ãŒã«ã·ãã¥ã¬ãŒã¿ãŒããªã³ã©ã€ã³ã§äœæãããã£ã©ã¯ã¿ãŒå ã®åãã£ã©ã¯ã¿ãŒãèèãåçãããšããŸããèèã¯å¥åã®ã³ã³ããŒãã³ããšããŠååšããŸãã ãã¹ãŠã®ã¯ã©ã€ã¢ã³ãã¯ããæ²»çãã®åã¹ããããç»é¢äžã«çŸãã衚瀺ããããã«æ¬åœã«å¿ èŠã§ãïŒãã«ããã£ã¹ããä¿¡é Œã§ããïŒã éä¿¡ããåãã£ãã¯ã¯RPC LiverHealedïŒfloat HealedHeathïŒã§ãã 2ã€ã®ã¯ã©ã€ã¢ã³ãã®ãšãã£ã¿ãŒã§ã®ãã¹ãïŒçŸããã誰ãã幞ãã§ãã ãããŠä»ãçæŽ»ç¶æ³ïŒã¯ã©ã€ã¢ã³ããè¶³ãèžã¿å ¥ãããã±ããæå€±ã0.5ç§ä»¥äžèç©ãããã¹ãŠã®RPCãéä¿¡ããå¿ èŠããããæ£è ããµãŒããŒããåãã§ã¯ã©ãã·ã¥ããæ¹æ³ãçºèŠããŸãã
æããã«ãå°ãªããšããµãŒããŒã®ãã£ãã¯ããšã«RPCãéä¿¡ããå¿ èŠã¯ãããŸãããNetUpdateFrequencyãæ°åå°ãªãå Žåã¯ãåã«ãã¥ãŒãææã¡ããŸãã ãããã®å€ãèç©ããéä¿¡é »åºŠãæžããå¿ èŠããããŸãã ãããŠããããä¿¡é Œã§ããããŒã¿ã§ãããã©ãããããäžåºŠèããŠãã ãããããã§ããå Žåã¯ã倿°ãè€è£œããã«è¡ãããšãã§ããããã§ãªãå Žåã¯ãä¿¡é Œã§ããªãããŒã¿ã«ããŸãã å€ãã®å Žåãã¯ã©ã€ã¢ã³ããã²ãŒã ã®äžçã«é¢ããããŒã¿ã«åºã¥ããŠã€ãã³ããçºçãããã©ãããã¯ã©ã€ã¢ã³ãèªèº«ãèšç®ã§ãããã©ãããæ€èšãã䟡å€ããããŸãïŒãã£ã©ã¯ã¿ãŒã®èèã®åãæ±ãã¯ãã¯ã©ã€ã¢ã³ãã®ããã®å¥åº·ã®å€åã§ãïŒã
æŠå¿µçãªãã©ãã
ãŸãã¯ãèšåãã䟡å€ã®ããããã€ãã®ããšã
倿°-è€è£œãããUObjectãç¡å¹åãããå Žå-OnRepã¯åŒã³åºããããä»åŸã¯ã©ã€ã¢ã³ãã§åŒã³åºãããªããªããŸãã ãã°ã®ããã«èãããŸãããæ£çŽã«èšã£ãŠããªããã®ããã«æ©èœããã®ãèŠããŠããŸããã ããã«ã€ããŠç¥ã£ãŠãéçºäžã«èæ ®ããã ãã§ååã§ããUE 4.18ã®ç·åãã¹ãããã§ãã¯ããŸããããã¹ãŠãæ£åžžã«æ©èœãããããæ å ±ã¯é¢ä¿ãããŸããã- ãµãŒããŒäžã§ã¯ã©ã€ã¢ã³ãRPCãåŒã³åºããŠãããµãŒããŒäžã§æ©èœèªäœã¯å®è¡ãããŸãããã¯ã©ã€ã¢ã³ãäžã§å®è¡ããã³ãã³ããéä¿¡ããã ãã§ãã ãµãŒããŒã§å®è¡ããå¿ èŠãããå Žåã¯ãå®è£ ãæåã§åŒã³åºãå¿ èŠããããŸãã
- ãããã¯ãŒã¯äžã§ectorããã£ãã«æŽæ°ãããªãå ŽåïŒããšãã°ãPlayerStateïŒã泚æããŠ2åä¿¡é Œæ§ã®é«ãRPCã䜿çšããŠãã ããã åæãšåæã®éãèããªããŠãç°¡åã«ãããã¡ãåããããšãã§ããŸãã çæ³çã«ã¯ããã®ãããªç¹å¥ãªãããã¯ãŒã¯ã¯ã©ã¹ã¯ããããã¯ãŒã¯äžã§1次ã®é »åºŠã§ãã§ãã¯ããã³æŽæ°ãããå¿ èŠããããŸãã
ãããã¯ãŒã¯ã®ããªãã¯ãšããªãã¯
ãããã¯ããããã¯ãŒã¯ã®è² è·ãæé©åããããšãšãCPUã®è² è·ãæé©åããããšã®äž¡æ¹ãç®çãšããŠããŸãã
ã°ããŒãã«ãªç¶æ
ãšããã§ã3çªç®ã®ã«ãŒã«ïŒ ã»ã¯ã¿ãŒãè€è£œããã«ã§ããå Žåã¯ããããè¡ããŸã ã
AWããã®2ã€ã®äŸïŒã¢ãµã«ãããã®ã«ãŒã«ãå®è£ ããŸãããæ¹æ³ã¯ç°ãªããŸãã
- ç Žå£å¯èœãªæšã ãããã¯ã²ãŒã ãã¬ã€ã«ãšã£ãŠéèŠã§ã¯ãªããããåçŽã«è€è£œãããŸããã åã¯ã©ã€ã¢ã³ãã¯ãå©çšå¯èœãªããŒã¿ã«åºã¥ããŠãç¬èªã®ããªãŒãåé€ããŸãã ãã®ç¹ã§äžçã®å®éã®ç¶æ³ããµãŒããŒãã¯ã©ã€ã¢ã³ãéãã¯ã©ã€ã¢ã³ãéã§ç°ãªãããšã¯ãŸã£ããæããªãã§ãã
- ç°å¢ã®ç Žå£å¯èœãªãªããžã§ã¯ãã ãã§ã³ã¹ãè»ãéå£ã ãããã¯ã²ãŒã ãã¬ã€ã«çŽæ¥åœ±é¿ãããªããžã§ã¯ããç Žå£ããããŸã§ãããã®èåŸã«ãé ããããšãã§ããŸãã ãããã£ãŠããã¹ãŠã®ã¯ã©ã€ã¢ã³ãäžã®ãããã®ãªããžã§ã¯ããå®éã®ç¶æ³ãåæ ããŠããå¿ èŠããããŸãã åæã«ã¯ããããšåãã°ããŒãã«ç¶æ ã䜿çšãããŸãã
2çªç®ã®äŸã§ã¯ãæŠå¿µå šäœã次ã®ããã«èª¬æã§ããŸãã
/** Array of bit masks for minimization of space used for destructible actors states. Replication handled by OnRep_DestructableMasks method */ UPROPERTY(ReplicatedUsing=OnRep_DestructableMasks) TArray<int32> DestructedActorsMasks; /** Handles replication of destructible actors masks */ UFUNCTION() void OnRep_DestructableMasks();
åint32ã¯ãæå€§32åã®ãªããžã§ã¯ãã®ç¶æ ããšã³ã³ãŒãããŸã ã ã¹ããŒãžã§ã¯ããã®ãããªãªããžã§ã¯ãã1000åä»¥äžæã€ããšãã§ããŸãã æå€§1024åã®ãªããžã§ã¯ãããšã³ã³ãŒãããå Žåã2ã€ã®int32ïŒããããã¹ã¯ã®ä¹ç®ïŒã§åŠçã§ããŸãããä»ã®ãšãããé åã®è€è£œã¯æ®ããŠãããŸãã çŸåšã®ãœãªã¥ãŒã·ã§ã³ã§ãããããã¯ãŒã¯ãããŒãããã«æ©èœããŸãã ãããã®ããŒã段éã§ã¯ããããã¯ãŒã¯ãä»ããæ¡ä»¶ä»ã40 intã®éä¿¡ã¯å€§ããªããŒã¿ã§ã¯ãªããæŠéäžã«åæã«å€ãã®ãªããžã§ã¯ããæ»ã¬ããšã¯ãããŸããã ãšã³ãžã³ã¯ããã£ãŒã«ãã®äžéšã倿Žãããšãã«é åã®æé©ãªè€è£œãåŠçããŸãã
ãã®ã¢ãããŒãã¯ãéçãªããžã§ã¯ãããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ã§æç¢ºãªããŒãé åºãæã€ããšã«åºã¥ããŠæ©èœããŸãã ãããã¯é åã«ãã£ãã·ã¥ã§ãã倿Žããããªããžã§ã¯ãã®ã€ã³ããã¯ã¹ã®ã¿ãè€è£œã§ããŸãã ãŸãããã€ããªããžãã¯ã®ã¿ãå®è£ ïŒçå/ç Žæ£ïŒãããŠããå Žåã§ãã远å ã®ãã£ãŒã«ãïŒããšãã°ããå¥åº·ããšã浞éãïŒã衚瀺ãããå Žåã§ãããã®ã¢ãããŒãã¯æ£åœåãããŸãã ãããã¯ããããäžã«å€æ°äœãã§ããåçš®ã®ã»ã¯ã¿ãŒã§ãã
å£ããå®å šã«ç Žå£å¯èœãªäžçãäœãããã§ããïŒ ãã®ãããªç¶æ ãéããŠåœŒããšååããŠãã ããã ããããã¹ã¯ã®åœ¢ã®ããã€ãã®intã¯æ°åã®ç Žå£å¯èœãªãªããžã§ã¯ããã³ãŒãåããã®ãå¯èœã«ããã§ããã ã ãã®ãããªåã»ã¯ã¿ãŒãåå¥ã«è€è£œãããæšæºããã¹ã¯ããµãŒããŒã®ãããã¯ãŒã¯ãšCPUã®äž¡æ¹ãç°¡åã«æ®ºããŸãïŒèª°ãè€è£œããå¿ èŠããããã誰ã«ã誰ã«è€è£œããªããã確èªããŸãïŒã
ããŒã¿ã®ããã±ãŒãžå
äžè¬ã«ãäžèšã®ãã€ã³ãã¯ãã§ã«éæ¥çã«ãã®ãããã¯ã«è§ŠããŠããŸãããããã§ã¯ãã·ãŒã³äžã®äœåãã®ãªããžã§ã¯ãã®ç¶æ ã«é¢ããæ å ±ãããããã¹ã¯ã®é åã«ããã¯ããŸãã ãã ããè€è£œãããã»ã¯ã¿ãŒå ã®ãã©ã°ã«ãåãææ³ãé©çšããå¿ èŠããããŸãã
ããæ®µéã§ãã¿ã³ã¯ã«ã¯éåžžã®è€è£œããã10å以äžã®ããŒã«ãã©ã°ããããšããçµè«ã«éããŸããã ãããã¯ããæŠè»ã¯æ²ããããæŸç«ãããããã¿ãŒã²ãããããã¯ãããŠãããããæ»äº¡ããããªã©ã®éåžžã®ã²ãŒã ãã¬ã€ç¶æ ã§ãã
ãã®çµæãã³ã¢ããã°ã©ããŒã¯ã ãã®ãããªç¶æ ãè€è£œããããã®ãããã·ã¯ã©ã¹ãäœæããŸãã ã äœ¿çšæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
RepOwnerFlags .Add(&bEnableLockTarget) .Add(&bCanMove) .Add(&bIsDrowning) .Add(&bInWater) .Build(); RepPublicFlags .Add(&bIsDying, this, "OnRep_IsDying") .Add(&bIsMoving, this, "OnRep_IsMoving") .Add(&bIsTurning, this, "OnRep_IsTurning") .Add(&bIsInFire) .Add(&bIsEngineBurning, this, "OnRep_IsEngineBurning") .Add(&bHasMinimapObservers) .Build();
RepOwnerFlagsããã³RepPublicFlagsã¯ãuint64ã®ã©ãããŒã®ããã«æ©èœããè€è£œãããã¯ã©ã¹å€æ°ã§ã ã 倿°èªäœã¯éåžžã®ãã®ã«ãªãããšã³ãžã³ããŒã«ã®èгç¹ããã¯è€è£œã§ããŸããã
/** Notifies of death */ UFUNCTION() void OnRep_IsDying(); /** Identifies if pawn is in its dying state */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Death) bool bIsDying;
boolãuint8ïŒ1ã«ããã¯ããããšããå§ãã§ãã è€è£œãããæ§é å ã«è€æ°ããå Žåã¯1ã§ãã
ã¯ããåæ§ã®èŠåãRPC颿°ã«é©çšãããŸãã ããã€ãã®ããŒã«ãéä¿¡ããŸã-ããããããã¯ããŸãã int32ã®ä»£ããã«vectorãšint8ïŒå¯èœã§ããã°ïŒã«floatã䜿çšãããšãåãç¶æ³ã«ãªããŸãã
ãã¡ããã£ãšã¯ã¿ãŒãº
ã»ã¯ã¿ãŒã®è€è£œã®éå§ã«ããªãã®æéããããç¶æ³ãæ³åããã®ã¯ç°¡åã§ãã ããšãã°ãç§ãã¡ã®å Žåã®æŠè»ã®è£ ç²ã«é¢ããããŒã¿ïŒæŠè»ã®å éšã¯ãã¬ãã«ã«å¿ããŠãã©ã¡ãŒã¿ãŒãç°ãªã倿°ã®ããŒã¹ã§æ§æãããŠããŸãïŒã
ããŒã¿ã®å€§ããªãã£ã³ã¯ã1ã€ã®ã»ã¯ã¿ãŒããè€è£œã®ããã«å°çãããšããããã¯ãŒã¯ã¯éè² è·ã§ãããšèŠãªãããä»ã®ã»ã¯ã¿ãŒããã®éè€è£œãããŸãã ã
ãã®å Žåããããã¯ãŒã¯ã®é£œåãåé¿ããè¯ãæ¹æ³ã¯ããã®ããŒã¿ãé åã®äžéšã«é 眮ãã飜åã®å¯èœæ§ããã§ãã¯ããŠã æççã«è€è£œããããšã§ãã
bool AMyActor::ReplicateSubobjects(class UActorChannel **Channel, class FOutBunch **Bunch, FReplicationFlags **RepFlags) { bool WroteSomething = Super::ReplicateSubobjects(Channel, Bunch, RepFlags); auto NetDriver = Channel->Connection->GetDriver(); for (int32 i = 0; i < MyDataArray.Num(); i++) { // Check for saturation if (((Channel->Connection->QueuedBits) + Channel->Connection->SendBuffer.GetNumBits() + Bunch->GetNumBits()) >= 0) { return WroteSomething; } auto DataObject = MyDataArray[i]; if (DataObject != nullptr) { WroteSomething |= Channel->ReplicateSubobject(DataObject, **Bunch, **RepFlags); } } return WroteSomething; }
MyDataArrayã¯åãããŒã¿ã§ãã ãã®ã¢ãããŒãã¯ããããã¯ãŒã¯äžã§ã»ã¯ã¿ãŒãäœæãããšãã«ããããã¯ãŒã¯å šäœã®ãããªãŒãºããåé¿ããŸãã
ãã®å Žåããã¹ãŠã®ããããã£ãè€è£œãããåã«ãectorãäœæã衚瀺ãããã³ã¢ãã¡ãŒã·ã§ã³åãããããšãæ€èšãã䟡å€ããããŸãã ãããã®ããããã£ããã®å€èгãšåäœã決å®ããå Žåãå®å šãªãããã¯ãŒã¯åæåãçµäºãããŸã§é衚瀺ã«ããããšããå§ãããŸãã
çµæã§ã¯ãªãç¶æ
ãããã¯ãŒã¯æé©åã®èгç¹ããã¯ãèšç®ã®æçµçµæã§ã¯ãªããèšç®ãçæããæ¡ä»¶ã顧客ã«è€è£œããã®ãæ£ããã§ãããã ããšãã°ããã£ã©ã¯ã¿ãŒããèŠãããã€ã³ãã«é¢ããæ å ±ã¯ãã¯ã©ã€ã¢ã³ãã§èšç®ããã³å¹³æ»åã§ããå転ãšç §æºã«é¢ãããã¹ãŠã®èšç®ãåŒãèµ·ããå¯èœæ§ããããŸãã
ã³ã€ã³ã®å察åŽã«ã¯ãé¡§å®¢ã®æé©åããããŸãã ã¯ã©ã€ã¢ã³ããèæ ®ããªããã°ãªããªãã»ã©ãåãæºåž¯é»è©±ã§ãã¬ã€ããããšã¯ããå¿«é©ã«ãªããŸãã
éååãã¯ãã«
ãã¯ã¿ãŒãå®å šãªç²ŸåºŠã§è€è£œããå¿ èŠã¯ã»ãšãã©ãããŸããã ãããã£ãŠã ãã¯ã¿ãŒãè€è£œããã«ã¯ããã®ããžãã¹ã«æé©åãããç¹å¥ãªã¯ã©ã¹ FVector_NetQuantizeãFVector_NetQuantize10ãFVector_NetQuantize100ãFVector_NetQuantizeNormal ã䜿çšããå¿ èŠããããŸã ã
å人çãªæ £ç¿ããïŒFVector_NetQuantize100ãè¶ ãã粟床ã¯å¿ èŠãããŸããã絶察çãªå€§å€æ°ã§ã¯ãFVector_NetQuantizeãšFVector_NetQuantizeNormalããããã¯ãŒã¯ã«äœ¿çšãããŸãã
ãããã¯ãŒã¯é¢é£æ§ã䜿çšããïŒããªãïŒ
ã²ãŒã ãã£ã©ã¯ã¿ãŒã®ãããã¯ãŒã¯é¢é£æ§ãå¿ èŠãªçç±ãããããªãå Žåã¯ãç¡å¹ã«ããããšããå§ãããŸãã ãšã³ãžã³ã®ããã©ã«ãèšå®ã¯ãå°éã®ãããªã·ã¥ãŒãã£ã³ã°ã²ãŒã ïŒUTã®è³ããã§ã«è¿°ã¹ãïŒåãã«èšèšãããŠããŸãã ãããã¯ãïŒèŠèŠçã«ïŒéãããäžçãæã€ã²ãŒã ã«ã¯é©ããããèèªãã»ã¯ã¿ãŒã®å ŽåãããŸãå¿«é©ã§ã¯ãããŸããã
ectorãšãã¬ãŒã€ãŒéã®NetCullDistanceSquaredïŒè·é¢ã®2ä¹ïŒã«åºã¥ããµãŒããŒã¯ããã®ectorãç¹å®ã®ã¯ã©ã€ã¢ã³ãã«ååšããå¿ èŠããããã©ãããæ±ºå®ããŸãã ãããã®éã®è·é¢ã倧ããå Žåãã»ã¯ã¿ãŒã¯ã¯ã©ã€ã¢ã³ãããåé€ãããå°ããå Žåãã¯ã©ã€ã¢ã³ãäžã§åäœæãããŸãã ãã®æäœã¯ã5ç§ã®ã¿ã€ã ã¢ãŠãã§å®è¡ãããŸãïŒããã©ã«ãå€ã¯RelevantTimeoutã§ãïŒã
ããã§ããŒãåäœæãããŸãã fat ectorã®å Žåããã®ããã»ã¹ã¯ããªããžã§ã¯ãã®ã¹ããŒã³æã«ãããã¯ãŒã¯ãè©°ãŸãããããããªãŒãºãåŒãèµ·ããå¯èœæ§ããããŸãïŒãã®ãªãœãŒã¹ãã¡ã¢ãªããã¢ã³ããŒããããå ŽåïŒã ãªãŒãã³ã¯ãŒã«ãã®å Žåãããã¯ãã©ãããã§ããªããå Žæã®çãäžã«çŸããããšã§ããããŸãã ããªãã®ã»ã¯ã¿ãŒãåžžã«ãå¢çç·äžãã§å®è¡ãããŠããå ŽåïŒããã©ã«ãã§ã¯ããã£ã©ã¯ã¿ãŒãã150ã¡ãŒãã«å®è¡ãããŸãïŒããã®ããã»ã¹ã¯äžå¿«ãªå ŽåããããŸãã
åæã«ãé©åã«èª¿æŽãããé¢é£æ§ã¯ãã²ãŒã ãã¬ã€ã§ãããè¡ãããšãã§ããå Žåããã©ãã£ãã¯ãšç¥çµãå€§å¹ ã«ç¯çŽã§ããŸã ã AWAã®å Žåããããã¯ãŒã¯ã®é¢é£æ§ã¯äžå䜿çšãããŸããããæŠè»ã¯æ€åºãããå Žåã«ã®ã¿ã¯ã©ã€ã¢ã³ãã«è¡šç€ºãããããšããéåžžã®ã¹ããŒã ãšã¯å¯Ÿç §çã«ããããå šäœã§æµã®æŠè»ãèŠãããšãã§ããŸãã
ãã¡ãããçµã¿èŸŒã¿ã®ã¡ã«ããºã ã«åºã¥ããŠé¢é£æ§ãå¶åŸ¡ã§ããã ãã§ãªãã AActor :: IsNetRelevantFor ïŒ...ïŒãåå®çŸ©ããããšã§ãé¢é£æ§ãå¶åŸ¡ã§ããŸãã ãããã¯ãŒã¯æé©åã®èæ ®äºé ã«ãããäžæ£è¡çºããä¿è·ããããã«ããããå¿ èŠã«ãªãå ŽåããããŸãã ããšãã°ãMOBAïŒæŠäºã®é§ã®äžã«é ããããã£ã©ã¯ã¿ãŒã¯ãæãå¹³å¡ãªãããããã¯ãé¿ããããã«ã¯ã©ã€ã¢ã³ãã«è€è£œãããã¹ãã§ã¯ãããŸããã ããŒã¿ãªã-ãã£ã³ãã£ãŒãªãã
ãããã¯ãŒã¯ã®ãããã°
ãã¬ã€ãã¹ã
ãã¬ã€ã ããããã¹ãããŸãã ã芧ãã ããã ç·šéè ãæž©å®€ã®æ¡ä»¶ã§ã¯ãªããå®éã®æ¡ä»¶ã§-çµã¿ç«ãŠãããã¯ã©ã€ã¢ã³ããšãµãŒããŒãæŠéæ¡ä»¶ã§å±éãããŠããŸãã éçºãã·ã³äžã®ããŒã«ã«ãµãŒããŒã¯ ãç¹ã«4000 flopsã®ããã©ãŒãã³ã¹ã®ä»®æ³ãã·ã³ã䜿çšããå Žåã¯ç¹ã«æªãèãã§ãã
ãããŠãã¯ãããšãã£ã¿ãŒã§ã®ãããã¯ãŒã¯ã®ãã¹ããã©ãã»ã©äŸ¿å©ã§ãã£ãŠããç¹ã«ã³ã³ãœãŒã«ãã¢ãã€ã«ããã€ã¹ã«é¢ããŠã¯ãå®éã®ã¢ã»ã³ããªã¯ãŸã å¥ã®äžçã§ãã äžå®å šãªç¶æ ã§ã®é¡§å®¢ã®è¡åã¯ç°ãªããŸãã
ãããã¯ãŒã¯ãããã¡ã€ã©ãŒ
ãšã³ãžã³ãå®åããçŽ æŽããããŠãŒãã£ãªãã£ïŒ NetworkProfiler
ã€ãæè¿ãããã¯ç¹å®ã®ã¿ã³ã¯ã®æ¥ç¶è§£é€ã®åå ãæ€çŽ¢ããæ¹æ³ã§ãã
ãããã¡ã€ã©ãŒã«ã¯å¥åŠãªæ©èœããããã¢ãã€ã«ããã€ã¹ã§ã®äœ¿çšã¯å¶éãããŠããŸããããããã¯ãŒã¯ããŒã¿ã®å šäœåãçè§£ããããšãã§ããŸã ã
ããã¯ãçããããèèªãããŒã¿ãšãããã¯ãŒã¯ã¹ãã€ã¯ãèå¥ããã®ã«æã圹ç«ã¡ãŸãã 䜿çšããå¿ èŠããããŸãã
貧匱ãªãããã¯ãŒã¯ã·ãã¥ã¬ãŒã·ã§ã³
ãã¬ã€ãã¹ãã§ã¯ãæãããªãããã¯ãŒã¯ã®åé¡ã®ã¿ãç¹å®ã§ããŸãã æ®å¿µãªããšã«ãææãŠãŒã¶ãŒãé ãã®æã«åº§ã£ãŠãWi-Fiã«ãŒã¿ãŒãšå®¶ã«3ã¡ãŒãã«ã®ã¢ã³ããããããããããã€ã³ã¿ãŒãããããã®ã«ãŒã¿ãŒã«è¡ãã3ããé¢ããæºåž¯é»è©±ã®å¡ããæ¬åœã®åé¡ãå§ãŸããŸãã pingãååã«é©åã§ãããšããäºå®ã«ããããããã ãã®æ§æã§ã¯ãã±ããã«äœãèµ·ããå¯èœæ§ããããŸã ã
UE4ã¯ããç®±ããåºããŠããã«ããpingã®åŸ ã¡æéããã±ããæå€±ã誀ã£ãé åºãªã©ãããŸããŸãªãããã¯ãŒã¯ç¶æ ãã·ãã¥ã¬ãŒãã§ããŸãã 詳现ã«ã€ããŠã¯ããã¡ããã芧ãã ããïŒ ãããã¯ãŒã¯ããŒã¹ã®ãšã¯ã¹ããã€ããèŠã€ãã
åäºè©©èšäºã®äŸã§ã¯ãiniã§ãã©ã¡ãŒã¿ãŒãæå®ããŠãããã¯ãŒã¯ãæ§æããŠããŸããããã¹ãã§ã¯ããã¯ããŸã䟿å©ã§ã¯ãããŸããã ããã«ãå®å šãªãã¹ããè¡ãã«ã¯ããšãã£ã¿ãŒãåèµ·åããã«ãå®è¡æã«è€æ°ã®ããªã»ãããçšæããŠããããåãæ¿ããã»ãã䟿å©ã§ãã
ããã¯æ¬¡ã®ããã«è¡ãããŸããUE4/ Engine / Binaries /ãã©ã«ããŒã§ããã®ã³ã³ãã³ãã䜿çšããŠãnetwork_bad.txtãªã©ã®ãã¡ã€ã«ãäœæããŸã
Net PktLoss=1 Net PktOrder=0 Net PktDup=0 Net PktLag=120 Net PktLagVariance=0 p.netshowcorrections 1
ããã§ããšãã£ã¿ã®ã³ã³ãœãŒã«ã§exec network_bad.txtãçŽæ¥åŒã³åºããŠã説æãããŠããèšå®ãé©çšã§ããŸãã æ¢ã«çè§£ããããã«ãããã¯åãªããã¡ã€ã«ã«ãããã¯ããããã³ã³ãœãŒã«ã³ãã³ãã®ã»ããã§ãã
亀éç£èŠ
å°çšã«äžããŸãã ãã¬ã€ãã¹ããæºåããŸãã åäžã®ããŒãã§ãã©ãã£ãã¯ãç£èŠããŸãã å ¥å Žãšéå Žã®å¹³åãã©ãã£ãã¯éãèŠç©ãããŸãã
ãã®ç¹ã¯éåžžã«æçœã§ãããäœããã®çç±ã§å€ãã®äººããããç¡èŠããŠããŸãã
ããšãã
anrialã§ãã«ããã¬ãŒã€ãŒã§äœæ¥ãããšãã«ãäžè¬çãªã¬ãã«ã§åºæ¬çã«éèŠã ãšæããã¹ãŠã®ããšã«ã€ããŠç°¡åã«è©±ãããšããŸããã é å»¶è£æ£ããããã¯ãŒã¯è£é/倿¿ããããã¯ãŒã¯ã¢ãŒããã¯ãã£ã®æ©èœã«ã€ããŠã¯ç¡éã«èªãããšãã§ããŸããããããã¯ãã¹ãŠäžèšãšåãåçãšã¢ãããŒãã«åºã¥ããŠããŸãã ã¯ããå¥ã®èšäºã«å€ããŸãã
AWïŒAssaultã§ã®çµæ-åé¡ãé倧ãªé å»¶ãªãã«3Gãããã¯ââãŒã¯ã§ãã¬ã€ããèœåã ïŒå®å®ããæ¥ç¶ã§ã¯ãããïŒEdgeã§ãååãšèšããŸãã ç§ã®æèŠã§ã¯ããããã¯16人ã®ãã¬ãŒã€ãŒã®ãã«ããã¬ãŒã€ãŒã«ãšã£ãŠéåžžã«ãŸãšããªæ°åã§ãã ãã£ã³ãã«ã®åãã«å ããŠãä»ã®å€ãã®ã²ãŒã ãšã¯ç°ãªããpingã«å¯ŸããŠãéèŠã§ã¯ãããŸããã
è£è¶³ãåè«ãè°è«ããããšãããã°ãã³ã¡ã³ããæè¿ããŸãïŒ :)