2010-09-23 61 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