User:Kyaco11/ワールド更新順序

概要
マインクラフトは1秒間に20回の頻度でワールドの要素を更新させることでゲーム内の時間の進行を表現している. 1度の更新にかかる時間である0.05秒をtickという単位で表現する. このページでは1tickでマインクラフトがどのようにワールドの要素を更新していくかを記述する.

フローチャート
ForgeMDKのMinecraftServer#tickを参考にしている. public void tick {       super.tick; if (this.getWorldInfo.isHardcoreModeEnabled && this.getDifficulty != EnumDifficulty.HARD) {           this.getWorldInfo.setDifficulty(EnumDifficulty.HARD); }       this.provider.getBiomeProvider.cleanupCache; if (this.areAllPlayersAsleep) {           if (this.getGameRules.getBoolean("doDaylightCycle")) {               long i = this.getWorldTime + 24000L; this.setWorldTime(i - i % 24000L); }           this.wakeAllPlayers; }       this.theProfiler.startSection("mobSpawner"); if (this.getGameRules.getBoolean("doMobSpawning") && this.worldInfo.getTerrainType != WorldType.DEBUG_WORLD) {           this.entitySpawner.findChunksForSpawning(this, this.spawnHostileMobs, this.spawnPeacefulMobs, this.worldInfo.getWorldTotalTime % 400L == 0L); }       this.theProfiler.endStartSection("chunkSource"); this.chunkProvider.tick; int j = this.calculateSkylightSubtracted(1.0F); if (j != this.getSkylightSubtracted) {           this.setSkylightSubtracted(j); }       this.worldInfo.setWorldTotalTime(this.worldInfo.getWorldTotalTime + 1L); if (this.getGameRules.getBoolean("doDaylightCycle")) {           this.setWorldTime(this.getWorldTime + 1L); }       this.theProfiler.endStartSection("tickPending"); this.tickUpdates(false); this.theProfiler.endStartSection("tickBlocks"); this.updateBlocks; this.theProfiler.endStartSection("chunkMap"); this.playerChunkMap.tick; this.theProfiler.endStartSection("village"); this.villageCollectionObj.tick; this.villageSiege.tick; this.theProfiler.endStartSection("portalForcer"); this.worldTeleporter.removeStalePortalLocations(this.getTotalWorldTime); for (Teleporter tele : customTeleporters) {           tele.removeStalePortalLocations(getTotalWorldTime); }       this.theProfiler.endSection; this.sendQueuedBlockEvents; }

備考
文章