Kembali ke Blog

Arsitektur Server Zero-Waste: Analisis Proposal Hibernasi Optimalisasi Server Fortnite

Diterbitkan pada 25 Februari 2026
Arsitektur Server Zero-Waste: Analisis Proposal Hibernasi Optimalisasi Server Fortnite

Setiap pengembang multiplayer pada akhirnya akan membentur dinding finansial yang sama: infrastruktur server Anda membakar uang untuk mensimulasikan ruang kosong. Saat Anda menjalankan Dedicated Server untuk battle royale skala besar, game survival, atau MMO, siklus CPU sangat condong ke kalkulasi idle. Anda membayar biaya Cloud Computing premium untuk menghitung gravitasi batu yang tidak dilihat siapa pun, memproses navigasi AI untuk musuh tanpa target, dan mempertahankan World States di sektor yang sama sekali tidak ada aktivitas pemain.

Baru-baru ini, sebuah proposal teknis yang menarik muncul di komunitas Unreal Engine yang ditujukan kepada kepemimpinan Epic Games. Tesis utamanya? Skala masif Fortnite memerlukan transisi dari model hosting terpusat dengan pemeliharaan tinggi ke model "Zero-Waste Infrastructure". Penulis berargumen bahwa dengan menghilangkan pemborosan simulasi, Epic dapat mengurangi Operating Expenses (Opex) sebesar 60-70%, yang secara teoritis memungkinkan mereka memangkas harga mata uang premium menjadi MSRP $1,99 untuk 1.000 V-Bucks.

Meskipun kelayakan ekonomi dari harga V-Buck adalah perdebatan bagi desainer monetisasi, pilar teknis dari proposal ini—Sector Physics Hibernation (SGH)—adalah masterclass dalam arsitektur server modern.

Dalam analisis industri ini, kita akan membedah mekanik dari proposal hibernasi optimalisasi server Fortnite, mengeksplorasi cara kerja Logic-Side Culling di Unreal Engine 5, dan mendemonstrasikan bagaimana Anda dapat menerapkan infrastruktur zero-waste di judul multiplayer Anda sendiri.

Matematika Pemborosan Simulasi

Untuk memahami mengapa Sector Physics Hibernation diperlukan, kita harus melihat matematika brutal dari Dedicated Server game.

Ambil contoh peta battle royale standar seluas 100km². Di awal pertandingan, 100 pemain terjun ke berbagai Point of Interest. Dalam 5 menit pertama, 50% pemain tereliminasi, dan pemain yang bertahan berkumpul menuju Safe Zone yang menyusut.

Pada menit ke-10, lebih dari 70% dari total luas permukaan peta berisi nol pemain aktif. Namun, dalam pengaturan Authoritative Server standar, Dedicated Server terus melakukan Tick pada seluruh status dunia pada frekuensi 30Hz.

  • Physics Calculations: Rigid Bodies, lingkungan yang dapat hancur, dan balistik tetap dilacak di memori.
  • Actor Ticking: Ribuan instance AActor memanggil fungsi Tick() mereka 30 kali per detik.
  • NavMesh Processing: AI yang berkeliaran atau rintangan dinamis terus menanyakan Navigation Mesh.

Jika Anda menjalankan server di instance AWS c5.2xlarge, Anda membayar sekitar $0,34 per jam per mesin. Jika satu mesin hanya dapat menampung dua instance game 100 pemain karena CPU maksimal menghitung ruang kosong, skala Anda sangat terhambat.

Proposal tersebut menyarankan bahwa dengan mengambil kembali overhead CPU yang terbuang ini, pengembang dapat mengemas 5-6 instance game ke perangkat keras yang sama (memangkas biaya server sebesar ~60%), atau mengalihkan daya pemrosesan yang diperoleh kembali untuk meningkatkan Tick Rate server global dari 30Hz ke 60Hz+, memastikan Hit Registration yang sempurna dan gameplay yang sangat mulus.

Deep Dive: Sector Physics Hibernation di UE5

Solusi teknis yang diusulkan bergantung pada pemanfaatan sistem World Partition yang ada di Unreal Engine 5, tetapi membalikkan kasus penggunaan utamanya dari manajemen memori di sisi client ke manajemen CPU di sisi server.

Masalah dengan Dedicated Server Default

Secara default, World Partition di UE5 melakukan streaming sel masuk dan keluar untuk client berdasarkan jarak mereka dari sumber streaming (kamera pemain). Ini sangat bagus untuk menjaga penggunaan memori client tetap rendah dan framerate tetap tinggi.

Namun, Dedicated Server biasanya memuat seluruh peta ke dalam memori untuk menjaga otoritas. Jika seorang sniper menembakkan peluru melintasi lembah, atau jika event global terpicu, server membutuhkan data tabrakan dan Actor States yang tersedia untuk memvalidasi tindakan tersebut. Memuat dan mengeluarkan data secara dinamis dari disk di server (Level Streaming) seringkali terlalu lambat dan menyebabkan hitching masif, merusak Tick Rate.

Solusi SGH: Logic-Side Culling

Alih-alih mengeluarkan sektor dari memori (yang menyebabkan bottleneck IO), Sector Physics Hibernation mengusulkan CPU-Sleep States.

Sektor tetap berada di RAM, tetapi semua Tick, kalkulasi fisika, dan pembaruan status dihentikan secara agresif. Ketika sel Spatial Grid suatu sektor mendeteksi nol entitas aktif (pemain, kendaraan milik pemain, atau proyektil aktif), server menangguhkan alokasi CPU untuk grid spesifik tersebut.

Mengimplementasikan Hibernation Manager di C++

Untuk membangun ini di Unreal Engine, Anda memerlukan subsistem yang memantau sel Spatial Grid dan secara dinamis mengganti status Tick aktor di dalamnya. Di bawah ini adalah prototipe arsitektur sederhana tentang bagaimana Anda dapat mengimplementasikan SectorHibernationManager.

#include "SectorHibernationManager.h"
#include "EngineUtils.h"
#include "GameFramework/Actor.h"
#include "GameFramework/PlayerController.h"

void USectorHibernationManager::Initialize(FSubsystemCollectionBase& Collection)
{
    Super::Initialize(Collection);
    HibernationCheckInterval = 2.0f; // Periksa setiap 2 detik
    TimeSinceLastCheck = 0.0f;
    GridCellSize = 10000.0f; // Sel grid 100m
}

void USectorHibernationManager::Tick(float DeltaTime)
{
    TimeSinceLastCheck += DeltaTime;
    if (TimeSinceLastCheck >= HibernationCheckInterval)
    { 
        EvaluateSectors();
        TimeSinceLastCheck = 0.0f;
    }
}

void USectorHibernationManager::EvaluateSectors()
{
    UWorld* World = GetWorld();
    if (!World) return;

    // Langkah 1: Petakan posisi pemain aktif ke sel grid
    TSet<FIntVector> ActiveCells;
    for (FConstPlayerControllerIterator Iterator = World->GetPlayerControllerIterator(); Iterator; ++Iterator)
    { 
        APlayerController* PC = Iterator->Get();
        if (PC && PC->GetPawn())
        { 
            FVector PlayerPos = PC->GetPawn()->GetActorLocation();
            FIntVector CellCoord = FIntVector(
                FMath::FloorToInt(PlayerPos.X / GridCellSize),
                FMath::FloorToInt(PlayerPos.Y / GridCellSize),
                FMath::FloorToInt(PlayerPos.Z / GridCellSize)
            );
            
            // Tandai sel ini dan sel yang berdekatan sebagai aktif (zona buffer)
            MarkAdjacentCellsActive(CellCoord, ActiveCells);
        }
    }

    // Langkah 2: Iterasi melalui aktor yang dapat dihibernasi dan ganti tick
    for (TActorIterator<AActor> ActorItr(World); ActorItr; ++ActorItr)
    { 
        AActor* Actor = *ActorItr;
        
        // Lewati aktor infrastruktur penting
        if (!Actor->ActorHasTag(FName("Hibernatable"))) continue;

        FVector ActorPos = Actor->GetActorLocation();
        FIntVector ActorCell = FIntVector(
            FMath::FloorToInt(ActorPos.X / GridCellSize),
            FMath::FloorToInt(ActorPos.Y / GridCellSize),
            FMath::FloorToInt(ActorPos.Z / GridCellSize)
        );

        bool bShouldBeActive = ActiveCells.Contains(ActorCell);
        
        if (bShouldBeActive && !Actor->IsActorTickEnabled())
        { 
            // Bangun
            Actor->SetActorTickEnabled(true);
            Actor->SetActorEnableCollision(true);
        }
        else if (!bShouldBeActive && Actor->IsActorTickEnabled())
        { 
            // Tidur
            Actor->SetActorTickEnabled(false);
            // Opsional: Turunkan tabrakan ke query sederhana saja untuk menghemat waktu thread fisika
            Actor->SetActorEnableCollision(false); 
        }
    }
}

Kompleksitas Fase "Wake-Up"

Kode di atas mengilustrasikan konsep inti, tetapi tantangan teknik yang sebenarnya terletak pada fase bangun. Jika seorang pemain menembakkan senapan sniper berkecepatan tinggi ke sektor yang sedang tidur, proyektil akan melintasi batas sebelum loop evaluasi 2 detik menangkapnya.

Jika sektor bangun setelah peluru tiba, Anda akan mengalami desync yang fatal. Peluru mungkin menembus kendaraan yang sedang hibernasi karena tabrakannya dinonaktifkan. Fenomena ini sangat terkait dengan masalah yang dirinci dalam panduan kami tentang The Unreal Engine Multiplayer Sync Bug Ruining Your World States And How To Fix It, di mana perbedaan waktu antara status server dan prediksi client merusak simulasi sepenuhnya.

Untuk mengatasi ini, infrastruktur zero-waste membutuhkan Predictive Wake-Ups. Alih-alih hanya melacak posisi pemain, server harus menghitung vektor kecepatan ke depan dari semua proyektil aktif dan kendaraan berkecepatan tinggi. Jika sebuah vektor berpotongan dengan sel grid yang sedang tidur, server harus secara instan memaksa event bangun pada sel spesifik tersebut sebelum objek tiba.

Mengorkestrasi Server Zero-Waste dalam Skala Besar

Mengimplementasikan Logic-Side Culling di dalam engine game Anda hanyalah setengah dari pertempuran. Setengah lainnya adalah orkestrasi infrastruktur.

Jika Dedicated Server UE5 Anda berhasil mengurangi footprint CPU-nya sebesar 60% secara dinamis, lingkungan hosting server Anda harus cukup pintar untuk mengenali penurunan penggunaan sumber daya tersebut dan mengemas instance game baru ke node perangkat keras yang sama.

Membangun orkestrasi ini sendiri membutuhkan upaya DevOps engineering yang sangat besar. Anda perlu menerapkan cluster Kubernetes, mengonfigurasi Agones untuk manajemen siklus hidup server game, menulis metrik penskalaan khusus berdasarkan utilisasi CPU, dan mengelola Load Balancers untuk merutekan pemain ke instance yang benar. Ini dengan mudah memakan waktu 4-6 bulan kerja infrastruktur khusus—waktu yang diambil langsung dari pembuatan game Anda.

Dengan horizOn, layanan orkestrasi backend ini sudah dikonfigurasi sebelumnya. Platform ini menangani pengemasan instance dinamis, Auto-Scaling berdasarkan beban server real-time, dan pipeline deployment otomatis untuk build Dedicated Server Anda. Dengan membiarkan Backend-as-a-Service khusus menangani infrastruktur, Anda dapat merilis game multiplayer Anda alih-alih menghabiskan setengah tahun bertarung dengan manifes Kubernetes.

Selain itu, saat Anda mengemas lebih banyak instance ke dalam satu node, Anda meningkatkan risiko masalah Noisy Neighbor yang memengaruhi thread jaringan Anda. Mengamankan Netcode Anda dari hambatan ini sangatlah penting, topik yang kami bahas secara luas di The Uefn Server Performance Exploit Explained Hard Armoring Your Unreal Engine Netcode.

Praktik Terbaik untuk Arsitektur Multiplayer Zero-Waste

Baik Anda sedang membangun battle royale 100 pemain atau game survival open-world yang persisten, mengimplementasikan hibernasi dan teknik zero-waste memerlukan disiplin arsitektur yang ketat. Berikut adalah lima praktik terbaik yang telah teruji untuk memastikan Opex server Anda tetap rendah tanpa mengorbankan pengalaman pemain:

1. Pisahkan Game State dari Tick Loop

Musuh terbesar performa server adalah polling data yang terus-menerus. Jangan pernah menggunakan Tick() untuk memeriksa apakah suatu event harus terjadi. Beralihlah sepenuhnya ke Event-Driven Architecture. Jika api unggun perlu padam setelah 5 menit, jangan lakukan tick setiap frame untuk mengurangi waktu. Atur timer delegate yang dipicu tepat satu kali setelah 300 detik. Ini memungkinkan aktor api unggun untuk tetap tidur sepenuhnya selama 4 menit 59 detik.

2. Terapkan NetCullDistanceSquared yang Agresif

Unreal Engine menentukan aktor mana yang akan direplikasi ke client mana berdasarkan NetCullDistanceSquared. Banyak pengembang membiarkan ini pada nilai default, memaksa server untuk menserialisasi dan mengompresi data untuk aktor yang berada ratusan meter dari pemain. Audit jarak cull Anda. Senjata yang dijatuhkan tidak perlu direplikasi melampaui 5.000 unit (50 meter). Hitung radius minimum absolut yang diperlukan untuk Gameplay Loop Anda dan terapkan secara ketat.

3. Gunakan Spatial Hash Grids untuk Lookup O(1)

Saat menghitung aktor mana yang harus tidur, melakukan iterasi pada setiap aktor di dunia (TActorIterator) menjadi bottleneck tersendiri jika Anda memiliki 100.000 entitas. Implementasikan Spatial Hash Grid. Saat aktor bergerak, ia memperbarui posisinya di hash map. Ini memungkinkan Hibernation Manager Anda untuk menanyakan "Apa yang ada di Sel Grid X?" dalam kompleksitas waktu O(1), membuat evaluasi hibernasi hampir gratis di CPU.

4. Manfaatkan Buffer Zones untuk Bangun yang Mulus

Jangan pernah menghibernasi sektor tepat di tepi pandangan pemain. Selalu pertahankan "Buffer Zone" dari sektor aktif setidaknya selebar satu sel grid di sekitar entitas aktif mana pun. Jika sel grid Anda selebar 100 meter, dan seorang pemain berada di Sel A, maka semua sel yang berdekatan (grid 3x3) harus tetap aktif sepenuhnya. Ini menjamin bahwa jika seorang pemain tiba-tiba berlari melintasi batas, sel tujuan sudah diinisialisasi sepenuhnya dan sedang melakukan tick.

5. Lakukan Profiling Build Dedicated Server Anda secara Teratur

Jangan menebak apa yang memakan CPU Anda. Gunakan Unreal Insights di lingkungan Dedicated Server yang sudah dipaketkan dengan beban simulasi. Lihat secara khusus pada timing GameThread. Jika Anda melihat Physics atau TickTime mendominasi grafik thread saat pemain berdiri diam, logika hibernasi Anda gagal. Telemetri adalah satu-satunya cara untuk memvalidasi bahwa arsitektur zero-waste Anda berfungsi dalam kenyataan, bukan hanya dalam teori.

Masa Depan Opex Server

Proposal komunitas Fortnite menyoroti kebenaran kritis: standar industri saat ini yang memaksakan performa server dengan Cloud Compute yang mahal tidak berkelanjutan. Seiring dunia yang semakin besar dan jumlah pemain yang meningkat, penskalaan linier dari biaya infrastruktur perlahan-lahan akan menguras anggaran live-ops.

Sector Physics Hibernation, Logic-Side Culling, dan pengemasan instance dinamis bukan lagi sekadar optimalisasi untuk studio AAA; itu adalah persyaratan bertahan hidup untuk game multiplayer dari semua ukuran. Dengan mengadopsi pola pikir zero-waste di awal siklus pengembangan, Anda memastikan bahwa profitabilitas game Anda meningkat seiring dengan basis pemainnya.

Jika Anda siap untuk mengimplementasikan penskalaan server dinamis tanpa pusing DevOps, coba horizOn secara gratis atau lihat dokumentasi API untuk melihat betapa mulusnya infrastruktur multiplayer.