Bagaimana Mesin menyukai proses Sumber entitas?


9

Pada mesin Sumber (dan itu pendahulunya, goldsrc, gempa) objek permainan dibagi dalam dua jenis, dunia dan entitas. Dunia adalah geometri peta dan entitasnya adalah pemain, partikel, suara, skor, dll. (Untuk Mesin Sumber).

Setiap entitas memiliki fungsi berpikir , yang melakukan semua logika untuk entitas itu.

Jadi, jika segala sesuatu yang perlu diproses berasal dari kelas dasar dengan fungsi think, mesin game dapat menyimpan semuanya pada daftar dan, pada setiap frame, lewati dan panggil fungsi itu.

Pada pandangan pertama, ide ini masuk akal, tetapi dapat mengambil terlalu banyak sumber daya, jika game memiliki banyak entitas ..

Jadi, bagaimana cara mesin seperti Source merawat (memproses, memperbarui, menggambar, dll) dari objek game?


2
Mengapa penting bagaimana <some commercial engine>?
Bebek Komunis

8
@ Bebek Komunis, saya pikir pertanyaan sebenarnya di sini adalah bagaimana mesin yang sukses melakukannya sehingga saya bisa belajar dari mereka?
subb

Jawaban:


5

Yah, tidak ada cara lain untuk melakukannya - Anda harus mengulang dan memanggil think()setiap entitas setidaknya sekali setiap beberapa frame.

Anda dapat menempatkan entitas pada utasnya sendiri, tetapi kemudian Anda memiliki mimpi buruk sinkronisasi-negara secara keseluruhan, yang jelas tidak sepadan.

Pada pandangan pertama, ide ini masuk akal, tetapi dapat mengambil terlalu banyak sumber daya, jika game memiliki banyak entitas ..

Itulah sebabnya mesin Source membatasi jumlah entitas yang dapat ada pada satu waktu : 4096 entitas, yang hanya setengahnya (2048) yang dapat dihubungkan jaringan. Lewati salah satu dari batasan ini, dan gim akan macet.

Itu juga mengapa, saat membuat peta, mereka menyarankan Anda tidak menggunakan lebih dari sekitar 800 entitas.


Bukankah 2 ^ 12 panggilan fungsi masih merupakan angka BESAR untuk setiap frame?
JulioC

@ Júlio: Ya, pada 60 fps itu panggilan fungsi 246k per detik - itu banyak, tapi pasti bisa dilakukan pada perangkat keras saat ini. Ingat, bagaimanapun, bahwa ini adalah maksimum absolut yang diizinkan sebelum mesin Source akan mogok - biasanya, ada jauh lebih sedikit entitas pada peta.
BlueRaja - Danny Pflughoeft

5
Entitas memiliki waktu berpikir selanjutnya, fungsi think tidak disebut everyframe dan tidak untuk semua entitas. Saya ingat bahwa untuk gempa 2 waktu berpikir minimum adalah 0,1 (100 msec), hanya 10fps untuk pemrosesan entitas.
bcsanches

"Kamu bisa meletakkan entitas di utas mereka sendiri, tetapi kemudian kamu memiliki mimpi buruk sinkronisasi-negara keseluruhan, yang jelas tidak sepadan." Periksa slide-slide Killzone 4 ini jika menurut Anda itu tidak layak: de.slideshare.net/jrouwe/…
Tara

3

Langkah-langkah ini Anda sebutkan kemungkinan besar dilakukan di mesin yang terpisah. Hanya saja mesin game sederhana biasanya memilikinya dalam satu pass. Urutan Anda

for each object
    do physics
    do game logic
    draw

menjadi

call physics subsystem
call game logic subsystem
call drawing subsystem

Mesin Fisika menangani posisi dan ukuran.

Game Logic Engine berusaha menafsirkan apa yang diubah Physics Engine (ia dapat menghalangi beberapa titik arah ...), tujuan apa yang dimiliki karakter dan perilaku apa yang harus mereka lakukan , ia menjalankan skrip terjadwal ( fungsi berpikir ini ).

Drawing Engine menggambar objek apa yang terlihat, dan dia tahu objek apa yang terlihat karena mesin Quake curang di sini (lihat bagian Draw).

Saran saya kepada Anda adalah untuk lebih mempelajari bagaimana simulasi dilakukan daripada mesin game itu. Ada budaya pop besar terkait pengembangan game dan mesin game dibuat dalam bahasa imperatif (karena tradisi & kecepatan); jadi itu lebih mencerahkan bagi saya untuk mendapatkan buku teks yang bagus (bukan teori) dan MAKA melihat mesin (latihan) daripada melihat mesin dan teka-teki selama berjam-jam bagaimana mereka melakukannya.

Fisika

Seluruh gagasan tentang iterasi semua entitas dan melakukan {think, draw} mungkin akan menimbulkan masalah. Akan ada konflik dan sebagainya. Saya percaya Valve punya Havok dan saya kira Havok menangani fisika yang cukup benar.

Berpikir

Fungsi pikir dijalankan ketika waktu dalam permainan sama dengan waktu di pikiran berikutnya . Ini bekerja seperti ini di mesin Quake, dan mesin Quake adalah dasar untuk mesin Half Life. Ini TIDAK dijalankan setiap saat.

Secara internal itu harus berupa iterasi sederhana melalui daftar entitas dan memeriksa apakah waktu telah berlalu untuk memanggil fungsi think. Kompleksitas waktu adalah O (N), di mana N adalah sejumlah entitas.

Jika ada jumlah entitas yang sangat besar, Anda harus mengukur seberapa banyak akan meningkatkan fps. Perhatikan, bahwa karena hukum Amdahl, percepatan ini berpotensi tidak terlihat. Maksud saya, Anda hanya mengulang semua item dan mengurangi & memeriksa satu nomor.

Saya akan mempercepatnya dengan menyortir entitas dengan nextthink (membuat daftar pointer ke entitas dan mengurutkannya setiap kali; bukan array entitas, karena entitas dapat mengubah nextthink mereka kapan saja, jadi rearanging mereka dalam array membutuhkan O (N) alih-alih O ( 1) dalam daftar).

Anda juga harus melihat penjadwal O (1) di Linux .

Seri

Mesin menggambar apa yang kira-kira terlihat dari area di mana kamera. Level permainan adalah partisi menjadi pohon, dan area adalah daun dari pohon itu. Saya tidak akan mengganggu Anda dengan detail tentang hal itu ... Jadi, jika suatu entitas terlihat, ia dimasukkan ke dalam serangkaian entitas yang terlihat dan mereka ditarik.

Mereka menyimpan area apa yang berpotensi terlihat. Ini disebut "set potensial yang terlihat", singkatnya PVS . Ada visualisasi PVS , kapsul hijau adalah pemain dan di sekitarnya diberikan apa yang berisi PVS-nya.


2

Jadi, jika segala sesuatu yang perlu diproses berasal dari kelas dasar dengan fungsi think, mesin game dapat menyimpan semuanya pada daftar dan, pada setiap frame, lewati dan panggil fungsi itu.

Pada pandangan pertama, ide ini masuk akal, tetapi dapat mengambil terlalu banyak sumber daya, jika game memiliki banyak entitas ..

Sebenarnya meletakkan segala sesuatu dalam satu daftar besar biasanya kurang dari yang diinginkan; jika Anda mengelompokkan entitas dalam daftar berdasarkan, misalnya, jenisnya, Anda bisa mendistribusikan pemrosesan lebih dari beberapa utas. Misalnya, jika Anda tahu semua entitas tipe Foo tidak pernah berinteraksi dengan entitas lain selama fase simulasi, Anda dapat melepasnya sepenuhnya. Jika mereka tersebar tak tentu di seluruh daftar besar tunggal ini akan jauh lebih sulit untuk dilakukan.

Anda bahkan tidak perlu menurunkan segala sesuatu dari kelas dasar yang sama pada saat itu; Sumber berjalan berlebihan dengan penyalahgunaan warisan untuk apa yang bisa diimplementasikan sebagai data dalam hal itu.

Anda tentu saja akan selalu memiliki batas atas pada jumlah entitas yang dapat Anda proses per frame, bahkan jika Anda mulai melepas pekerjaan ke core lainnya. Tidak ada jalan lain, Anda hanya perlu memiliki gagasan tentang apa batas itu dalam implementasi Anda dan mengambil langkah-langkah untuk mengatasinya (pemusnahan yang tepat dari fase pemrosesan pada objek yang tidak membutuhkannya, menghindari granularitas yang berlebihan dalam objek, dan lain-lain. sebagainya).


1

Apa yang harus Anda perhitungkan dan mengikuti alur pemikiran dari jawaban sebelumnya adalah bahwa kinerja Anda juga akan berada pada kapan dan bagaimana Anda menyebut fungsi berpikir ini.

Melihat tautan yang Anda pasang di mesin sumber, Anda juga dapat membaca bahwa Anda dapat mengatur waktu berpikir dan konteks pemikiran yang berbeda untuk masing-masing entitas Anda, di samping batas keras yang sudah ditunjukkan seseorang, ini akan menjadi kunci untuk mencapai kinerja yang lebih besar dengan jumlah entitas yang lebih tinggi, baik dengan membuat pembaruan bertahap yang menyebarkan pemrosesan kinerja lapar melalui beberapa frame eksekusi, atau dengan memilah pemrosesan yang tidak diperlukan tergantung pada konteks saat ini (yaitu entitas yang terlalu jauh atau di luar persepsi pemain tidak perlu tingkat yang sama "berpikir detail" sebagai karakter yang dekat pemain hanya tidak akan melihat karakter 2 mil jauhnya memilih hidungnya).

Dan ada tingkat pengoptimalan lain yang lebih spesifik tergantung pada logika dan situasi permainan Anda.


"Seorang pemain tidak akan melihat karakter 2 mil jauhnya memilih hidungnya" Haha! Tapi kenapa tidak ada yang menunjukkan bahwa menggunakan fungsi virtual sangat lambat?
Tara
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.