Apa yang Sebenarnya Menentukan Waktu Tunggu Antrean Matchmaking
Jika Anda bertanya bagaimana cara memperkirakan waktu tunggu antrean matchmaking, jawaban singkat yang paling akurat adalah ini: ambil jumlah pemain yang masih dibutuhkan untuk membentuk pertandingan yang valid di segmen Anda, bagi dengan tingkat kedatangan pemain yang kompatibel di segmen tersebut, dan sesuaikan dengan probabilitas bahwa mereka benar-benar akan cocok mengingat batasan MMR dan wilayah. Dalam istilah teori antrean, ini adalah varian terkendala dari Hukum Little (W = L / λ) di mana L adalah “kekurangan” pemain dan λ adalah tingkat kedatangan efektif dari pemain yang memenuhi syarat. Saya akan menunjukkan matematikanya, alur datanya, dan trik kalibrasi yang menjaga penghitung waktu tetap jujur.
Kebanyakan thread forum berhenti pada “gunakan saja rata-rata.” Itu gagal karena matchmaking bukanlah satu jalur FIFO; ini adalah ribuan kumpulan yang saling berpotongan. Ketika saya pertama kali membangun prediktor untuk game tembak-menembak pahlawan 6v6, saya secara naif merata-ratakan 20 waktu tunggu terakhir dan memberi tahu pemain DPS “~45 detik.” Pada pukul 18.00 PST, median sebenarnya adalah 110 detik karena antrean tank menguras kumpulan bersama. Kesalahan itu membuat kami menuai banyak ulasan marah.
Hal yang tidak diberitahukan siapa pun tentang penghitung waktu antrean adalah bahwa angka yang ditampilkan adalah objek UX terlebih dahulu dan perkiraan statistik kedua. Rata-rata yang secara teknis benar masih bisa terasa seperti kebohongan jika 70% pemain menunggu lebih lama. Kami akan memperbaikinya nanti dengan kerangka persentil.
Untuk menghitung waktu tunggu dalam antrean secara umum, Anda dapat menggunakan hubungan dari kursus teori antrean MIT: rata-rata tunggu ≈ panjang antrean ÷ tingkat kedatangan. Dalam game, panjang antrean tersembunyi karena pemain dipartisi oleh MMR, wilayah, dan mode, jadi Anda harus memperkirakan panjang “efektif” per partisi daripada garis global.
Variabel Kunci yang Memiringkan Perkiraan Anda
Sebelum menulis kode, petakan variabelnya. Saya mengelompokkannya menjadi empat kategori utama ditambah dua kategori sekunder. Masing-masing melipatgandakan ketidakpastian. Lewatkan satu saja dan model Anda akan bias dengan cara yang langsung dirasakan pemain.
Populasi Pemain dan Gelombang Waktu Hari
Konkurensi mentah adalah sinyal dasar. Kumpulan global 50 ribu pengguna bersamaan (CCU) terdengar besar sampai Anda memotongnya berdasarkan wilayah (NA-East, EU-West) dan mode (ranked 2v2). Tingkat kedatangan nyata λ untuk satu irisan mungkin 5–10 pemain/menit. Saya telah mengukur fluktuasi 4x antara pukul 3 pagi dan 7 malam untuk irisan yang sama di game berukuran sedang dengan puncak CCU 80 ribu.
Sebagai contoh, judul dengan CCU 200 ribu mungkin memiliki 12 ribu di NA-East, 3 ribu di ranked 3v3, lalu 300 per bin MMR. Itu λ yang sangat kecil. Jika Anda menggunakan rata-rata global, Anda akan melebih-lebihkan hingga 10x.
Distribusi MMR dan Efek Ekor
Rating matchmaking memampatkan kumpulan. Jika kalkulator rating Anda membagi pemain ke dalam 20 peringkat, 0,5% teratas di tier diamond mungkin hanya memiliki 30 pemain aktif per wilayah. Seperti yang kami bahas di panduan Kalkulator Rating Matchmaking kami, jendela MMR yang ketat secara tajam mengurangi λ. Waktu tunggu tumbuh secara nonlinier saat Anda mempersempit pita karena Anda membutuhkan k pemain di pita yang tepat itu, bukan hanya di mana saja.
Dalam satu proyek, memperlebar MMR dari ±50 menjadi ±150 mengurangi median tunggu dari 180 detik menjadi 40 detik untuk pemain support peringkat atas. Itu perubahan 4,5x dari satu parameter tunggal.
Wilayah dan Batas Latensi
Pencocokan lintas wilayah secara teknis mungkin tetapi meningkatkan ping. Sebagian besar sistem melarang pertandingan >100ms, menciptakan batas keras. Pemain di Singapura pada tengah malam mungkin memiliki λ mendekati nol untuk mode ranked meskipun CCU global 200 ribu. Perlakukan wilayah sebagai partisi keras kecuali Anda memiliki infrastruktur relay.
Mode dan Aturan Komposisi Tim
Mode antrean peran (tank/dps/support) membagi irisan lebih jauh. 6v6 membutuhkan 2 tank, 2 support, 2 dps. Jika tank tiba pada 2/menit tetapi dps pada 20/menit, hambatannya adalah tank. Estimator Anda harus melacak defisit per peran, bukan hanya jumlah kepala. Mengabaikan ini adalah alasan mengapa thread “perkiraan waktu antrean berbohong di 6v6” meledak.
Faktor Platform dan Cross-Play
Kumpulan konsol dan PC sering tidak bercampur karena keadilan input. Jika Anda mengaktifkan cross-play hanya untuk mode tertentu, λ berubah secara tiba-tiba. Saya pernah melihat λ kumpulan Xbox turun 60% ketika cross-play dimatikan dalam sebuah patch, menyebabkan lonjakan tunggu yang tidak diprediksi siapa pun karena model mengasumsikan kumpulan terpadu.
Hari dalam Minggu dan Irama Patch
Akhir pekan menggeser puncak malam lebih awal. Hari patch baru menciptakan “squash peluncuran” di mana semua orang mengantre di menit pertama. Kurva mingguan historis sangat penting; jangan percaya satu jam terakhir saja. Simpan 28 hari λ per jam per irisan.
Model Statistik: Dari Rata-Rata Bergerak hingga Kedatangan Poisson
Sekarang metode intinya. Ada tiga pendekatan yang pernah saya rilis di produksi, masing-masing dengan trade-off. Pilih berdasarkan kematangan data dan anggaran komputasi.
Mengapa Rata-Rata Sederhana Menyesatkan
Metode termudah menyimpan N latensi pertandingan terakhir dan merata-ratakannya. Ini kuat tetapi buta terhadap penurunan populasi mendadak. Jika Anda menggunakan rata-rata 20 pertandingan datar pada pukul 3 pagi, Anda akan membawa waktu tunggu jam sibuk ke jam sepi. Pembobotan memperbaiki sebagian ini.
Matematika Poisson dan Erlang
Jika kedatangan pemain independen (kebanyakan memang), modelkan setiap irisan sebagai proses Poisson dengan tingkat λ. Waktu untuk mengumpulkan k pemain yang dibutuhkan untuk peran kritis mengikuti distribusi Erlang. Tunggu yang diharapkan = k / λ, varians = k / λ². Ini memuaskan secara matematis dan dijelaskan dalam materi MIT yang ditautkan sebelumnya. Ini bersinar ketika λ stasioner tetapi rusak selama acara lobi.
Untuk defisit 2 tank dengan λ_tank = 1,2/menit, tunggu yang diharapkan = 2/1,2 = 1,67 menit ≈ 100 detik. Itu perkiraan Poisson murni sebelum kalibrasi.
Simulasi untuk Kendala Kompleks
Untuk antrean peran yang kompleks, jalankan Monte Carlo ringan setiap menit: simulasikan kedatangan dari λ historis per peran, uji pembentukan pertandingan. Mahal tetapi menangkap hambatan yang berkorelasi. Saya menggunakan ini hanya untuk kalibrasi pasca-hoc, bukan perkiraan langsung karena membutuhkan 1 ribu iterasi per irisan per menit.
| Model | Data yang Dibutuhkan | Akurasi | Biaya Komputasi | Terbaik Untuk |
|---|---|---|---|---|
| Rata-Rata Bergerak Tertimbang | N waktu pertandingan terakhir | Sedang, tertinggal | Rendah | Game kecil, MVP cepat |
| Poisson/Erlang | λ per irisan, kebutuhan peran | Tinggi jika stasioner | Rendah | Populasi stabil |
| Simulasi Monte Carlo | Distribusi kedatangan penuh | Tertinggi | Tinggi | Kalibrasi, peran kompleks |
Kebanyakan orang tidak menyadari bahwa Poisson mengasumsikan kedatangan tanpa memori; pembaruan lobi (misalnya, streamer mendorong 200 pemain) melanggarnya. Saat itulah perkiraan Anda harus kembali ke rata-rata bergerak.
Panduan Implementasi: Membangun Prediktor Tertimbang
Berikut adalah alur praktis. Saya akan menggunakan pseudocode untuk rata-rata tertimbang menggunakan latensi pertandingan terbaru, lalu menambahkan koreksi Poisson dan loop bias.
Langkah 1: Keluarkan Peristiwa Antrean
Catat setiap “search_start” dan “match_found” dengan stempel waktu, wilayah, mode, peran, bin MMR. Anda membutuhkan setidaknya 1–2 minggu data untuk melihat siklus harian. Tanpa tag per peran, Anda tidak dapat memperbaiki hambatan peran.
Langkah 2: Hitung Sampel Tunggu Bergulir
Untuk setiap pemain yang cocok, tunggu = match_found – search_start. Simpan dalam buffer melingkar per irisan. Batasi buffer pada 200 sampel untuk membatasi memori.
Langkah 3: Pseudocode Rata-Rata Tertimbang
// bobot meluruh secara eksponensial
function estimateWait(slice):
buffer = slice.recentWaits // daftar {t, wait}
now = currentTime
sumW = 0; sumWW = 0
for each sample in buffer:
age = now – sample.t
weight = exp(-age / HALF_LIFE) // HALF_LIFE=300s
sumW += weight
sumWW += weight * sample.wait
return sumWW / sumW
Ini memberikan perkiraan yang sadar waktu yang beradaptasi dengan jam sibuk. Dalam kasus 6v6 kami, HALF_LIFE=300s mengurangi kesalahan dari 40% menjadi 18% dibandingkan rata-rata datar. Gunakan 300–600 detik untuk game dengan siklus harian yang jelas.
Langkah 4: Koreksi Poisson untuk Defisit Peran
Hitung λ_role dari kedatangan per menit. Jika peran yang dibutuhkan = R, antrian saat ini = Q, defisit D = max(0, R – Q). Perkiraan waktu tunggu = D / λ_role. Gabungkan: final = 0.7*weightedAvg + 0.3*poissonEstimate. Bobot gabungan ini adalah parameter kalibrasi yang disesuaikan per mode.
Langkah 5: Loop Kalibrasi Bias
// lacak prediksi vs aktual
bias = exponentialSmooth(actualWait / max(1,predictedWait), alpha=0.1)
finalAdjusted = final * (1 / clamp(bias, 0.5, 2.0))
Jika bias > 1, aktual lebih lama dari prediksi; kita bagi untuk meningkatkan estimasi. Clamp mencegah perubahan liar dari satu pertandingan aneh.
Langkah 6: Estimasi Persentil
Simpan waktu tunggu terbaru yang diurutkan untuk mengekstrak p50 dan p90. Tampilkan p50 sebagai angka utama. Jika p90 > 2*p50, tambahkan “(kadang lebih lama)”. Ini mengelola ekspektasi dengan jujur.
Jika Anda menginginkan alat siap pakai, Matchmaking Queue Wait Time Estimator kami mengimplementasikan gabungan ini secara langsung tanpa Anda menjalankan infrastruktur.
Kalibrasi dan Masalah “Kebohongan”: Mengapa Estimasi Menyesatkan
Bahkan model yang baik menunjukkan angka yang salah jika tidak dikalibrasi. Keluhan klasik “estimasi waktu antrian berbohong di 6v6” berasal dari meremehkan risiko ekor. Berikut cara memperbaiki UX.
Ukur Persentil, Bukan Hanya Rata-rata
Pemain mengingat waktu tunggu terburuk. Tampilkan p50 (median) sebagai angka utama, dengan petunjuk kecil “hingga p90” saat p90 > 2*p50. Saya belajar ini setelah patch di mana rata-rata 60 detik tetapi p90 240 detik; pengguna merasa dikhianati meskipun rata-rata “akurat”.
Kalibrasi untuk Bias Over/Under Estimasi
Lacak prediksi vs aktual selama 1 jam bergulir. Jika rasio prediksi/aktual >1.1, Anda melebih-lebihkan; terapkan faktor koreksi perkalian. Gunakan pemulusan eksponensial pada istilah bias. Hitung ulang setiap 5 menit.
Tangani Cold Start dan Zona Mati
Ketika λ mendekati nol (populasi rendah), rumus Poisson meledak. Batasi estimasi pada status “>5 menit” dan beri prompt “coba mode lain.” Hal yang tidak diberitahukan siapa pun: menampilkan “memperkirakan…” tanpa batas lebih buruk daripada batas konservatif karena pemain menatap UI yang membeku.
Aturan desain: timer antrian adalah janji. Kurangi janji 10–15% dan pemain akan terkejut dengan senang; berlebihan dan mereka pergi.
Studi Kasus: Kalibrasi Ulang Mode 6v6 Setelah Badai Keluhan DPS
Ketika mode 6v6 kami diluncurkan, pemain DPS melihat “~25 detik” tetapi p50 aktual adalah 95 detik. Thread forum menuduh kami timer palsu. Saya menarik log: kami menggunakan tingkat kedatangan mode total (semua peran) untuk estimasi. Tank tiba pada 1,2/menit, DPS pada 15/menit. Setiap pertandingan membutuhkan 2 tank, jadi waktu tunggu defisit Poisson = 2/1,2 = 100 detik. DPS kelaparan karena tank, bukan pertandingan.
Kami menerapkan Poisson sadar peran dengan gabungan 70/30 ke rata-rata tertimbang. Dalam dua hari, kesalahan turun dari 280% overestimasi kecepatan menjadi 8% pada p50. Tiket dukungan yang ditandai “kebohongan antrian” turun 62%. Pelajarannya: pisahkan berdasarkan peran sebelum menghitung apa pun.
Kebanyakan orang tidak menyadari bahwa angka timer hanya sebaik definisi irisan. Jika Anda menggabungkan “ranked” dan “casual” demi singkatnya, Anda akan secara sistematis meremehkan waktu tunggu ranked sebesar 3–5x di luar jam sibuk.
Panduan Pemain untuk Menafsirkan Timer
Ganti topi: jika Anda seorang gamer melihat “~90 detik,” pahami artinya. Timer bukan hitungan mundur ke pertandingan Anda; itu adalah tebakan terbaik sistem untuk median waktu tunggu di irisan MMR/wilayah/mode Anda. Itu tidak tahu jika satu regu tank baru saja mengantre di belakang Anda.
Ketika estimasi melonjak dari 30 detik ke 3 menit, itu biasanya penurunan populasi atau ketidakseimbangan peran (misalnya, semua orang mengantre DPS). Memahami ini menghentikan frustrasi. Juga, banyak game menggunakan periode “rentang” di mana 10 detik pertama tidak ada estimasi—itu normal sementara sistem mengukur λ lokal.
Jika Anda sering melihat ketidakcocokan antara yang ditampilkan dan waktu tunggu nyata, itu sering karena pengembang menggunakan rata-rata global. Gunakan estimator kami untuk memeriksa latensi nyata wilayah Anda sendiri. Membatalkan dan mengantre ulang jarang membantu; Anda masuk kembali ke irisan yang sama.
Model Kematangan Estimasi Waktu Tunggu Matchmaking
Untuk membuat ini dapat ditindaklanjuti, berikut kerangka unik yang saya gunakan untuk mengaudit sistem. Nilai proyek Anda pada lima tingkat ini:
- Tingkat 1: Teks statis (“Waktu antrian dapat bervariasi”). Tanpa data.
- Tingkat 2: Rata-rata bergerak datar dari N pertandingan terakhir, hanya global.
- Tingkat 3: Rata-rata tertimbang sadar irisan (wilayah/mode), tampilan persentil.
- Tingkat 4: Model Poisson/defisit peran dengan kalibrasi bias.
- Tingkat 5: Simulasi hibrida + koreksi langsung + kata-kata risiko ekor UX.
Sebagian besar judul yang dirilis berada di Tingkat 2–3. Mencapai Tingkat 4 memotong tiket dukungan tentang “timer palsu” setengahnya dalam pengalaman saya. Tingkat 5 untuk game dengan >500k CCU di mana biaya simulasi dibenarkan.
Gunakan daftar periksa ini untuk naik satu tingkat:
- Audit pencatatan peristiwa — apakah search_start/end ditangkap per peran?
- Hitung λ per irisan untuk 14 hari terakhir, buat grafik per jam.
- Terapkan pseudocode rata-rata tertimbang di atas dengan waktu paruh 300 detik.
- Tambahkan pelacakan p50/p90 dan loop koreksi bias.
- Tinjauan UX: apakah timer menetapkan ekspektasi yang benar?
Jebakan Umum dan Kasus Tepi dari Produksi
Sistem nyata rusak dengan cara tertentu. Berikut tiga yang saya temui di luar bug peran.
Efek Antrian Squash
Ketika musim baru rilis, jutaan orang mengantre dalam 5 menit pertama. Buffer “waktu tunggu terbaru” Anda kosong atau tercemar oleh populasi rendah pra-rilis. Solusi: isi λ dari kurva peluncuran musim historis, bukan jam terakhir. Saya menyimpan tabel “prior peluncuran” per mode.
Kolam Smurf MMR
Akun baru sering mendapatkan MMR longgar, secara artifisial menggabungkan terampil dan pemula. λ tampak tinggi tetapi kualitas pertandingan rendah; estimasi waktu tunggu baik namun pemain merasa tidak cocok. Bukan bug timer, tetapi layak dicatat dalam telemetri Anda agar tidak mengejar perbaikan antrian hantu.
Kanibalisasi Lintas Mode
Membuka mode terbatas populer mencuri tank dari ranked. λ ranked Anda turun 30% secara tak terduga. Saya sekarang memantau korelasi lintas mode; jika mode terbatas aktif, tambahkan 20% ke estimasi ranked. Ini heuristik, bukan teori, tetapi berhasil.
Failover Gangguan Server
Jika matchmaker wilayah turun, pemain mengantre ke layanan mati. Estimator Anda harus mendeteksi nol pertandingan terbentuk dalam 60 detik dan beralih ke “layanan menurun” daripada menampilkan 999 detik. Saya belajar ini selama gangguan cloud 2022.
Pertimbangan Lanjutan: Kedatangan Non-Stasioner dan Prior Bayesian
Untuk irisan dingin (mode baru, wilayah baru), metode data murni gagal. Saya menggunakan prior Bayesian: mulai dengan λ dari irisan serupa (misalnya, wilayah berdekatan) dan perbarui dengan kedatangan yang diamati. Rumus: λ_posterior = (α + observedCount) / (β + elapsedMinutes). Ini mencegah “Poisson meledak” pada data nol.
Penyesuaian lanjutan lainnya: model kedatangan sebagai baseline sinusoidal plus noise. Cocokkan sine 24 jam ke 28 hari data, lalu prediksi λ untuk 10 menit berikutnya. Ini menangkap gelombang harian lebih baik daripada pembobotan eksponensial saja. Di kluster EU-West kami, sine+Poisson memotong kesalahan malam hari sebesar 12% lagi relatif terhadap pembobotan waktu paruh.
Ingat, tidak ada model yang memperbaiki populasi yang pada dasarnya tipis. Jika irisan Anda memiliki <10 pemain total, tampilkan "populasi rendah" dan sarankan mode alternatif. Kejujuran mengalahkan matematika.
Menyatukan Semuanya: Pipeline Referensi
Berikut alur kerja menyeluruh yang saya rekomendasikan untuk tim yang meluncurkan mode peringkat baru:
- Kumpulkan peristiwa antrean per peran dengan tag ember MMR dan wilayah.
- Hitung rata-rata tertimbang bergerak dengan waktu paruh 5 menit per irisan.
- Hitung perkiraan defisit Poisson menggunakan λ 10 menit per peran.
- Campur 70/30, terapkan koreksi bias dari kesalahan jam terakhir.
- Tampilkan p50 dengan catatan p90 jika rasio ekor tinggi.
- Umpan balik pertandingan aktual untuk kalibrasi ulang setiap malam.
Ini persis yang Estimator Waktu Tunggu Antrean Matchmaking otomatiskan jika Anda tidak ingin menjalankan infrastruktur. Untuk perhitungan peringkat yang lebih mendalam, Kalkulator Peringkat Matchmaking menunjukkan bagaimana bin memengaruhi ukuran kumpulan.
Memperkirakan waktu tunggu antrean matchmaking adalah sebagian statistik, sebagian empati. Kirimkan matematikanya, tetapi hargai kesabaran pemain. Timer terbaik adalah yang hilang karena pertandingan muncul sebelum pengguna meragukannya.
