1 poin oleh GN⁺ 2025-11-24 | Belum ada komentar. | Bagikan ke WhatsApp
  • Bug aneh ditemukan pada adegan awal Half-Life 2 di mana pintu tidak terbuka sehingga progres terhenti
  • Penyebabnya adalah ujung kaki penjaga yang berdiri di dalam jalur pintu bertabrakan dengan pintu saat terbuka, sehingga pintu menutup lagi dan terkunci
  • Tabrakan yang sama juga ada di kode asli, tetapi hasilnya berbeda karena perbedaan presisi antara operasi floating-point x87 tahun 2004 dan operasi SSE tahun 2013
  • Di lingkungan x87, sedikit rotasi mendorong kaki bergeser tipis sehingga tabrakan teratasi, tetapi di SSE rotasinya tidak cukup sehingga pintu justru menutup
  • Kasus ini menjadi contoh representatif yang menunjukkan bagaimana presisi floating-point dan perbedaan compiler memengaruhi perilaku game secara nyata

Bug yang ditemukan saat proses porting Half-Life 2 ke VR

  • Pada 2013, saat Valve bereksperimen mem-porting Team Fortress 2 ke VR, Half-Life 2 dan Portal 1 yang memakai engine yang sama juga bisa dijalankan di VR
    • Portal 1 membuat pusing sampai nyaris tidak bisa dimainkan di VR karena distorsi sudut pandang
    • Half-Life 2 berjalan cukup baik, dan imersi khas VR meningkat pada adegan perahu, menumpuk kotak, serta pertarungan melawan manhack
  • Saat pengujian, seorang developer memainkan game dari awal sampai akhir di VR lalu menemukan kondisi tidak bisa lanjut pada adegan stasiun kereta di awal game

Analisis penyebab pintu tidak terbuka

  • Dalam skenario normal, penjaga (sebenarnya Barney) mengetuk pintu dan berkata “masuklah”, lalu ketika pemain masuk ke ruangan, permainan lanjut ke skrip berikutnya
  • Namun dalam situasi bug, pintu bergetar lalu terkunci sambil menutup rapat, penjaga terus menunjuk ke pintu, dan pemain pun terjebak
  • Bahkan setelah source code asli Half-Life 2 dibangun ulang, masalah yang sama tetap muncul, sehingga ini terlihat seperti bug yang muncul karena menelusuri waktu ke masa lalu

Akar masalah: perubahan cara operasi floating-point

  • Saat rilis pada 2004, Half-Life 2 memakai set instruksi matematika x87, dengan struktur yang mencampur presisi 32, 64, dan 80 bit
  • Pada build setelah 2013, set instruksi SSE dipakai sebagai default, sehingga presisi perhitungannya dibatasi jelas ke 32 atau 64 bit
  • Di kedua lingkungan, pintu dan ujung kaki penjaga sama-sama bertabrakan, tetapi hasilnya berbeda karena perbedaan sangat kecil dalam perhitungan physics engine
    • Di x87, saat terjadi tabrakan penjaga berputar sangat sedikit sehingga kakinya keluar dari jalur pintu dan pintu terbuka
    • Di SSE, besar rotasinya sedikit lebih kecil sehingga kaki masih menyentuh pintu, lalu pintu menutup lagi dan terkunci

Perbaikan dan penyelesaian

  • Setelah penyebabnya ditemukan, masalah diselesaikan dengan perbaikan sederhana: menggeser posisi penjaga sekitar 1 mm ke belakang
  • Proses debugging memakan cukup banyak waktu, termasuk harus mempelajari lagi cara memakai tool lama
  • Kasus ini menunjukkan bahwa perbedaan presisi dan perubahan pengaturan compiler dapat mengubah perilaku kode lama

Reaksi komunitas

  • Para developer banyak yang sepakat dengan komentar, “masalahnya selalu karena presisi floating-point
  • Sebagian menyebut contoh perubahan perhitungan tabrakan pada remake Sonic 1, 2, dan 3 sebagai kasus serupa
  • Bersamaan dengan pelajaran bahwa kodenya sama, tetapi compilernya berbeda, kasus ini dinilai sebagai pengingat akan sulitnya memelihara kode legacy
  • Developer lain juga mengaitkannya dengan alasan desain di Fallout 4 dan game lain agar NPC tidak melewati pintu karena masalah semacam ini
  • Secara umum, banyak yang menilai ini sebagai salah satu kisah bug paling menarik

Belum ada komentar.

Belum ada komentar.