【问题标题】:Free VRam on OS XOS X 上的免费虚拟内存
【发布时间】:2010-10-11 03:05:04
【问题描述】:

有谁知道如何在 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的方式吗?

最好的 温迪

【问题讨论】:

    标签: macos gpu


    【解决方案1】:

    回答自己,以便其他人可以使用:


    #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 毫秒 ..
    • 请注意,您的系统上可能有多个加速器(例如 macbook) 所以请确保为查询选择正确的查询

    【讨论】:

    • 如何在有 2 个的 macbook 上的适配器之间切换?
    猜你喜欢
    • 2022-01-23
    • 2011-11-04
    • 1970-01-01
    • 2013-11-19
    • 2012-12-26
    • 2020-06-25
    • 2010-12-05
    • 2013-09-26
    • 2019-07-10
    相关资源
    最近更新 更多