Технические вопросы и ответы QA1168

Как я определяю, сколько VRAM доступно на моей видеокарте?

Q: Как я определяю, сколько VRAM доступно на моей видеокарте?

A: CGLQueryRendererInfo() и CGLDescribeRenderer() функции позволяют Вам получать свойства средств рендеринга в Вашей системе, включая их размеры VRAM. На OS X 10.7 и позже, можно запросить средство рендеринга с kCGLRPVideoMemoryMegabytes параметр для получения числа мегабайтов видеопамяти, доступной средству рендеринга.

См. Ссылочные Свойства Средства рендеринга CGL для полного списка констант свойства средства рендеринга включая kCGLRPVideoMemoryMegabytes, kCGLRPTextureMemoryMegabytes, и т.д.

Перечисление 1 демонстрирует, как определить размер VRAM для Вашего текущего средства рендеринга OpenGL.

Перечисление 1  , Находящее размер текущего средства рендеринга VRAM

- (void)logVideoMemoryCurrentRenderer
{
    GLint virtualScreen = [[self openGLContext] currentVirtualScreen];
 
    // Since this may be called from outside the display loop, make sure
    // the context is current so the GL calls all work properly.
    [[self openGLContext] makeCurrentContext];
 
    // Use the current virtual screen index to interrogate the pixel format
    // for its display mask and renderer id.
    // Note, "pixelFormat" is the NSOpenGLPixelFormat that your OpenGL context
    // is created from, typically created in your OpenGL view's -initWithFrame:
    GLint displayMask;
    GLint rendererID;
    [pixelFormat getValues:&displayMask forAttribute:NSOpenGLPFAScreenMask forVirtualScreen:virtualScreen];
    [pixelFormat getValues:&rendererID  forAttribute:NSOpenGLPFARendererID forVirtualScreen:virtualScreen];
 
    // Get renderer info for all renderers that match the display mask.
    GLint i, nrend = 0;
    CGLRendererInfoObj rend;
 
    CGLQueryRendererInfo((GLuint)displayMask, &rend, &nrend);
 
    GLint videoMemory = 0;
    for (i = 0; i < nrend; i++)
    {
        GLint thisRendererID;
 
        CGLDescribeRenderer(rend, i, kCGLRPRendererID, &thisRendererID);
 
        // See if this is the one we want
        if (thisRendererID == rendererID) {
            CGLDescribeRenderer(rend, i, kCGLRPVideoMemoryMegabytes, &videoMemory);
 
            NSLog(@"%@", [NSString stringWithCString:(const char *)glGetString(GL_RENDERER)
                                            encoding:NSASCIIStringEncoding]);
            NSLog(@"Renderer ID = 0x%x", thisRendererID);
            NSLog(@"Video Memory = %d MB", videoMemory);
        }
    }
 
    CGLDestroyRendererInfo(rend);
}

Если Вы ищете размеры VRAM всех средств рендеринга в Вашей системе, включая тех, которые не привязаны к мониторам (оффлайновые средства рендеринга), можно указать a -1/0xFFFFFFFF маска дисплея в CGLQueryRendererInfo() функция. См. Перечисление 2 для примера.

Перечисление 2  , Находящее размеры всех средств рендеринга VRAM

- (void)logVideoMemoryAllRenderers
{
    // Get renderer info for all renderers that match the display mask.
    GLint i, nrend = 0;
    CGLRendererInfoObj rend;
 
    // Using a -1/0xFFFFFFFF display mask enables us to find all renderers,
    // including those GPUs that are not attached to monitors, aka. offline renderers.
    const GLint displayMask = 0xFFFFFFFF;
 
    CGLQueryRendererInfo((GLuint)displayMask, &rend, &nrend);
 
    for(i = 0; i < nrend; i++)
    {
        GLint thisRendererID;
        GLint videoMemory = 0;
 
        CGLDescribeRenderer(rend, i, kCGLRPRendererID, &thisRendererID);
        NSLog(@"Renderer ID = 0x%x", thisRendererID);
 
        CGLDescribeRenderer(rend, i, kCGLRPVideoMemoryMegabytes, &videoMemory);
        NSLog(@"Video Memory = %d MB", videoMemory);
    }
 
    CGLDestroyRendererInfo(rend);
}


История версии документа


ДатаПримечания
11.03.2014

Обновленный для OS X 10.9.

11.10.2004

Новый документ, что использование CGLDescribeRenderer для нахождения физического размера VRAM на установленном оборудовании.