2010-09-23 96 views
1

沒有人知道如何獲得os x上的免費(!)vram嗎?OS X上的免費VRam

我知道,你可以查詢一個註冊表項:

typeCode = IORegistryEntrySearchCFProperty(dspPort,kIOServicePlane,CFSTR(kIOFBMemorySizeKey), 
              kCFAllocatorDefault, 
              kIORegistryIterateRecursively | kIORegistryIterateParents); 

但是這將返回所有VRAM,而不是免費的VRAM。在windows下,你可以使用directshow查詢免費的VRAM

mDDrawResult = DirectDrawCreate(NULL, &mDDraw, NULL); 
mDDrawResult = mDDraw->QueryInterface(IID_IDirectDraw2, (LPVOID *)&mDDraw2); 
DDSCAPS ddscaps; 
DWORD totalmem, freemem; 
ddscaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY; 
mDDrawResult = mDDraw2->GetAvailableVidMem(&ddscaps, &totalmem, &freemem); 

醜陋,但它的工作原理。任何人都知道osx的方式?

最佳 溫迪

回答

2

回答自己,所以其他人可以使用這個:


#include <IOKit/graphics/IOGraphicsLib.h> 
size_t currentFreeVRAM() 
{ 

    kern_return_t krc; 
    mach_port_t masterPort; 
    krc = IOMasterPort(bootstrap_port, &masterPort); 
    if (krc == KERN_SUCCESS) 
    { 
     CFMutableDictionaryRef pattern = IOServiceMatching(kIOAcceleratorClassName); 
     //CFShow(pattern); 

     io_iterator_t deviceIterator; 
     krc = IOServiceGetMatchingServices(masterPort, pattern, &deviceIterator); 
     if (krc == KERN_SUCCESS) 
     { 
      io_object_t object; 
      while ((object = IOIteratorNext(deviceIterator))) 
      { 
       CFMutableDictionaryRef properties = NULL; 
       krc = IORegistryEntryCreateCFProperties(object, &properties, kCFAllocatorDefault, (IOOptionBits)0); 
       if (krc == KERN_SUCCESS) 
       { 
        CFMutableDictionaryRef perf_properties = (CFMutableDictionaryRef) CFDictionaryGetValue(properties, CFSTR("PerformanceStatistics")); 
        //CFShow(perf_properties); 

        // look for a number of keys (this is mostly reverse engineering and best-guess effort) 
        const void* free_vram_number = CFDictionaryGetValue(perf_properties, CFSTR("vramFreeBytes")); 
        if (free_vram_number) 
        { 
         ssize_t vramFreeBytes; 
         CFNumberGetValue((CFNumberRef) free_vram_number, kCFNumberSInt64Type, &vramFreeBytes); 
         return vramFreeBytes; 
        } 
       } 
       if (properties) CFRelease(properties); 
       IOObjectRelease(object); 
      }   
      IOObjectRelease(deviceIterator); 
     } 
    } 
    return 0; // when we come here, this is a fail 
} 

  • 我有些驚訝的是,這個查詢需要近3毫秒..
  • 請注意您的s上可能有多個加速器系統(例如, macbook) 因此請確保您選擇適當的查詢
+0

如何在適配器之間進行切換,就像在macbook上有2個一樣? – 2014-03-24 00:48:10