Teknik apa yang memungkinkan game berbasis web untuk memperbarui sumber daya pemain secara rutin?

8

Dulu ada game berbasis web bernama Utopia (dan saya yakin masih ada), ternyata per jam. Anda hanya mendapatkan emas / kayu baru atau apa-tidak setiap jam.

Beberapa game berbasis web yang lebih baru memiliki sumber daya yang bertambah dalam resolusi yang lebih halus, seperti per menit. Jadi katakanlah seorang pemain memiliki tingkat produksi makanan 5 per menit - pemain akan menambah jumlah makanannya setiap menit. Saya tidak yakin apakah bijaksana untuk secara konstan mengatur pekerjaan CRON untuk memperbarui database SQL, yang saya asumsikan apa yang mereka gunakan, karena ini berbasis web. Mungkin saya salah, setiap menit.

Teknik apa yang digunakan game berbasis web itu? Ditambahkan pada Edit: Dan bisakah database benar-benar dapat menangani beban?

Extrakun
sumber

Jawaban:

7

Menurut saya Anda hanya bisa menyimpan tingkat produksi, tingkat sumber daya dasar, dan cap waktu yang terakhir diperbarui. Kemudian, setiap kali Anda perlu mengetahui tingkat sumber daya yang sebenarnya, Anda bisa saja mengalikan tingkat produksi dengan waktu yang telah berlalu.

Setiap kali level sumber daya yang sebenarnya berubah - cukup perbarui level dasar. Setiap kali tingkat produksi berubah, perbarui level dasar ke level aktual, dan cap waktu ke waktu saat ini.

Dengan cara ini, alih-alih memperbarui setiap pemain (mungkin termasuk yang saat ini tidak masuk) setiap menit, Anda memperbarui hanya baris yang benar-benar aktif digunakan oleh pemain.

(Jika gim Anda "berdetak" sekali dalam satu menit, saya bayangkan "nomor giliran" semacam itu mungkin lebih baik daripada stempel waktu yang sebenarnya.)

Manfaat sampingan dari sistem ini adalah Anda dapat menggunakan logika yang sama dengan yang digunakan untuk memperbarui basis data, dan untuk memprediksi nilai tanpa mengubahnya - untuk hanya mengirim informasi yang diperlukan kepada klien (daripada memperbarui sekali per menit), dan untuk memprediksi nilai pada klien.

Andrew Russell
sumber
3
Ini sebenarnya membutuhkan beberapa pemahaman tentang matematika yang kompleks dalam beberapa kasus. Pertimbangkan untuk menghasilkan bunga atas uang - menambahkan bunga 1% per bulan tidak sama dengan menambahkan bunga 12% per tahun. Contoh kedua, jika peluang suatu peristiwa terjadi dalam satu menit tertentu adalah 10%, peluang itu terjadi setelah 10 menit bukanlah 100%. Menariknya, ini hanyalah demonstrasi yang sangat lambat dari masalah fisika yang dilihat orang di gim lain, dan metode yang sama dapat digunakan untuk mengatasinya, yaitu. gunakan stempel waktu yang tetap dan jalankan sesering yang diperlukan untuk 'mengejar ketinggalan'.
Kylotan
7
Kylotan, saya tidak akan kelas bunga majemuk dan peluang probabilitas ganda sebagai matematika yang kompleks. : P
Bebek Komunis
1
Itu poin yang valid. Tetapi saya berharap bahwa siapa pun yang mengimplementasikan produksi sumber daya non-linear dalam permainan mereka memahami cara kerjanya;)
Andrew Russell
2
Tetapi mereka tidak perlu, jika mereka menggunakan pembaruan berkala yang lama. Itulah keseluruhan masalah yang saya hadapi - menggunakan metode ini memperkenalkan potensi kesalahan baru yang sebelumnya tidak mungkin terjadi.
Kylotan
2
Tidak bisakah Anda menggunakan proses berulang untuk memastikan semuanya diterapkan dengan benar? Ketika seorang pemain masuk, itu "mengaktifkan" masing-masing sumber daya yang kemudian memicu dalam satu lingkaran sampai waktu tik berikutnya adalah setelah waktu sistem saat ini. Mungkin sedikit lebih banyak sumber daya intensif, tetapi harus menangani sebagian besar sistem non-linear.
Lunin
5

Database SQL modern yang biasa digunakan (MySQL, Postgres, Oracle, MSSQL, dll) memungkinkan Anda untuk menjadwalkan prosedur tersimpan untuk dijalankan dengan interval waktu sewenang-wenang. Ini adalah metode yang sangat ringan untuk menjalankan pembaruan seperti ini dan menghilangkan kebutuhan untuk memanggil skrip atau program eksternal untuk melakukannya untuk Anda.

Ini juga memungkinkan basis data untuk mengoptimalkan kueri yang Anda jalankan hanya sekali, alih-alih melakukannya setiap kali skrip eksternal memanggilnya, sehingga sangat berguna dari sudut pandang kinerja. Tentu saja ini hanya berlaku jika pembaruan Anda cukup sepele untuk diprogram dalam bahasa scripting database Anda sendiri. Pembaruan sumber daya, logout interval waktu otomatis, pembersihan catatan dan sejenisnya adalah kandidat yang sangat baik untuk prosedur tersimpan yang dijadwalkan ini.

Kemungkinan besar beban yang dialami basis data Anda berasal 99,9% dari beban halaman, pembaruan mesin game, dan sejenisnya, karena game populer dapat dengan mudah memiliki ratusan ribu kueri per detik. Dibandingkan dengan beban yang muncul dari menjalankan beberapa kueri (meskipun yang menyentuh sebagian besar tabel) satu atau dua menit sekali, beban seharusnya tidak menjadi masalah. Yaitu, kecuali jika Anda memperbarui nilai yang diindeks oleh database. Anda harus menghindari memperbarui kolom yang diindeks di semua biaya jika Anda khawatir tentang kinerja.

Fuu
sumber
2

Mengenai pembaruan:

Beberapa menggunakan pekerjaan CRON yang sering mengenai halaman PHP tertentu.

Beberapa menggunakan pekerjaan CRON, kali ini menjalankan proses tertentu.

Pendekatan lain adalah dengan melakukan pembaruan 'tepat waktu' - kapan pun halaman dimuat, jalankan melalui pembaruan yang tertunda dan lakukan pada saat itu. Ini umumnya yang harus Anda lakukan jika Anda tidak dapat menjalankan pekerjaan CRON atau proses yang berjalan lama.

Akhirnya, yang lain menjalankan seluruh aplikasi web sebagai satu proses, sehingga mereka dapat memperbarui kapan pun mereka melihatnya.

Sistem terakhir adalah yang terbaik jika Anda memiliki opsi yang tersedia karena Anda dapat menyimpan data dalam memori. Memperbarui beberapa ribu pemain sekali per menit adalah sepele jika Anda hanya mengubah data dalam RAM daripada harus menulis ke database SQL tradisional.

Tetapi jika Anda tidak memiliki kemewahan itu, Anda dapat menggunakan semacam caching. Sesuatu seperti memcached mungkin menjadi salah satu opsi (tergantung pada hosting Anda) yang merupakan titik setengah jalan antara memori dan database. Anda dapat menyimpan nilai sementara di memcache dan hanya menyimpannya ke DB jika benar-benar diperlukan.

Antara memcache dan database SQL tradisional ada opsi lain, misalnya. berbagai kunci / nilai toko atau toko dokumen: hal-hal seperti MongoDB , CouchDB , Amazon atau Google persembahan, dll ... yaitu. semua sistem di bawah payung istilah NoSQL . Ini biasanya tidak memberi Anda kekuatan query umum atau selalu semua jaminan keamanan yang sama dari database tradisional tetapi seringkali jauh lebih cepat dalam operasi. (Yang tidak begitu mengejutkan, karena mereka melakukan lebih sedikit untukmu.)

Tapi ini semua dengan asumsi database normal tidak dapat menangani beban. Bahkan, dalam banyak kasus mungkin bisa. Jika saya harus mengeluarkan 10.000 panggilan UPDATE per menit untuk meningkatkan level sumber daya, itu tidak terlalu scalable setelah Anda mulai menambahkan segalanya di atas. Tetapi jika Anda mengubahnya untuk memperbarui sumber daya untuk semua orang dengan 1 panggilan SQL, tiba-tiba segalanya terlihat jauh lebih positif. Jadi jangan melebih-lebihkan seberapa mahal fitur tertentu, karena sering dapat diimplementasikan dalam bentuk yang lebih efisien.

Kylotan
sumber
0

Saya mendukung KISS : "Keep It Simple, Stupid!"

Saya tidak melihat alasan mengapa pekerjaan cron tidak bekerja, dan kelebihannya adalah bahwa opsi web hosting murah seringkali tidak membiarkan Anda langsung menjalankan perintah, tetapi mereka mengizinkan Anda untuk menjalankan perintah cron. Jadi tidak perlu server khusus yang mahal.

Anda juga dapat melakukan kode pembaruan Anda dalam PHP atau bahasa preferensi Anda, dengan memiliki perintah cron atau menggunakan browser teks. Instruksi di Mengkonfigurasi pekerjaan cron memiliki beberapa contoh perintah yang dapat Anda gunakan untuk melakukan ping halaman Anda sendiri pada suatu interval.wget --spider http://yoursite.com/secretphppage.phplynx

Ricket
sumber
Saya kira saya lebih peduli tentang pekerjaan CRON yang berjalan setiap menit memperbarui data beberapa ratus pengguna sekaligus.
Extrakun
1
Pembaruan ke beberapa ratus dataset sekali dalam satu menit bukanlah masalah bagi Database modern. Saya tidak tahu seperti apa bentuk kueri Anda, tetapi satu panggilan 'PEMBARUAN' masih akan berkinerja baik bahkan dengan ribuan baris yang terpengaruh.
bummzack
Dan di dunia apa pekerjaan cron dianggap "sederhana"? Jika Anda bukan sysadmin, Anda mungkin akan marah hanya dengan melihat file konfigurasinya ...
o0 '.
Dunia hosting, di mana mereka tidak (biasanya) memberi Anda akses SSH sehingga mereka perlu menyediakan antarmuka yang mudah ke Cron. Hosting saya (Lunarpages) menggunakan Cpanel, dan saya merasa cukup mudah digunakan: img822.imageshack.us/img822/7022/easycron.png
Ricket
0

Saya ingat pernah melihat kode beberapa klon Planetarion. Semua PHP, tetapi kode ticker dalam C mentah - dengan C MySQL binding. Karena model data sangat sederhana, pembaruan terjadi sangat cepat.

Ariejan
sumber