1 poin oleh GN⁺ 2024-06-14 | 1 komentar | Bagikan ke WhatsApp

Analisis kode sumber Serious Engine 1

Gambaran umum

  • Serious Sam dirancang sebagai game multipemain.
  • Kampanye pemain tunggal juga berjalan seperti mode multipemain.
  • Serious Engine mendukung pemain tunggal, multipemain, perekaman demo, dan pemutaran ulang.

Determinisme floating point

  • Untuk sinkronisasi game, perilaku deterministik dari operasi floating point sangat penting.
  • Karena hanya dirilis di Windows, masalah sinkronisasi akibat perbedaan kompiler dapat dihindari.
  • Precision guard digunakan untuk mengatasi masalah yang disebabkan oleh perbedaan presisi FPU.

Tick vs frame

  • Tick rate logika game dipisahkan dari frame rate rendering.
  • Logika game ditetapkan tetap pada 20 tick per detik.
  • Interpolation digunakan untuk gerakan dan animasi yang halus.

Multipemain jaringan

  • Model jaringan Serious Engine menggunakan arsitektur klien-server.
  • Server menerima dan memproses pesan dari klien, lalu meneruskan informasi terkait ke semua klien.
  • Protokol UDP digunakan untuk mengirim paket.

Lapisan paket

  • Paket UDP bisa datang tidak berurutan atau tidak sampai sama sekali.
  • Serious Engine mengimplementasikan protokolnya sendiri di atas UDP untuk menjamin keandalan dan urutan paket.
  • Paket yang andal dikonfirmasi melalui paket ACK.

Siklus hidup koneksi

  • Paket broadcast digunakan untuk membangun koneksi virtual antara klien dan server.
  • Server memberikan pengenal unik kepada klien dan merutekan paket berdasarkan pengenal tersebut.

Permainan offline

  • Mode pemain tunggal dan pemutaran demo adalah kasus khusus dari multipemain.
  • Server dan klien berkomunikasi di dalam proses yang sama.

Lapisan pesan

  • CNetworkMessage adalah abstraksi pesan yang dapat dibaca dan ditulis seperti stream.
  • Pesan dapat dikompresi, dan secara default menggunakan kompresi LZRW1.
  • Delta encoding digunakan untuk meminimalkan jumlah data yang ditransmisikan.

Keamanan pesan

  • Pesan tidak dienkripsi.
  • Pesan chat dikirim dalam bentuk plaintext.

Opini GN⁺

  • Bermanfaat bagi pengembang game: Struktur jaringan dan mekanisme sinkronisasi Serious Engine dapat menjadi referensi yang berguna untuk pengembangan game multipemain.
  • Pentingnya perilaku deterministik: Cara menjamin perilaku deterministik pada operasi floating point merupakan elemen penting dalam menyelesaikan masalah sinkronisasi game.
  • Desain protokol jaringan: Implementasi protokol sendiri di atas UDP yang menjamin keandalan dan urutan merupakan contoh yang baik dalam pemrograman jaringan.
  • Pertimbangan keamanan: Tidak adanya enkripsi pesan adalah hal yang perlu dipertimbangkan dari sisi keamanan dalam pengembangan game modern.
  • Tantangan teknis: Ini membantu memahami tantangan teknis dalam mewujudkan game multipemain berkecepatan tinggi di lingkungan jaringan awal 2000-an.

1 komentar

 
GN⁺ 2024-06-14
Komentar Hacker News
  • Saya adalah pengembang yang mengimplementasikan kode jaringan untuk Serious Sam. Saya menulis MVP sederhana yang terinspirasi dari sistem prediksi QuakeWorld.
  • Serious Sam selalu berjalan dengan baik di LAN party. Bahkan saat game lain bermasalah, game ini tetap berjalan stabil.
  • Saya mengimplementasikan multiplayer Vigilante 8 untuk port GB Color dengan gameplay deterministik. Data dikirim satu byte per kali menggunakan kabel link GBC.
  • Croteam adalah tim pengembang game yang sangat berbakat. Mereka membuat seri Talos Principle dan engine game Vulkan kustom.
  • Ada yang bertanya apakah ini mirip dengan ide seperti "1500 archers on a 28.8" dari Age of Empires.
  • Ada yang menyoroti fenomena ketika software menjadi lebih lambat dan tidak efisien seiring bertambahnya sumber daya teknis. Ini disebut "efek desain software Benjamin Button".
  • Arsitektur Factorio hanya mengirim event input dan bergantung pada inti simulasi yang tersinkronisasi.
  • Ada yang mengingat pernah memainkan Serious Sam lewat demo PC Gamer. Sekarang game itu sudah dianggap sebagai game klasik.
  • Dijelaskan fitur interpolasi pada Serious Engine. Di konsol, Anda bisa memasukkan net_bLerping=0 untuk memainkan game tanpa interpolasi.