Ini terkait dengan Kinerja MMO kecuali pertanyaan itu adalah tentang bandwidth. Ini tentang beban cpu.
Saya mengumpulkan FPS sederhana menggunakan node.js dan webGL. Ini sangat sederhana, sangat mirip dengan klon BuddyMaze dari MIDI Maze. Sangat sedikit yang terjadi, semua orang bergerak dalam dua dimensi (tanpa ketinggian), menembakkan proyektil sederhana, dan berlari ke dinding.
Saat ini, jika saya membuat beberapa koneksi ke server di mana setiap pemain menembak dengan cepat sambil berputar, saya bisa mendapatkan sekitar 15 - 20 pemain dalam permainan sebelum server memaksimalkan inti dan memperlambat jalan. Dan ini adalah saat dijalankan pada 30 fps di server. Pada 10 fps, saya mendapatkan sekitar 25 - 30 koneksi. Ini sangat buruk, karena gim ini akan memiliki banyak hal yang harus dilakukan segera dan saya harus menyesuaikan lebih banyak pemain agar ini menjadi usaha yang layak.
Saudaraku baru saja menunjukkan beberapa statistik tentang server TF2 rekan kerjanya. Servernya memiliki spesifikasi lebih rendah daripada server kami, namun menjalankan TF2, jelas permainan yang jauh lebih kompleks, dengan kecepatan 500 kutu per detik, dengan 36 pengguna per inti. Selain itu, kami saat ini mengkonsumsi bandwidth jauh lebih banyak daripada yang mereka lakukan, tetapi kami belum mencoba untuk menurunkannya sebanyak itu.
Bagaimana ini mungkin? Trik macam apa yang ada untuk meningkatkan kinerja server sebesar ini? Beberapa hal yang saya ketahui meliputi:
- Menurunkan framerate di server, dan menginterpolasi posisi pada klien. Saya mendapat beberapa manfaat, tetapi jelas server TF2 bahkan tidak repot dengan ini.
- Melakukan hal-hal mahal seperti deteksi tabrakan pada klien, dan verifikasi jarang di server. Saya belum memindahkan ini dulu, saya akan malam ini. Meski begitu saya tidak mengharapkan keuntungan sebesar itu.
- Pecah lapangan bermain menjadi daerah (pohon quad) untuk meminimalkan perhitungan. Belum punya kesempatan untuk ini.
- Saya telah mempertimbangkan kemungkinan yang tidak menguntungkan bahwa node.js jauh lebih lambat daripada TF2 apa pun yang digunakan, dan mungkin tidak cocok untuk tugas intensitas tinggi semacam ini.
- Apakah itu semua ada di konfigurasi sihir server?
Jadi apa saja trik lain dari industri untuk melakukan hanya minimum yang diperlukan pada server tetapi masih memiliki pengalaman permainan yang sempurna? Ada konflik besar antara "menunda klien untuk menghemat waktu CPU" dan "tidak mempercayai klien", jadi mungkin ada baiknya mengetahui di mana garis ditarik dalam berbagai situasi?
Memperbarui
Benar-benar profil adalah satu-satunya mantra yang pernah saya temukan yang benar-benar sempurna. Saya dengan cepat membungkus beberapa fungsi pengaturan waktu di sekitar kode saya (terima kasih, FP!) Dan menemukan apa yang tidak pernah saya duga: tindakan menyiarkan data ke akun klien selama hampir semua waktu eksekusi. Secara khusus, sekitar 90% darinya. Pengujian lebih lanjut menunjukkan bahwa saat ini tergantung pada jumlah klien dan ukuran data, tetapi yang terakhir. Pada 20 pengguna memuat, saya memotong waktu siaran saya 90%, dari 24 ms menjadi lebih dari 2 ms dengan mengirimkan hanya "{}" bukan data lengkap. Tetapi dengan hanya 5 pengguna, penyiaran membutuhkan sekitar 0,5 ms. Jadi saya jelas perlu melakukan beberapa optimasi di sini.
Peningkatan paling jelas pertama adalah line of sight checking. Ini akan mengurangi jumlah orang yang peduli tentang data, dan juga jumlah data yang dikirim ke pihak yang berkepentingan. Apakah ada trik lain di bidang ini yang bisa saya coba, yang fokus pada meminimalkan biaya operasi siaran saya?
Jawaban:
Server Anda seharusnya tidak mengirimkan status semua pemain ke semua pemain di setiap centang. Alih-alih itu harus mengirim pesan yang dibuat khusus untuk setiap klien mengatakan setiap 500 ms mengatakan "pemain x ini di port tampilan Anda harus pada koordinat ini dalam 500 ms." Sebagian besar waktu ini akan berfungsi dengan baik, tetapi jika server menyadarinya telah memberikan informasi yang salah, ia hanya mengirim pesan tambahan.
Ini akan mengurangi lalu lintas jaringan secara dramatis.
Hal lain yang perlu dipertimbangkan adalah tidak ada kutu game di server, tetapi minta klien mengirim pesan hanya ketika suatu tindakan terjadi (perubahan arah, tembakan ditembakkan) dan kemudian menghitung di depan server ketika suatu tindakan diterima.
sumber
Mungkin ini. Server TF2 ditulis menggunakan C / C ++, dan karenanya, akan lebih cepat dari node.js (yang jika saya ingat dengan benar, menggunakan Javascript yang diterjemahkan dalam Java)
Google berbasis WebGL Quake menggunakan java untuk server, dan kode sumbernya ditemukan di sini: http://code.google.com/p/quake2-gwt-port/ . Mungkin ada baiknya melihat melalui itu untuk melihat bagaimana hal itu dilakukan. Saya juga ingin tahu apa yang Anda maksud ketika Anda berbicara tentang memiliki framerate di server. Tidak ada alasan untuk me-render apa pun di server, seharusnya hanya ada untuk memproses perintah yang dikirim oleh klien.
Akhirnya, aturan "jangan mempercayai klien" lebih penting daripada menurunkan perhitungan mahal ke klien dengan harapan meningkatkan kinerja. Terutama sesuatu yang sama pentingnya dengan deteksi tabrakan. Keraguan jadi ketika game Anda berbasis Javascript, dan karenanya cukup mudah untuk diretas (dibandingkan dengan sesuatu seperti TF2 yang dikompilasi).
Saya tahu ini bukan jawaban, tapi mudah-mudahan ini akan mengarahkan Anda ke beberapa arah yang dapat membantu meningkatkan kinerja.
sumber