Bagaimana saya tahu jika memori tidak ditangani dengan benar?

12

Jejak memori permainan (2D) saya tampaknya meningkat setiap kali saya memuat tekstur, misalnya ketika saya memulai permainan saya menggunakan RAM pribadi 30 mb, setelah mentransversikan file latar belakang ~ 367mb, jadi semuanya ada dalam RAM di beberapa titik, itu meningkat menjadi RAM RAM pribadi 54 mb.

Hal yang sama terjadi setelah pergi jarak yang sama tetapi bolak-balik antara dua titik berulang kali.

Namun, pembacaan saya menunjukkan bahwa program memanggil glDeleteTextures dengan benar sekitar satu detik setelah tekstur mati; dan valgrind tidak menemukan kebocoran.

Bagaimana saya tahu jika saya harus khawatir tentang ini, atau jika itu hanya kekhasan bagaimana memori halaman OS?

Patrick Jeeves
sumber
1
Bagaimana Anda menentukan penggunaan RAM aplikasi Anda? Apakah Anda menggunakan profiler (yang mana?) Atau apakah Anda hanya mempercayai task manager dari sistem operasi Anda (yang mana)?
Philipp
1
Task manager pada kUbuntu, profiler pada debugger saya memberitahu saya menunggu data kemudian tidak pernah menampilkan apa pun.
Patrick Jeeves
1
Ngomong-ngomong: Ketika Anda memeriksa konsumsi memori di Linux, ingat untuk tidak hanya melihat memori yang dikonsumsi oleh proses game. Suatu kali saya bekerja pada sebuah permainan multiplatform adalah kami bertanya-tanya mengapa versi Windows mengkonsumsi ram jauh lebih banyak daripada versi Linux, sampai kami perhatikan bahwa versi Linux dari grafik API kami tampaknya mengalokasikan memori untuk semua tekstur dalam proses X11.
Philipp
2
Anda seharusnya tidak memiliki harapan bahwa glDeleteTextures akan benar-benar membebaskan memori: gamedev.stackexchange.com/questions/136883/…
Maximus Minimus

Jawaban:

21

Memori virtual dialokasikan dari OS dalam potongan-potongan besar, ketika bahkan satu byte dibiarkan masih digunakan dalam potongan besar itu tidak dapat dilepaskan kembali ke OS.

Alokasi pustaka di ruang pengguna juga menyimpan sejumlah tertentu untuk digunakan kembali untuk menghindari berulang kali menuntut dan melepaskan memori dari / ke OS yang sangat lambat.

Misalnya, Anda mengalokasikan tekstur, driver OpenGL menyimpan tabel 32 slot tekstur, Anda tetap mengalokasikan tekstur, driver kemudian perlu mengalokasikan tabel yang lebih besar dari 1024 slot tekstur. Tabel baru ini sekarang mengambil tempat di sebagian besar RAM, Anda membebaskan semua tekstur, driver tidak menyusut atau mengalokasikan ulang tabel itu dengan harapan bahwa permainan / aplikasi Anda akan perlu menggunakan banyak tekstur nanti sehingga sebagian besar RAM tidak dapat dilepaskan kembali ke OS.

Ini sangat normal dan diinginkan. RAM yang tidak digunakan akhirnya akan digunakan kembali oleh aplikasi Anda.

Stephane Hockenhull
sumber
1
Perlu dicatat bahwa jika penggunaan terus meningkat selama bermain, tetapi detektor kebocoran masih tidak menemukan apa pun, Anda mungkin menderita fragmentasi memori yang berlebihan. Pendekatan untuk memecahkan masalah seperti yang dijelaskan di stackoverflow.com/questions/150753/… juga akan berguna untuk pengembangan game.
Jules