Я хочу приобрести размер VRAM устройства Android.
Есть ли способ для приобретения из программы?
Я хочу приобрести размер VRAM устройства Android.
Есть ли способ для приобретения из программы?
Сделайте некоторые вычисления, используя Nexus One:
Разрешение экрана 480x800. Таким образом, минимальный размер требуемой видеопамяти:
400 * 800 * 4 bytes = 1536000 bytes
Предполагая, что драйвер может (и обычно должен) использовать несколько буферов, мы также должны ожидать такие значения, как:
1536000 * 2 bytes = 3072000 bytes
1536000 * 3 bytes = 4608000 bytes
etc...
Было бы странно иметь значения, которые не кратные 1536000 (или вообще Ш х В х 4).
После некоторых поисков на внутренних устройствах Android я нашел эту документацию:
... Android выполняет два требования к драйверу: линейное адресное пространство отображаемой памяти, которое оно может напрямую писать... доступ к драйверу путем вызова open на /dev/fb 0...
Итак, я попробовал и взял размер файла /dev/graphics/fb0
(на моем устройстве нет /dev/fb0
).
Но прямой подход не работает:
File file = new File("/dev/graphics/fb0");
file.length(); // ==0, doesn't work, no read access
Используя следующий трюк, вы можете получить фактический размер fb0
:
>adb pull /dev/graphics/fb0
1659 KB/s (4608000 bytes in 2.712s)
Видеопамять ~ 4 Мб (Nexus One). Позвольте проверить, является ли это кратным размер экрана Nexus:
4608000/1536000 = 3
Он выглядит как правильное значение. И мы также можем сказать, что драйвер использует три экранных буфера.
Итак, в качестве вывода вы можете определить размер видеопамяти с помощью adb, но вы не можете использовать этот подход из своего приложения для Android в режиме исполнения из-за ограничений доступа к файлам.
Обычно у вас нет специального "VRAM" на мобильных устройствах. По крайней мере, у вас его нет с архитектурами PowerVR (которые полностью доминируют на рынке с их ядрами MBX и SGX).
То есть, драйвер OpenGL выделяет нормальную ОЗУ до тех пор, пока вы не закончите его, и чем больше вы выделите, тем меньше у вас осталось для вашего приложения.
API Android/OpenGL не предлагают явные методы для чтения размера VRAM с данного устройства.
Бедственное решение:
Вы можете попытаться сделать вывод о размере VRAM эмпирическим способом, добавляя текстуру 1MB, пока не получите ошибку из памяти gl.glGetError()
.
Из вашего вывода "dmesg" u может считывать VRAM, поэтому для моего планшета:
> [ 0.000000] Machine: TDM3730 [ 0.000000] Reserving 12582912
> bytes SDRAM for VRAM
>
> 7>[ 3.929962] VRAM: checking region 9f400000 3072
> <4>[ 3.929992] Failed. Allocating 4194304 bytes for fb 0
> <7>[ 3.935333] VRAM: alloc mem type 0 size 4194304 paddr dec2bd4c
> <7>[ 3.935485] VRAM: checking region 9f400000 3072
> <7>[ 3.935485] VRAM: found 9f400000, end a0000000
> <6>[ 3.936584] android_usb gadget: high speed config #1: android
> <4>[ 3.960113] allocating 4194304 bytes for fb 1
или детали:
Просто подсчитайте, сколько Mb ram, которое можно использовать для реальной емкости бара, например, для моего lenovo a369i есть 512 RAM Module, но в настройке приложения отображается только 471 Мб, поэтому левый 41Mb зарезервирован для GPU, поэтому вывод заключается в том, что мой a369i имеет 41Mb vram
Этот метод основан на общей графической памяти (wiki)
Я подозреваю, что android.os.StatFs - это то, что вы ищете:
http://developer.android.com/reference/android/os/StatFs.html