void MemStatDialog::CheckMaxMemory(Int32 mbblocks) { maxon::BaseArray<void*> blocks; Int32 i; for (i = 0; true; i++) { void* block = nullptr; if (mbblocks > 0) block = NewMem(UChar, mbblocks * 1024 * 1024); if (!block) break; InitValues(); if (!blocks.Append(block)) { DeleteMem(block); break; } InitValues(); } BaseContainer stat; GeGetMemoryStat(stat); for (i = 0; i < blocks.GetCount(); i++) { void* block = blocks[i]; if (block) DeleteMem(block); } InitValues(); String memstr = String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_MEMORY_INUSE)); switch (mbblocks) { case 1: SetString(IDC_MEMORY_TEST_1MB_RES, memstr); break; case 10: SetString(IDC_MEMORY_TEST_10MB_RES, memstr); break; case 100: SetString(IDC_MEMORY_TEST_100MB_RES, memstr); break; } GeOutString("Max memory allocation: " + memstr, GEMB_OK); }
Bool MemStatDialog::InitValues(void) { // first call the parent instance if (!GeDialog::InitValues()) return false; BaseContainer stat; // since this function is slow we have to tell Cinema that we need this information by setting 1 stat.SetInt32(C4D_MEMORY_STAT_OPENGL_TOTAL, 1); GeGetMemoryStat(stat); SetString(IDC_MEMORY_STAT_MEMORY_INUSE, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_MEMORY_INUSE))); SetString(IDC_MEMORY_STAT_MEMORY_PEAK, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_MEMORY_PEAK))); SetString(IDC_MEMORY_STAT_NO_OF_ALLOCATIONS_TOTAL, GetNoOfAllocationsString(stat.GetInt64(C4D_MEMORY_STAT_NO_OF_ALLOCATIONS_TOTAL))); SetString(IDC_MEMORY_STAT_NO_OF_ALLOCATIONS_CURRENT, GetNoOfAllocationsString(stat.GetInt64(C4D_MEMORY_STAT_NO_OF_ALLOCATIONS_CURRENT))); SetString(IDC_MEMORY_STAT_OGL_MEMORY, GetOGLMemoryString(stat.GetInt32(C4D_MEMORY_STAT_OPENGL_TOTAL)) + " / " + GetOGLMemoryString(stat.GetInt32(C4D_MEMORY_STAT_OPENGL_FREE))); SetString(IDC_MEMORY_STAT_EOGL_TEXBUFFER, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_EOGL_TEXBUFFER)) + String(" (") + String::IntToString(stat.GetInt32(C4D_MEMORY_STAT_EOGL_TEXTUREBUFFER_CNT)) + String(")")); SetString(IDC_MEMORY_STAT_EOGL_VERTEXBUFFER, String::MemoryToString(stat.GetInt64(C4D_MEMORY_STAT_EOGL_VERTEXBUFFER)) + String(" (") + String::IntToString(stat.GetInt32(C4D_MEMORY_STAT_EOGL_VERTEXBUFFER_CNT)) + String(")")); return true; }