Alin Golumbeanu
Alin Golumbeanu

Reputation: 599

Get memory used by the GPU in iOS

How can I get the RAM memory used by the GPU (video) in iOS?

I am able to get the following memory stats: active_count, inactive_count, wire_count, free_count, but not the video used memory.

Upvotes: 0

Views: 1843

Answers (2)

Smilediver
Smilediver

Reputation: 1828

To get how much GPU memory your app is using on macOS or iOS you can use this method:

auto vm_info = task_vm_info_data_t();
auto count = TASK_VM_INFO_COUNT;
auto kerr = task_info(mach_task_self(), TASK_VM_INFO, task_info_t(&vm_info), &count);

if (kerr == KERN_SUCCESS) {
    // This seems to match GPU memory usage well. On macOS it seems the memory is released
    // more lazily, so the value may be higher than actual usage.
    auto memoryGpu = count >= TASK_VM_INFO_REV3_COUNT
        ? int64_t(vm_info.ledger_tag_graphics_footprint + vm_info.ledger_tag_graphics_footprint_compressed)
        : 0;
}

Upvotes: 0

Alin Golumbeanu
Alin Golumbeanu

Reputation: 599

First of all this is the method I use to obtain the memory usage:

#import <mach/mach_host.h>

NSDictionary* getMemoryState (){

    mach_port_t host_port;
    mach_msg_type_number_t host_size;
    vm_size_t pagesize;

    host_port = mach_host_self();
    host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
    host_page_size(host_port, &pagesize);

    vm_statistics_data_t vm_stat;

    if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
        NSLog(@"Failed to fetch vm statistics");
    }

    /* Stats in bytes */
    natural_t mem_used = (vm_stat.active_count +
                          vm_stat.inactive_count +
                          vm_stat.wire_count) *  (unsigned int) pagesize;

    natural_t mem_free = vm_stat.free_count * (unsigned int)pagesize;
    natural_t mem_total = mem_used + mem_free;

    //NSLog(@"used: %u free: %u total: %u active: %u video: %u", mem_used / 1024 /1024, mem_free / 1024 /1024, mem_total / 1024 /1024, vm_stat.active_count, 999 - (mem_total / 1024 /1024));

    NSMutableDictionary *dictWithMemoryStats = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                                [NSNumber numberWithInt:mem_total / 1024 / 1024] , @"total",
                                                [NSNumber numberWithInt:mem_used / 1024 / 1024], @"used",
                                                [NSNumber numberWithInt:mem_free / 1024 / 1024], @"free",
                                                [NSNumber numberWithInt:((vm_stat.active_count *  (unsigned int) pagesize) / 1024 / 1024)], @"active",
                                                [NSNumber numberWithInt:(vm_stat.inactive_count  *  (unsigned int) pagesize) / 1024 /1014], @"inactive",
                                                [NSNumber numberWithInt:(vm_stat.wire_count  *  (unsigned int) pagesize) / 1024/ 1024], @"wire",
                                                nil];

    return dictWithMemoryStats;

}

Then, to obtain the memory occupied by the GPU you must get the Total RAM memory of the device from which you subtract the total memory obtained from the method above.

let dictWithRamInfi: NSDictionary = getMemoryState()
let proInfo = NSProcessInfo.processInfo()

let totalRam: UInt64 = ((proInfo.physicalMemory / 1024) / 1024)
let totalActiveRam: UInt64 = UInt64(dictWithRamInfi["total"]!.unsignedLongLongValue)

let videoRam = totalRam - totalActiveRam 

Upvotes: 3

Related Questions