Buku Game Coding Complete, Edisi Keempat , bab 5 ( Inisialisasi Game dan Shutdown ), bagian Memeriksa Memori berisi contoh kode menarik ini:
bool CheckMemory(const DWORDLONG physicalRAMNeeded, const DWORDLONG virtualRAMNeeded)
{
MEMORYSTATUSEX status;
GlobalMemoryStatusEx(&status);
if (status.ullTotalPhys < physicalRAMNeeded)
{
// you don’t have enough physical memory. Tell the player to go get a
// real computer and give this one to his mother.
GCC_ERROR("CheckMemory Failure: Not enough physical memory.");
return false;
}
// Check for enough free memory.
if (status.ullAvailVirtual < virtualRAMNeeded)
{
// you don’t have enough virtual memory available.
// Tell the player to shut down the copy of Visual Studio running in the
// background, or whatever seems to be sucking the memory dry.
GCC_ERROR("CheckMemory Failure: Not enough virtual memory.");
return false;
}
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
else
{
// even though there is enough memory, it isn't available in one
// block, which can be critical for games that manage their own memory
GCC_ERROR("CheckMemory Failure: Not enough contiguous memory.");
return false;
}
}
Ini menimbulkan beberapa pertanyaan.
Bagian pertama hanya bertanya pada OS (Windows) berapa banyak RAM fisik yang tersedia. Bagian yang ingin tahu adalah yang kedua, yang mengalokasikan sejumlah besar memori dan membebaskannya segera:
char *buff = GCC_NEW char[virtualRAMNeeded];
if (buff)
{
delete[] buff;
}
Penulis kemudian menjelaskan:
... fungsi ini mengalokasikan dan segera melepaskan blok memori yang besar. Ini memiliki efek membuat Windows membersihkan semua sampah yang menumpuk di manajer memori dan memeriksa ulang apakah Anda dapat mengalokasikan blok yang berdekatan seluas yang Anda butuhkan. Jika panggilan berhasil, Anda pada dasarnya menjalankan mesin yang setara dengan Zamboni melalui memori sistem Anda, menyiapkannya untuk gim Anda ...
Tapi saya punya keberatan tentang itu.
"Membersihkan sampah yang menumpuk di manajer memori?" Betulkah? Jika permainan baru saja dimulai, tidakkah seharusnya tidak ada sampah?
"Memastikan kamu bisa mengalokasikan blok yang berdekatan?" Dalam kasus yang sangat spesifik di mana Anda akan mengelola memori sendiri, ini akan membuat mereka masuk akal, tapi tetap saja, jika Anda mengalokasikan banyak memori langsung dari kelelawar, Anda cukup banyak membuat tidak mungkin untuk aplikasi lain berjalan di sistem saat sistem Anda aktif.
Juga, bukankah ini akan memaksa OS untuk melakukan semua memori itu, dan sebagai akibatnya mengusir banyak memori ke ruang swap disk, banyak memperlambat startup aplikasi Anda?
Apakah ini benar-benar praktik yang baik?
operator new
untuk nullptr
), jika Anda mengizinkan saya untuk mengatakan. Hal terbaik yang dapat Anda lakukan dengan buku itu adalah menyalakan cerobong asap Anda. Mengalokasikan dan membebaskan blok memori yang besar tentu saja tidak "membersihkan" memori.
new
operator global untuk mengembalikan nol daripada melempar bad_alloc
. Jika tidak, maka ya, kode ini bahkan lebih tidak masuk akal: P
operator delete
diperlukan untuk menerima nullptr
dan memperlakukannya sebagai larangan . Setiap kelebihan global yang tidak melakukan itu rusak. Yang artinya tidak masuk akal. Sama seperti mengasumsikan bahwa mengalokasikan sejumlah besar memori dan melepaskannya akan "secara ajaib" melakukan sesuatu yang baik. Paling-paling, itu tidak akan membahayakan (kemungkinan besar, karena halaman bahkan tidak disentuh ... kalau tidak, mungkin swap keluar beberapa halaman dari set kerja Anda yang Anda perlu memuat ulang nanti).