Bagaimana cara seseorang menyimpan data konteks global dalam sistem komponen entitas?

10

Pertanyaan saya adalah ini:

Bagaimana seseorang menyimpan data konteks global, yaitu. informasi data dunia, waktu dunia saat ini, dll dalam sistem komponen entitas?

Saya berpikir untuk bekerja membangun game simulasi dunia terbuka gaya Dwarf Fortress di C ++. Saya telah membangun mesin game gaya komponen entitas hanya untuk bersenang-senang, dan saya saat ini sedang mencoba mencari tahu bagaimana saya akan bekerja di semua fitur yang saya inginkan. Selain permainan standar (rendering, fisika, data komponen khusus entitas, dll), saya juga ingin memiliki beberapa data kontekstual global yang dapat diakses oleh semua sistem yang relevan (yaitu, data dunia seperti tahun apa sekarang ini. , apakah pemanasan global sedang terjadi, Segala hal yang relevan dengan simulasi dunia). Saya awalnya berpikir untuk membuat komponen "dunia", tetapi ini sepertinya tidak ada gunanya dan sulit jika banyak sistem yang berbeda membutuhkan akses ke data "global" yang logis ini.

Apakah masuk akal untuk memiliki komponen "dunia" atau haruskah saya menyimpan data ini dengan cara lain?

Saya juga berpikir untuk membuat data ini menjadi global, sehingga memberikan akses ke sistem apa pun yang ingin menggunakannya; sepertinya pelanggaran prinsip entitas-komponen pada umumnya, dan mungkin berantakan karena alasan lain, tapi saya pikir itu mungkin benar-benar berhasil.

Hal lain yang saya pikirkan adalah menanamkan data konteks dunia yang relevan secara langsung ke dalam sistem itu sendiri. Sebagai contoh, jika saya memiliki AgeSystem"umur" semua entitas yang memiliki getsWeakerAsTimePasseskomponen atau yang lainnya, maka mungkin sistem ini dapat menyimpan data waktu yang relevan untuk dunia secara langsung sebagai data anggota yang akan digunakan untuk menghitung perjalanan waktu dan berapa banyak untuk menua dan melemahkan orang, dll. Pilihan ketiga ini adalah yang paling tidak saya sukai, tetapi sesuatu telah terjadi pada saya dalam brainstorming.

Adakah yang bisa menyarankan?

Awesomania
sumber
3
Dasar pemikiran untuk downvotes adalah sopan dan bermanfaat tidak hanya untuk OP, tetapi pengguna lain.
MichaelHouse
2
Anda telah membuat palu dan sekarang semuanya terlihat seperti paku. Saya memberi Anda izin untuk menggunakan lebih dari sekadar ECS untuk menyimpan dan memanipulasi data dalam program Anda karena tidak semuanya adalah paku.
Patrick Hughes

Jawaban:

10

Cara apa pun yang berhasil adalah cara yang berhasil. Kedengarannya sinis, tapi sungguh, gim Anda 1000x lebih penting daripada arsitektur Anda. Pilih pendekatan apa pun yang Anda suka dan temukan mudah digunakan.

Yang pernah saya lihat di game pengiriman nyata (menggunakan desain berbasis komponen, bukan ECS khusus; Saya belum pernah melihat ECS murni "di alam liar", meskipun banyak desain komponen memiliki elemen mirip ECS):

  • Lajang
  • "Konteks" objek diteruskan ke komponen / sistem yang berisi referensi ke semua sistem lain yang relevan
  • Pabrik komponen yang lulus sistem menangani komponen individu
  • Komponen yang menyimpan referensi ke sistem di root hierarki objek (hanya di beberapa game Unbal eksentrik)
  • Benda "Mesin" tunggal diteruskan ke sistem atau komponen yang menyimpan referensi ke semua sistem lain
  • Sistem pencarian sumber daya berbasis string (memungkinkan Anda dalam C ++ untuk melakukan sesuatu seperti handle<PhysicsSystem> = GetResource<PhysicsSystem>("/systems/physics"), ya, sungguh)
  • Tumpukan data global dan fungsi bebas gaya-C yang beroperasi padanya
  • Spasi / subruang dan video yang menyertainya

Mereka semua bekerja. Saya memiliki keluhan dengan beberapa pendekatan dan favorit yang jelas, tetapi mereka semua telah digunakan untuk mengirimkan game AAA. Kadang-kadang beberapa pendekatan dalam satu proyek (40-100 + tim insinyur cenderung membuat kode duplikat serampangan, sayangnya).

Sean Middleditch
sumber
2
Saya ingin tahu yang merupakan favorit Anda.
ashes999
Tautan yang saya berikan adalah ke slide saya dan video saya memberikan ceramah tentang topik tersebut, jika itu ada petunjuk. :)
Sean Middleditch
Ah, jadi favorit Anda adalah spasi / subruang saat itu. :)
ashes999
Jawaban yang bagus Saya pikir saya memiliki sesuatu yang berhasil, dan saya benar-benar pergi ke depan dan memasukkan konsep "spasi / subruang" ke dalam gameplan saya.
Awesomania