Autor Wątek: [C#] Informacja na temat pamięci wideo  (Przeczytany 2118 razy)

Offline Tobix10

  • Użytkownik

# Lipiec 30, 2009, 19:52:49
W C# dopiero raczkuje. Mam problem z pobraniem ilości pamięci wideo na karcie graficznej i jej aktualnej wolnej wartości oraz tego samego ale dotyczącego tekstur. W C++ robiłem to poprzez DirectX(funkcja GetAvailableVidMem), a tutaj nie wiem za bardzo jak.

Czytałem o Managed DirectX .net(czy jakoś tak), ale wydaje mi się, że w nim nie ma tych funkcji, których szukam, a poza tym to jest raczej przestarzałe.
Mam pytanie co do XNA, czy tam znajdę potrzebne mi funkcje ?

Jeszce jedno. Tworząc projekt "Windows Forms" chciałbym aby w tle odświeżały się cały czas te wartości. Gdzie mogę wsadzić nieskończoną pętle ? Czy może mam stworzyć nowy wątek, jak tak to gdzie go wystartować ?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 30, 2009, 20:32:13
Pamięcią na karcie graficznej całkowicie zarządza sterownik. Nic Ci do tego ile jest jej wolnej. :)

Offline Tobix10

  • Użytkownik

# Lipiec 31, 2009, 11:22:27
Ja chce wiedzieć :P

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 31, 2009, 11:32:39
Ja chce wiedzieć :P
IDirect3DDevice9::GetAvailableTextureMem


Ale i tak wiele Ci to nie powie, driver rządzi się swoimi własnymi prawami - może na przykład nie zwalniać pamięci od razu, a dopiero wtedy kiedy to będzie konieczne i w takiej sytuacji nic Ci takie dane nie dadzą (bo zawsze będzie pokazywało maksymalne zużycie pamięci).

Offline Tobix10

  • Użytkownik

# Lipiec 31, 2009, 16:35:49
Nie potrzebuje tych informacji do nie wiadomo czego.

Ta funkcja jest z DirectX SDK dla C++, ale także w XNA ?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 31, 2009, 17:05:49
Ta funkcja jest z DirectX SDK dla C++, ale także w XNA ?
Myślę, że to mozna sprawdzić w dokumentacji XNA. :)

Offline Tobix10

  • Użytkownik

# Lipiec 31, 2009, 20:11:44
z tego co lookałem na msdn to chyba nie ma ;/

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Lipiec 31, 2009, 22:07:49
z tego co lookałem na msdn to chyba nie ma ;/
W DX10 chyba też już nie ma. Jak mówiłem, nie ma to praktycznego zastosowania, bo jest bardzo nieprecyzyjne.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Sierpień 09, 2009, 13:25:13
Mówiąc szczerze, bardzo dziwi mnie ta sytuacja. O ile wiem, nowoczesne gry często streamują dane w tle (np. tekstury, modele, a także dane w pamięci RAM) te które są albo będą wkrótce potrzebne, a te najrzadziej/najdawniej nieużywane zwalniają, bo wszystkie dane używane na mapie nie zmieściłyby się na raz w pamięci. Skoro tak, to musi być jakaś pula pamięci określonej wielkości na te wczytane dane. Wypadałoby wiedzieć, jaki ta pula powinna mieć rozmiar. To zarządzanie pamięcią karty graficznej przez sterownik i pula MANAGED zasobów D3D (w której sterownik automatycznie wgrywa i zwalnia zasoby w pamięci karty przechowując kopie w pamięci RAM) przypomina mi ideę pliku wymiany. Plik wymiany jest dobry w pracy z programami użytkowymi, kiedy np. miałbym włączone na raz Delphi, Visual Studio, 3ds Max, Microsoft Word i inne programy. Te aktualnie nieużywane trafią do pliku wymiany i przy uaktywnieniu system przywróci dany program do pamięci, co potrwa dłuższą chwilę. Ale jakoś nie wyobrażam sobie, żeby w ten sposób z pliku wymiany korzystała gra - przecież wtedy zacznie niesamowicie mulić. To samo wyobrażam sobie w przypadku pamięci video. No bo co, jeśli zbiór roboczy tekstur i siatek nie zmieści się w pamięci video i sterownik razem z D3D zacznie wymieniać zasoby MANAGED w każdej klatce? Myślę, że będzie totalna zmuła. Dlatego pytanie - jaki jest w tym sens i jak sobie z tym problemem należy radzić?

Offline Esidar

  • Użytkownik

# Sierpień 09, 2009, 15:43:11
Dlatego pytanie - jaki jest w tym sens i jak sobie z tym problemem należy radzić?
No to polecam ci przeczytać prezentację MS/Nvidia/ATI "WDDM v2 and beyond". Kolesie opisują co będzie w przyszłych wersja sterowników. Wirtualna przestrzeń adresowa w GPU osobna na każdy proces, wyjątki page fault rzucane przez GPU, context and task switching w GPU między aplikacjami itd. Włos się jeży :) Zamiast upraszczania i przyśpieszania działania jednej aplikacji, idą w kierunku współdziałania kilku aplikacji 3D. Chociaż są też i pewne plusy bo ma być w końcu bezpośredni dostęp CPU do pamięci GPU. Teraz nadal wszystko jest tworzone w pamięci System i kopiowane do GPU przez DMA. W nowych driverach ma być możliwość zapisu w pamięci GPU bajt-po-bajcie na poziomie User Mode. To może trochę przyśpieszyć pewne rzeczy.

Cytuj
Ale jakoś nie wyobrażam sobie, żeby w ten sposób z pliku wymiany korzystała gra - przecież wtedy zacznie niesamowicie mulić.
Problem z PC jest taki że jest masa różnych użytkowników. Przy robieniu gry ustala się jakieś minimum. Poniżej tego minimum zawsze będzie mulić niezależnie od tego kto zarządza pamięcią.

Co do streamowania, to wolałbym żeby zrobili w końcu coś takiego jak w konsolach. Alokujesz 1GB pamięci a potem mówisz "od 0x100F00" jest tekstura, po czym robisz stream z dysku i mówisz "a teraz od 0x100F00 jest vertex buffer". Obecny interface wymusza ciągle tworzenie i kasowanie setki zasobów w ciągu sekundy podczas streamingu. Do tego dochodzi wiele kopiowania.
Dzisiaj aplikacja sama zarządza swoją przestrzenią adresową i mówi co i gdzie się znajduje. Może nowe drivery pozwolą na zarządzanie pamięcią GPU na poziomie User Mode.