Apakah menggunakan skrip Lua untuk mendefinisikan logika game untuk server MMO akan jauh lebih lambat daripada dikompilasi dalam C ++?

10

Saya menggunakan sistem entitas untuk server MMO saya dan saya berpikir tentang mendefinisikan perilaku "tindakan" menggunakan skrip Lua. Server ditulis dalam C ++. Saya tidak terlalu terbiasa dengan kecepatan / penggunaan memori Lua di C ++ tapi saya telah menggunakannya untuk skrip GUI klien. Apakah menggunakan Lua untuk mendefinisikan logika permainan di sisi server akan memangkas kinerja banyak?

BarakatX2
sumber

Jawaban:

20

TL; DR: Lua memang memiliki overhead, tetapi jika digunakan dengan benar itu dapat diabaikan dan mudah dimitigasi. Jangan menggunakannya untuk operasi matematika berat atau mengubah geometri. Anda mungkin tidak akan melihat masalah kinerja sama sekali menggunakannya untuk skrip GUI.

Saya telah melakukan beberapa tolok ukur dasar mengenai kinerja Lua sebagai bahasa scripting game, dan itu sangat cepat. Menggunakan tolua ++ untuk mengikat LuaJIT ke mesin gim saya, saya menelurkan 2.000 aktor, masing-masing aktor dikendalikan oleh skrip Lua yang disebut setiap loop game (dengan argumen time-delta). Setengah dari aktor memiliki naskah yang berkelompok dan setengah lainnya melakukan semacam jalan acak (dan dihindari oleh kawanan).

Mematikan komponen rendering memberi saya sedikit lebih dari 400 kutu per detik pada Opteron 170 saya (2x2.0GHz, meskipun mesin saya berulir tunggal pada saat itu). Saya membayangkan saya bisa memeras lebih dari itu jika saya menggali dan mengoptimalkan, mungkin memindahkan beberapa pekerjaan berat kembali ke C ++. Memperbarui 2.000 aktor 400 kali per detik masih cukup mengesankan, dan jauh melebihi harapan saya saat itu.

Saya sekarang menggunakan Lua di semua proyek saya, dan itu sebenarnya merupakan bagian yang cukup besar dari kode permainan yang sebenarnya (AI, tata letak / logika GUI, Acara / Pesan). Membuat game JAUH lebih menyenangkan ketika Anda dapat dengan cepat mengubah sesuatu dan mengujinya tanpa harus keluar, mengkompilasi ulang, dan menginisialisasi ulang. Saya telah mengalami beberapa masalah kinerja dari waktu ke waktu, tetapi itu mudah dipecahkan dengan menerapkan kembali kode yang menyinggung di C ++ (dan kemudian memanggilnya dari Lua).

Sementara sedikit di luar topik, server EVE Online ditulis hampir sepenuhnya dalam Stackless Python (saya percaya mereka menunda sebagian besar operasi matematika mereka ke C ++ lib), yang jauh lebih berat daripada Lua, dan, berdasarkan penelitian pribadi saya sendiri dan beberapa tersedia tolok ukur, jauh lebih sedikit performanya daripada LuaJIT. Mereka berhasil menangani 30k + pemain bersamaan tanpa terlalu banyak masalah. Memang, mereka memiliki satu ton perangkat keras mahal yang menjalankan semua itu, tapi saya percaya sebagian besar biayanya adalah dalam kelompok basis data mereka ...

Permintaan maaf untuk dinding teks.

Codewaffle
sumber
1
Jawaban bagus! Tidak perlu minta maaf untuk jawaban yang sangat terperinci. Saya pikir saya akan meluangkan waktu untuk mengembangkan "aksi" komponen yang didefinisikan dalam Lua dan melakukan benchmarking. Terima kasih!
BarakatX2
2
Hit terbesar dalam sistem semacam ini biasanya mem-parsing skrip, jadi pastikan untuk memuatnya saat startup.
coderanger
Ini poin yang bagus. Saya benar-benar mengkompilasi Lua saya menjadi bytecode sebelum dikemas untuk dirilis, yang dapat mengurangi waktu pemuatan lebih banyak, meskipun saya belum melakukan pengukuran apa pun.
Codewaffle
Saya cenderung tidak setuju. Sedangkan dalam logika permainan game normal adalah bagian kecil dari waktu eksekusi (rendering adalah binatang buas), dalam server MMO itu adalah bagian yang jauh lebih besar, sehingga dampaknya akan jauh lebih besar. Saya memiliki pengalaman dengan LUAJit dan C ++ dan sementara LUAJit secara substansial lebih cepat dari LUA itu masih jauh lebih lambat daripada C ++ (dengan asumsi Anda kode C ++ dengan benar). Saya akui alur kerja dengan LUAJit luar biasa tetapi dengan cepat ia berhasil. Tidak peduli bagaimana Anda memelintirnya, variabel dalam tabel dengan pencarian string, tipe dinamis dan pengumpulan sampah ada harganya. LUAJit lebih lambat dari .NET, kata nuff
Kaj
2

Jawaban singkat: Ya, ya itu akan.

Jawaban panjang: Tergantung pada seberapa banyak logika game, seberapa banyak dijalankan, dan seberapa kompleksnya, dan jika Anda perlu menjalankannya untuk setiap pemain. Jika sangat sederhana dan tidak banyak diulang, Anda mungkin baik-baik saja dengan itu. Tetapi untuk sebagian besar kasus menggunakan LUA, bukan C ++ akan memberikan Anda kinerja yang jauh lebih rendah dan skala akan buruk, dengan asumsi tentu saja bahwa kode dirancang dengan baik dan dioptimalkan.

SerangHobo
sumber