Mengapa manajemen memori khusus diperlukan untuk aset?


10

Hampir semua sumber daya yang berkaitan dengan pemrograman game, terutama game dunia terbuka 3D, berbicara tentang bagaimana Anda harus terus-menerus menurunkan dan memuat ulang aset ke dan dari disk, memori sistem, dan memori video. Saya dapat memahami ini pada konsol, karena mereka memiliki skema manajemen memori yang sangat sederhana yang tidak dapat menangani potensi overflow.

Namun, pada PC, situasinya sangat berbeda. Ada memori virtual yang disediakan oleh OS untuk memori sistem dan driver grafis menangani bolak-balik dari CPU ke GPU. Jadi mengapa itu tidak cukup untuk memuat semuanya sekaligus dan hanya harus berurusan dengan pengambilan awal dan mungkin memastikan bahwa tidak ada pemblokiran saat aset yang diperlukan sedang ditukar?


Ini bukan untuk mengatakan bahwa semuanya dialokasikan secara naif menggunakan sesuatu seperti malloc. Semuanya akan disimpan berdekatan dan cache-koheren. Ini bisa dibilang lebih mudah untuk membuat akses memori Anda efisien jika Anda tidak perlu khawatir paging masuk dan keluar secara manual ...


MEMPERBARUI:

Setelah membaca sedikit ke transfer buffer asinkron , saya mendapatkan ide bahwa cara driver grafis dapat secara otomatis halaman memori masuk dan keluar adalah suboptimal. Apakah ini juga berlaku untuk sumber daya CPU; yaitu, apakah lebih baik untuk selalu mengelola secara manual ketika sumber daya yang diberikan akan dimuat dan dibongkar bahkan di hadapan memori virtual?


1
Anda mengasumsikan bahwa konten aset disimpan dalam memori sistem. Sebagian besar data aset Anda akan disimpan dalam memori GPU, yang jauh lebih terbatas.
Permainan dadoo

Dari membaca jawabannya di sini saya mendapatkan gagasan bahwa driver OpenGL secara otomatis menyimpan semua buffer / tekstur pada CPU juga. Namun, saya dapat melihat mengapa mungkin berguna untuk menentukan transfer ini secara manual untuk memanfaatkan unggahan asinkron .
jmegaffin

Apakah Anda yakin ini relevan dengan proyek game Anda? Saya tidak yakin saya melihat tantangan teknis, hanya solusinya. Jika Anda tidak menghadapi tantangan teknis, sulit untuk menyesuaikan solusi atau memahaminya.
AturSams

Saya bertanya-tanya mengapa mesin permainan menerapkan sistem caching aset kompleks ketika mengoperasikan sistem / driver sudah memiliki sistem memori virtual yang tersedia. Ini relevan bagi saya karena saya sedang menulis permainan dunia terbuka di mana informasi ini sangat penting.
jmegaffin

Apakah gim Anda menderita masalah kinerja dan alat profiling menunjukkan itu karena akses memori? Masalah dengan game yang mengandung level terbuka adalah bahwa dalam istilah teknis, ini berarti banyak data. Semakin banyak kontrol yang Anda miliki pada data itu, semakin baik kinerjanya. Mengapa tidak menerapkan sistem yang paling efisien untuk mengelola data? Pengembangan game sangat kompetitif dan ketika Anda memiliki uang untuk para ahli, Anda tidak akan meninggalkan kebutuhan bisnis yang terlewat, ingin memeras lebih detail dan fps yang lebih tinggi.
AturSams

Jawaban:


16

Game-game open-world modern tidak sesuai dengan memori. Perlu diingat bahwa sebagian besar game masih 32-bit karena jumlah gamer dengan OS 32-bit, dan proses 32-bit paling baik hanya dapat memiliki 4GB memori yang ditujukan pada satu waktu (tidak tergantung pada memori virtual) tetapi secara realistis adalah terbatas pada 2-3 GB. Aduk dalam fragmentasi dan jumlah sebenarnya dari objek yang dapat digunakan yang dapat Anda miliki dalam memori pada suatu waktu sedikit lebih kecil dari total data yang Anda butuhkan untuk lingkungan yang besar. Bahkan pada OS 64-bit, Anda sering harus menargetkan mesin dengan spesifikasi rendah dengan hanya memori 4GB untuk memastikan kompatibilitas pengguna akhir yang maksimal. Jangan lupa perangkat seluler, perangkat keras "di bawah daya" seperti WiiU, dll. Pengembang harus menargetkan lebih banyak daripada rig PC gaming mewah besar.

Memori virtual bukan solusi, pertama karena tidak meniadakan batasan ruang alamat dan juga karena tidak optimal. OS dapat menampilkan hal-hal pada waktu yang tidak tepat atau dengan cara yang tidak tepat. Ini adalah masalah yang ditangani oleh OS ketika hibernasi pertama kali muncul; paging proses ke disk dan kemudian paging kembali secara signifikan lebih lambat dalam beberapa kasus daripada memiliki aplikasi secara eksplisit mengalirkan kembali sumber daya. Anda masih bisa melihat masalah hari ini ketika sistem kehabisan memori, halaman paged keluar untuk disk, dan sistem menjadi tidak responsif menjadi hal penting yang diperlukan untuk menjalankan WM / explorer.exe Anda. Memori virtual adalah solusi yang dirancang untuk masalah beberapa dekade lalu di mana sistem memiliki sangat sedikit RAM dan kesenjangan antara memori dan kecepatan disk jauh lebih kecil. Bahkan hari ini' SSD tercepat adalah sebagian kecil dari kecepatan RAM murah / lambat, dan mencoba untuk berpura-pura bahwa Anda dapat menggunakan disk sebagai RAM virtual bukan ide terbaik lagi. Ini adalah zaman di mana beberapa orang melakukan yang sebaliknya dan memuat sistem file ke dalam disk RAM; kendala yang menyebabkan penciptaan memori virtual tidak berlaku lagi.

Bahkan selain dari masalah disk, manajemen sumber daya kustom masih merupakan bagian besar dari pengembangan game. Dari men-debug hooks hingga masalah fragmentasi hingga streaming cerdas dari sumber daya yang kompleks, sekadar berpura-pura seluruh dunia adalah sekotak bit yang tak terhingga jumlahnya tidak realistis.


Terima kasih atas jawaban terinci. Meskipun saya masih mencari beberapa informasi tentang cara driver GPU menangani memori virtual (antara VRAM dan sistem RAM).
jmegaffin

@ Boral: masalah yang sama. Cukup ganti "RAM" dengan "VRAM" dan "disk" dengan "memori CPU
Sean Middleditch

@SeanMiddleditch +1 Jawaban yang bagus, "Ini adalah zaman di mana beberapa orang melakukan yang sebaliknya dan memuat sistem file ke dalam disk RAM" maksud Anda file memori dipetakan? Juga apa yang saya mengerti dari jawaban Anda adalah bahwa pengalokasi memori khusus mencegah OS dari paging-out memori, bukankah ini kasus memori akan paging sejauh Anda meminta memori dari kernel menggunakan brk () misalnya, bagaimana paging pada PC persis dicegah menggunakan pengalokasi memori khusus?
concept3d

1
@ concept3d: bukan pemetaan memori, tetapi disk RAM literal. Anda dapat membuat drive yang didukung oleh memori dan bukan disk. Manajer memori khusus tidak mencegah paging (beberapa aplikasi lain mungkin menggunakan semua memori). Mengelola sumber daya secara cerdas (pada layer manajemen objek / sumber daya) berarti Anda membebaskan memori untuk objek yang tidak Anda perlukan lagi. Pikirkan cache disk OS yang disimpannya dalam memori
Sean Middleditch

6

Untuk gim 32-bit, karena gim kebanyakan karena berbagai alasan, bahkan gim yang datang dengan satu DVD satu sisi (4.3GB) sudah memiliki lebih banyak konten yang dapat dipasang ke ruang alamat 32-bit. Dan itu dengan asumsi konten tidak dikompresi pada disk, dan sangat optimal, memuat semuanya sekaligus ke pendekatan ruang alamat yang berdekatan. Banyak game sekarang hadir dalam beberapa DVD, dengan mudah melebihi 10GB konten. Dalam pengalaman saya di PC, setelah ruang alamat Anda mendekati alokasi 2GB akan mulai gagal, dan itu menjadi batas yang sulit, terlepas dari berapa banyak memori fisik yang dimiliki pengguna.

Jika Anda melakukan lompatan ke 64-bit, dengan asumsi mesin Anda mendukungnya, batas keras itu hilang, hanya akan digantikan oleh batas lunak yang efektif - segera setelah penukaran memori virtual mulai terjadi, kinerja permainan akan turun tidak bisa diterima. Jika proses utama harus menunggu memori dipetakan kembali, frame-rate akan gagap dan kesalahan. Memori virtual mungkin membuatnya transparan, tetapi tidak membuatnya berkinerja baik. Secara fisik membutuhkan waktu untuk mendapatkan memori itu kembali dari disk, dan saat Anda menunggu, gim Anda macet. Meskipun mungkin untuk menyelesaikannya (dengan pra-pengambilan latar belakang halaman memori yang Anda tahu akan segera Anda perlukan), ini adalah proses yang sulit dan tidak dapat diandalkan, dan masih akan memiliki implikasi kinerja.

Algoritma OS untuk memutuskan halaman mana yang akan ditukar dengan disk tidak memiliki pengetahuan tentang permainan Anda dan apa yang kemungkinan dibutuhkan selanjutnya. Selain itu, OS masih harus mendukung aplikasi lain yang berjalan bersamaan dengan game Anda, serta OS itu sendiri. Harus berhenti sementara halaman dikembalikan dari disk adalah kinerja besar, dan tidak masalah apakah itu permainan Anda, aplikasi lain atau OS yang menyebabkannya, kinerja permainan akan menderita secara besar-besaran.

Jadi terlepas dari apakah batas memorinya lunak atau keras, memori masih terbatas. Tetapi bahkan jika Anda bisa memuat semuanya sekaligus, tanpa mencapai batas kinerja, masih ada alasan mengapa Anda tidak ingin:

  1. Gim Anda membutuhkan waktu yang jauh lebih lama untuk dimuat dan mencapai status interaktif daripada yang diperlukan, karena gim ini hanya memuat semuanya di awal dan membuatnya tetap ada. Anda dapat memuat sekitar 150MB / detik dari hard disk, dan bahkan drive DVD tercepat (24x) dimuat pada 33MB / detik. Itu berarti contoh konten DVD 4.3GB akan memakan waktu setidaknya 30 detik untuk memuat dari HDD, dan lebih dari 133 detik untuk memuat dari DVD. Itu adalah waktu muat yang terlalu lama.

  2. Game Anda membutuhkan lebih banyak memori daripada yang dibenarkan. Jika hanya 10% dari konten terlihat pada satu waktu, menahan penduduk lainnya hanya sia-sia, dan mencegah pengguna menggunakan memori itu untuk hal lain. Pengguna pada umumnya tidak memaafkan game yang membutuhkan memori dalam jumlah besar untuk berjalan dengan baik.

Streaming aset dari disk secara dinamis, baik di latar belakang atau secara serentak selama layar pemuatan, memungkinkan Anda menjadi jauh lebih efisien dalam penggunaan memori Anda, dengan upaya yang dapat diabaikan dan hanya sedikit kerugian bagi pengguna. Tetapi ini adalah pengoptimalan, dan seperti pengoptimalan lainnya, pengulangannya semakin berkurang saat Anda mencoba menerapkannya. Pada titik tertentu, peningkatan jejak memori untuk menjaga sesuatu tetap diimbangi oleh keuntungan yang diperoleh dari memilikinya di sana tanpa perlu memuat. Tetapi sampai titik itu tercapai, lebih baik memuat hanya apa yang Anda butuhkan, saat Anda membutuhkannya.


1

Hanya berbicara secara sangat umum dan sederhana, dan tanpa mempertimbangkan detail implementasi memori virtual, pengembang selalu memiliki pengetahuan dalam tinjauan ke masa depan yang kurang dimiliki oleh implementasi VM.

Pengembang selalu dapat mengatakan, "Saya tidak perlu memuat file audio ini sekarang. Musik di dalamnya hanya digunakan untuk game di layar." Dan segera setelah game over screen, pengembang dapat berkata, "Saya tidak membutuhkan klip audio ini lagi dalam memori fisik. Ini hanya digunakan untuk game ini over screen."

OS tidak memiliki pandangan ke depan seperti itu. Mungkin bisa mengetahui, banyak kesalahan halaman kemudian, bahwa beberapa klip audio tidak lagi diperlukan dalam memori fisik karena belum diakses dalam waktu yang baik. Tetapi mengubah pandangan jauh ke belakang menjadi banyak kesalahan halaman, dan banyak kesalahan halaman diterjemahkan menjadi masalah dalam frame rate dalam perangkat lunak yang sama pentingnya dengan waktu seperti video game. Ada pandangan ke depan dari pengembang sangat membantu jika Anda ingin menghindari cegukan tersebut.

Dan itu berlaku secara konseptual terlepas dari perangkat keras dan perangkat lunak. Anggap paging dalam memori itu mahal, maka pandangan ke depan pengembang akan selalu membantu dalam mengurangi biaya itu.

Berbicara lebih luas lagi, ada siklus yang tidak pernah berakhir antara perancang perangkat keras, perancang kompiler, perancang OS / driver, dan pengembang aplikasi. Pengembang perangkat keras / kompiler / OS / driver sering mencoba menerapkan optimasi untuk mempercepat aplikasi rata-rata Anda berdasarkan pola akses memori yang biasa, dan mungkin kadang-kadang dengan harapan seperti, "Orang-orang seharusnya hanya dapat menulis kode sesuka mereka dan harus cepat. "Tetapi jika ada pemikiran tentang jenis yang terjadi, biasanya gagal untuk bidang yang kritis terhadap kinerja, karena kemudian pengembang yang kritis terhadap kinerja mulai mempelajari detail rumit kompiler, perangkat keras, OS, driver, dll. Dan mulai menulis kode khusus dirancang untuk mengeksploitasi sebanyak mungkin untuk menulis kode tercepat yang mungkin (seperti prefetch, pemisahan bidang panas / dingin, SoA, dll. untuk kode yang ramah-cache). Dan itu seperti permainan yang tidak pernah berakhir. Hal-hal ini tidak pernah diperlakukan sebagai kotak hitam di bidang yang kritis terhadap kinerja, karena pengembang bersaing untuk mendapatkan kinerja.

Secara pribadi saya agak berharap memori virtual tidak ada karena ia menambahkan lapisan tambahan kinerja yang tidak dapat diprediksi dengan cara-cara yang cenderung terlalu ekstrem dan menimbulkan cara, terlalu banyak penalti kinerja ketika segala sesuatunya berjalan benar-benar ke selatan ke titik ketidakbergunaan.. Saya kadang-kadang mengalami kasus di mana saya menggunakan beberapa aplikasi di mana saya mengetik satu atau dua digit tambahan secara tidak sengaja ketika diminum ke dalam beberapa bidang input yang kemudian menyebabkannya kehabisan memori fisik begitu cepat dengan cara yang membuat OS merangkak di mana saya tidak bisa ' bahkan tidak mengklik tombol batal pada bilah progres lagi dan harus menunggu 10 menit sambil memacetkan Ctrl + Alt + Del untuk mematikan proses dan mengutuk diri sendiri sambil menumpahkan minuman saya untuk kembali ke titik di mana hal-hal dapat digunakan lagi, dan itu terlepas dari file halaman yang disimpan pada SSD. Dalam kasus-kasus itu saya lebih suka kesalahan "kehabisan memori" atau sesuatu, pada titik mana saya mungkin menutup 17 tab porno saya (tidak apa-apa, toh saya bookmark favorit saya) untuk membebaskan beberapa memori dan kemudian segera lanjut tentang melanjutkan bisnis saya.

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.