首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OS X上的免费VRam

OS X上的免费VRam
EN

Stack Overflow用户
提问于 2010-09-24 06:44:35
回答 1查看 1.4K关注 0票数 2

有谁知道如何获得免费的(!)os x上的vram?

我知道您可以查询注册表项:

代码语言:javascript
复制
typeCode = IORegistryEntrySearchCFProperty(dspPort,kIOServicePlane,CFSTR(kIOFBMemorySizeKey),
                                           kCFAllocatorDefault,
                                           kIORegistryIterateRecursively | kIORegistryIterateParents);

但这将返回所有vram,而不是空闲的vram。在windows下,你可以使用directshow查询免费的VRAM。

代码语言:javascript
复制
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的方法吗?

最佳温迪

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-11 03:05:05

回答我自己,以便其他人可以使用以下内容:

代码语言:javascript
复制
#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毫秒..
  • 请注意,您的系统上可能有多个加速器(例如,因此,请确保您为query

选择了正确的

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3783030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档