![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить кол-во видеопамяти. [D7, XP]
Б © (2009-11-20 10:16:00)Здрасти!
Мне надо получить кол-во видеопамяти.
Определять имя видеокарточки - умею.
P.S. Желательно без WMI, а Windows.pas и иже.
Игорь Шевченко (2009-11-21 19:05:00) [1]antonn © (20.11.09 22:11) [37]
> Ну вообще то обычной программе пишут 2Гб
Где пишут ?
> Вот и тебе показывают доступную память, а не пишут заполненную
Мне показывают "объем видеопамяти". Заметь, не "объем потенциально доступной с взятием в долг у оперативной".
antonn (2009-11-20 22:11:00) [2]Ну вообще то обычной программе пишут 2Гб, а юзеру показывают реальную "заполненность". Вот и тебе показывают доступную память, а не пишут заполненную.
если бы мне написали что памяти максимум 512, я бы на большее и не расчитывал, а так скажут 1024 - ну я и буду на них расчитывать (путь и получая тормоза) :)
Игорь Шевченко (2009-11-20 22:06:00) [3]antonn © (20.11.09 21:59) [35]
Ты свою шерсть с государственной не путай. У приложения пишут не теоретическую память, а реальную, а тут фигню всякую - сколько бы видеокарта могла взять.
antonn (2009-11-20 21:59:00) [4]
> Только оно у меня (полгига) нифига не зарезервировано, мои
> 2 гига занимаются приложениями и файловым кэшем.
а то что почти каждое приложение располагает 2Гб памяти и тоже ничего не резервирует - это нормально? :)
Б (2009-11-20 20:23:00) [5]
> З.Ы. Ты правда дошёл уже до такой степени продвинутости,
> чтобы писать заточенный под конкретную карту/процессор/драйвер
> код? :)
Нет. Но у меня большие планы. ;D
Ща только спрайтик выведу, а там... эх... ;)
> или может быть glGetString(GL_VENDOR)?).
Точно!
> Операционка
Примеров уйма.
> процессор
> FastLIB или FastCode-овские библиотеки.
Вскроим и посмотрим.
> драйвер
DGLE-2 Вскроим.
З.ы. Видеопамять всё таки надо узнать. :)
Sapersky (2009-11-20 19:37:00) [6]GL_RENDERER - 'GeForce 7600 GT/PCI/SSE2/3DNOW!'
Ну и чем эта строка не нравится? Можно вытащить и карту, и о процессоре кое-что. Если нужно более надёжно определить "ДжеФорс или Радик" - можно проверить специфичное для ATI/NV расширение (или может быть glGetString(GL_VENDOR)?). Для процессора есть CPUID - см. FastLIB или FastCode-овские библиотеки.
З.Ы. Ты правда дошёл уже до такой степени продвинутости, чтобы писать заточенный под конкретную карту/процессор/драйвер код? :)
Б (2009-11-20 19:08:00) [7]
> Обычно в первую очередь версию шейдеров проверяют, их ничем
> не заменишь.
Эт да.
Но не менее важно знать, что у пользователя стоит: ДжеФорс или Радик?
Сколько занимает видеопамяти? Операционка (Версия Windows), а то на всяких там Вистах, усё по-другому работает. И проч. В плоть до процессора.
Шейдеров и установленных драйверов.
Б (2009-11-20 19:05:00) [8]
> glGetString(GL_RENDERER). Хотя не проверял :)
Не. Это команда возвращает способ воспроизведения, для наглядности:
GL_RENDERER - 'GeForce 7600 GT/PCI/SSE2/3DNOW!'
Anatoly Podgoretsky (2009-11-20 18:53:00) [9]> Sapersky (20.11.2009 17:11:27) [27]
Да по той же причине, "В попугаях я длинней"
Sapersky (2009-11-20 18:28:00) [10]Ну так и определяй через GL, наверняка там есть для этого средства. Как получить название карты, например, я с ходу нашёл в хелпе по WinAPI, который идёт в комплекте с Delphi: glGetString(GL_RENDERER). Хотя не проверял :)
Да и кол-во видеопамяти обычно не самый критический параметр. DX, например, умеет автоматически переключаться на нелокальную/системную память при исчерпании видео + есть такая штука как менеджмент текстур, когда нужные в данный момент автоматом подгружаются из системной в видео, а ненужные выкидываются. У GL наверняка что-то подобное есть.
Обычно в первую очередь версию шейдеров проверяют, их ничем не заменишь. Пиксельные не эмулируются вообще никак, а вертексные - только через DX (AFAIK).
Б (2009-11-20 17:49:00) [11]
> Sapersky (20.11.09 17:11) [27]
Очень жаль, что придёться тащить DirectDraw.
Я изучаю OpenGL и хотел считывать у пользователя инфу с видюхи.
Чтобы понимать тянет ли дема или нет.
Sapersky (2009-11-20 17:11:00) [12]По поводу того, зачем нужна дезинформация с размерами.
Изначально технологии HyperMemory/TurboCache были предназначены для серии сверхбюджетных карт. Cвоей памяти у них очень мало, 32 или 64 мб, бОльшая часть добирается за счёт нелокалки. Ну и, видимо, чтобы не пугать пользователя реальными размерами видеопамяти - решили выдавать суммарный. А вот зачем эту фишку оставили включённой для карт middle/high-end серий, у которых памяти достаточно - не вполне понятно.
Разве в Windows.pas не обитает функция, котора возвращает не только имя видеокарты, но размер её видеопамяти?
Не знаю.
ИМХО лучше использовать DX, хотя бы потому, что есть возможность обойти всю эту маркетинговую фигню вроде HyperMemory. Правда, как конкретно - точно не скажу, не интересовался ранее, но вот сейчас нарыл:
IDirectDraw7::GetAvailableVidMem
The IDirectDraw7::GetAvailableVidMem method retrieves the total amount of display memory available and the amount of display memory currently free for a given type of surface.
HRESULT GetAvailableVidMem(
LPDDSCAPS2 lpDDSCaps2,
LPDWORD lpdwTotal,
LPDWORD lpdwFree
);
Parameters
lpDDSCaps2
Address of a DDSCAPS2 structure that indicates the hardware capabilities of the proposed surface.
lpdwTotal
Address of a variable to be filled with the total amount of display memory available, in bytes. The value retrieved reflects the total video memory, minus the video memory required for the primary surface and any private caches that the display driver reserves.
lpdwFree
Address of a variable to be filled with the amount of display memory currently free that can be allocated for a surface that matches the capabilities specified by the structure at lpDDSCaps2.
Return Values
If the method succeeds, the return value is DD_OK.
If it fails, the method can return one of the following error values:
DDERR_INVALIDCAPS
DDERR_INVALIDOBJECT
DDERR_INVALIDPARAMS
DDERR_NODIRECTDRAWHW
If NULL is passed to either lpdwTotal or lpdwFree, the value for that parameter is not returned.
Remarks
The following C++ example demonstrates how to use IDirectDraw7::GetAvailableVidMem to determine both the total and free display memory available for texture-map surfaces:
// For this example, the lpDD variable is a valid
// pointer to an IDirectDraw interface.
LPDIRECTDRAW7 lpDD;
DDSCAPS2 ddsCaps2;
DWORD dwTotal;
DWORD dwFree;
HRESULT hr;
hr = lpDD->QueryInterface(IID_IDirectDraw7, &lpDD);
if (FAILED(hr))
return hr;
// чтобы создать IDIRECTDRAW7 "с нуля" - использовать
// DirectDrawCreateEx(nil, lpDD, IID_IDirectDraw7, nil)
// Initialize the structure.
ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
ddsCaps2.dwCaps = DDSCAPS_TEXTURE;
hr = lpDD->GetAvailableVidMem(&ddsCaps2, &dwTotal, &dwFree);
if (FAILED(hr))
return hr;
If the surface has the DDSCAPS_VIDEOMEMORY flag set, this method will return different amounts of video memory depending on whether or not the surface can be used as a 3-D texture. If the surface can be used for 3-D textures, the GetAvailableVidMem method will return the sum of the local video memory and the non-local video memory on AGP systems.
Б (2009-11-20 16:09:00) [13]Разве в Windows.pas не обитает функция, котора возвращает не только имя видеокарты, но размер её видеопамяти?
Я уж самотался искать.
Sapersky (2009-11-20 15:20:00) [14]Ну я писал уже:
или макс. размер нелокальной, вряд ли эти 512 мб жёстко забиты за видеокартой.
Понятно, что сразу отхватывать у системы 512 мб нерационально, видимо, драйвер динамически определяет потребность в доп. видеопамяти.
Вот мои 24 (из 512) скорее всего жёстко забиты, хотя тоже не факт.
Игорь Шевченко (2009-11-20 15:02:00) [15]Sapersky (20.11.09 13:52) [19]
> http://www.unistellar.com/downloads/DXCapsViewer.zip
Этот показывает 512 мегабайт локальной памяти и 512 мегабайт нелокальной.
Только оно у меня (полгига) нифига не зарезервировано, мои 2 гига занимаются приложениями и файловым кэшем.
Sapersky (2009-11-20 14:28:00) [16]Неясно выразился? Ну повторяю: из системной памяти выделяется некая часть, которая считается "тожевидео", и добавляется к настоящей видео.
По вашей ссылке примерно о том же пишут - HyperMemory/TurboCache, хотя на самом деле нелокалка есть у всех карт, но не в таком кол-ве - у меня 24 мб, например, при локальной 128.
Игорь Шевченко (2009-11-20 14:18:00) [17]кстати, по сабжу:
http://forum.oszone.net/printthread-124061.html
Игорь Шевченко (2009-11-20 14:16:00) [18]Sapersky (20.11.09 13:52) [19]
> Вероятно, считают т.н. нелокальную видеопамять, т.е. системную,
> зарезервированную под нужны видео
чё ?
Sapersky (2009-11-20 13:56:00) [19]Вероятно, считают т.н. нелокальную видеопамять, т.е. системную, зарезервированную под нужны видео.
В смысле - локальную и нелокальную в сумме.
Sapersky (2009-11-20 13:52:00) [20]Вот пример - на компьютере, с которого я сейчас пишу установлена видеокарта ATI Radeon XT 2600 с 512-ю мегабайтами. Все определялки, включая родной Catalyst Control Center пишут, что памяти 1024 мегабайта.
Недавно покупалась карточка NVidia, с ней аналогичная фигня - памяти 512, все пишут, что 1024.
Вероятно, считают т.н. нелокальную видеопамять, т.е. системную, зарезервированную под нужны видео. Ну или макс. размер нелокальной, вряд ли эти 512 мб жёстко забиты за видеокартой.
Через DX такие тонкости различимы. Можно попробовать dxdiag, хотя это всё-таки пользовательская утилита, может тоже соврать. DXCapsViewer из DX SDK должен правильно показать, он отдельно пишет локальную и нелокальную (DirectDraw devices/первичный видеодрайвер/Memory).
http://www.unistellar.com/downloads/DXCapsViewer.zip(или качаем SDK :))