Warsztat.GD

Programowanie => Inne => Wątek zaczęty przez: kacperz1 w Kwiecień 19, 2008, 12:07:21

Tytuł: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 19, 2008, 12:07:21
Witam,

Chciałbym dynamicznie ładować teren/świat tylko nie wiem zbytnio jak to zrobić. Chodzi o to że cały świat jest ogromny i dlatego chciałbym tylko ładować i renderować kawałek świata tak aby pamięć nie była by zbędnie zaśmiecana. Tak jak w grze World of Warcraft.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: yarpen w Kwiecień 19, 2008, 12:23:43
Oj.... To nie jest temat na wyjasnienie w jednym poscie. Najczesciej jest tak, iz swiat podzielony jest na chunki (gracz tego nie widzi) i renderujac jeden chunk jednoczesnie w tle ladujesz drugi. To oczywiscie uproszczenie bo dochodza kwestie logiki pomiedzy chunkami, przewidywania, ktore chunki ladowac, ile trzymac w pamieci, co robic kiedy dojdziemy do miejsca, ktore nie zdazylo sie zaladowac itd. Calkiem niezle wprowadzenie masz np. w prezentacji Volition z GDC o Saints Row: https://www.cmpevents.com/sessions/GD/S3741i1.pdf
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Reg w Kwiecień 19, 2008, 12:37:30
Ja tam nie wiem, ale podejrzewam, że zacząć trzeba od tego:

1. Podzielić świat na kawałki.

2. Zapewnić sobie możliwość wczytywania kawałków w tle, w osobnym wątku, żeby wczytywanie nie zawieszało na chwilę całej gry.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Hans w Kwiecień 19, 2008, 12:40:21
yo

WoW'a wprawdzie na oczy nie widziałem, za to grałem byłem w obliviona

w skrócie aby ładować świat 'dynamicznie' trzeba ładować go jakimiś kawałkami, więc pierwsza rzecz do zrobienia to wprowadzenie jakiegoś sensownego podziału na, nazwijmy to, komórki. najprościej można pociąć świat na kwadraty o zadanym rozmiarze albo lepiej (i trudniej) podzielić zgodnie z ukształtowaniem/zagospodarowaniem terenu (tak żeby np jakaś wioska nie wypadła na łączeniu komórek tylko stanowiła całą oddzielną)

potem czas na ładowanie :) wczytujesz komórke w której jest gracz/kamera oraz sąsiednie, jeżeli gracz wlezie na komórke obok to wtedy dla niej wczytujesz sąsiedzie, a wywalasz te które są za daleko. ważne jest aby granice wczytywania komórki i wywalania jej były różne (czyli wczytujesz wcześniej/bliżej, zwalniasz dalej). w przeciwnym wypadku idąc wzdłuż takiej granicy (i co chwile ją przekraczając) cały czas by 'mieliło'

(aa w zależności od typu gry/terenu/sprzętu/etc wyświetlać można oczywiści wiecej komórek jednocześnie, można też zrobić kilka LOD dla komórek i ładować je kolejno w miarę zbliżania się)

z aspektów technicznych.. potrzebna jest wielowątkowość tutaj. czyli do standardowego wątku (albo wątków) głównego dorzucasz wątek zajmujący się tylko ładowaniem map/zasobów (może być ich więcej niż jeden), najlepiej o mniejszym priorytecie żeby działał 'w tle' nie przeszkadzając zbytnio w rozgrywce

//edit.. za długo to pisałem hehe
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 19, 2008, 12:54:00
Dziękuję za odpowiedzi i na pewno pomoże mi to bardzo w dalszym rozwoju gry, lecz nie ma mowy o wątkach. Znaczy się że ja kiedyś z nimi pracowałem i pracowało mi się okropnie.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 19, 2008, 13:01:53
Dziękuję za odpowiedzi i na pewno pomoże mi to bardzo w dalszym rozwoju gry, lecz nie ma mowy o wątkach. Znaczy się że ja kiedyś z nimi pracowałem i pracowało mi się okropnie.
W takim razie polecam lekturę tego: http://msdn2.microsoft.com/en-us/library/aa365683(VS.85).aspx
Mniej więcej działa to tak, że prosisz Windowsa, żeby Ci coś załadował, a on Ci grzecznie mówi, kiedy skończy. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: yarpen w Kwiecień 19, 2008, 13:09:37
To przy zalozeniu, ze dane nie wymagaja zadnego postprocessingu.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 19, 2008, 13:24:19
To przy zalozeniu, ze dane nie wymagaja zadnego postprocessingu.
Zawsze można procesować w wątku głównym, chociaż fakt, że w ten sposób traci się dosyć łatwą okazję skorzystania z drugiego rdzenia.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 19, 2008, 14:12:11
Jaka była by najlepsza metoda poinformowania programu jakie mapy znajdują sie obok mapy na której aktualnie znajduje sie gracz. Myślałem o odczytywaniu tych informacji z pliku tekstowego. Informacja wyglądały by tak:
Mapa_5: Mapa_4 & Mapa_6 // co znaczy że mapa_5 sąsiaduje z mapa 4 i 6
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Esidar w Kwiecień 19, 2008, 15:20:26
Dziękuję za odpowiedzi i na pewno pomoże mi to bardzo w dalszym rozwoju gry, lecz nie ma mowy o wątkach. Znaczy się że ja kiedyś z nimi pracowałem i pracowało mi się okropnie.

Bez wątków i procesora z co najmniej dwoma rdzeniami nie dasz rady. A przynajmniej nie będzie płynnie bez tego. Podczas wczytywania danych musisz wykonywać dość kosztowne operacje takie jak tworzenie vertexbuffers, indexbuffers, textures, shaders. Niestety PC nadal nie radzi sobie z tym dobrze bo w zależności od drivera i systemu stworzenie każdego z tych zasobów może mocno zablokować rendering.

Cytuj
Jaka była by najlepsza metoda poinformowania programu jakie mapy znajdują sie obok mapy na której aktualnie znajduje sie gracz
Najpierw pomyśl jak będzie tworzona (przygotuj sobie miasto w jakimś programie 3D), dzielona (algorytm, wielkość bloków) i wczytywana geometria świata (algorytm określający który blok jest widoczny a który wczytywany) a dopiero na końcu sposób zapisu o którym mówisz. Właściwie ten sposób sam Ci się określi, jak już przebrniesz przez wcześniejsze punkty.

Cytuj
Mapa_5: Mapa_4 & Mapa_6 // co znaczy że mapa_5 sąsiaduje z mapa 4 i 6
Jeśli podzielisz świat na szachownicę, to Mapa_5 będzie zawsze sąsiadować z 4 i 6. Nie musisz tego wczytywać :)

Jeśli masz szachownicę 8x8 a gracz stoi w polu x:3 y:4 to na lewo będzie x-1 y+0, na prawo x+1 y+0, na górze x+0 y-1, a na dole x+0 y+1.

Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Kos w Kwiecień 19, 2008, 15:35:10
Btw, w quakach było coś takiego, jak portale - działało to tak, że w miejscu np. drzwi była jakaś niewidzialna bryła. Jeśli ta bryła kolidowała ze ściętosłupem widzenia (czyli gracz mógł przez drzwi wyjrzeć) to wtedy był renderowany teren za nią. Mógłbyś może zrobić na podobnej zasadzie ładowanie terenu, choć tu bez liczenia widoczności - po prostu jeśli gracz jest w jakimś obszarze, to doczytujesz obszary które są za portalami znajdującymi się w tym obszarze, a zapominasz pozostałe.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 19, 2008, 15:41:37
Cytuj
Bez wątków i procesora z co najmniej dwoma rdzeniami nie dasz rady. A przynajmniej nie będzie płynnie bez tego. Podczas wczytywania danych musisz wykonywać dość kosztowne operacje takie jak tworzenie vertexbuffers, indexbuffers, textures, shaders. Niestety PC nadal nie radzi sobie z tym dobrze bo w zależności od drivera i systemu stworzenie każdego z tych zasobów może mocno zablokować rendering.
Myślę, że tutaj nie jest aż tak tragicznie. W jednym ze swoich programów przez przypadek co klatkę tworzyłem i ładowałem na kartę od nowa teksturę 512x512 i przez sporo czasu nawet tego nie zauważyłem (chociaż 512x512 to nie są ogromne ilości danych). Samo tworzenie zasobów można obejść tworząc ich pewną pulę i uploadując do nich nowe dane w razie potrzeby. Poza tym na procesorach jednordzeniowych tworzenie drugiego wątku i tak za wiele nie przyspieszy, więc odpowiednia implementacja powinna się obejść bez wątków i nie ucierpieć na tym zbyt wiele. :)

Cytuj
Jeśli podzielisz świat na szachownicę, to Mapa_5 będzie zawsze sąsiadować z 4 i 6. Nie musisz tego wczytywać :)
Nie zawsze jest tak prosto. Przykładowo, na kaflu Mapa_5 mogą znajdować się wejścia do innych lokacji, które wypadało by zacząć wczytywać jak nie ma nic innego do wczytywania, bo jak gracz będzie chciał wejść do danej lokacji, to może być już za późno na płynne wczytanie (przykład: Wiedźmin). ;)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 19, 2008, 16:45:58
Wykonałem podane punkty (pisemnie bo nie modelowałem na razie terenu bo to już nie moja działka) ale nadal nie wiem jak wykonać odczytywanie sąsiednich kafli. Zastanawiam się czy zrobić to w pliku tekstowym czy może w tablicach.

Jak będzie stworzona mapa?
Naturalne proporcja w stylu trawa, człowiek, drzewo, budynek.

Jak będzie dzielona?
Dzielona na kafle o rozmiarach 100 na 100.
Jeżeli przy dzieleniu problemem będzie obiekt który stanie na drodze to zwiększamy rozmiar mapy do dzielenia.

Jak będzie wczytywana?
Pobieranie pozycji gracza i nazwę kafla na którym sie znajduje z bazy danych.
Wczytywane będą kafle map sąsiadujących z tą na której znajduje sie grac.
Stare kafle nie sąsiadujące już z aktualnym kaflem na którym jest gracz zostaną usunięte
z pamięci.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: SauRooN w Kwiecień 19, 2008, 17:10:50
Wczytywane będą kafle map sąsiadujących z tą na której znajduje sie grac.
Stare kafle nie sąsiadujące już z aktualnym kaflem na którym jest gracz zostaną usunięte
z pamięci.
Możesz bardzo zwiększyć wydajność systemu implementując wczytywanie kafli z predykcją (przewidując, które kafle prawdopodobnie będzie trzeba niedługo wczytać), a do wyładowywania wykorzystać histerezę (nie wyładowywać kafli natychmiast po stwierdzeniu, że są niepotrzebne (niewidoczne), tylko np. po odejściu od nich na jakąś większą odległość).
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Syriusz w Kwiecień 19, 2008, 17:23:10
Cytuj
Dzielona na kafle o rozmiarach 100 na 100.
To będzie gra 2D ???
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Kos w Kwiecień 19, 2008, 18:32:40
A to terenu 3d, powiedzmy heightmapy+obiektów, nie można dzielić na kafle 100x100? :]
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Syriusz w Kwiecień 19, 2008, 19:57:18
Ja kojarzę kafle raczej z czymś płaskim, w końcu kafle są płaskie jak...  kafle ;). Poczekamy, zobaczymy co kacperz miał na myśli...
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Mattrick w Kwiecień 20, 2008, 00:42:02
Pewnie chodziło mu o kafle w sensie segmenty. ; p
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Vipa w Kwiecień 20, 2008, 01:29:07
A ja odpowiem tak: stosujcie się do wskazówek Krzysztofa K. Z tego co widzę chłopak ma głowę na karku.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kedan w Kwiecień 20, 2008, 01:40:37
Kiedyś myślałem żeby zrobić tak: na począku wczytać wszystkie (albo te najważniejsze i największe) potrzebne PODSTAWOWE modele (roślinność, postacie, budynki, lub części budynków) z któych dopiero później za pomocą powiedzmy skryptów (czy tablic z cyferkami), będą tworzone większe lokacje. Wtedy doczytywania kafli z dysku byłoby faktycznie odczytem pliku np ASCII z rozłożeniem modeli czy ukształtowaniem terenu (+ ewentualne doczytanie niewielkich, specyficznych danych). Niestety nie sprawdzałem tego w praktyce..
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 20, 2008, 02:57:39
Cytuj
Kiedyś myślałem żeby zrobić tak: na począku wczytać wszystkie (albo te najważniejsze i największe) potrzebne PODSTAWOWE modele (roślinność, postacie, budynki, lub części budynków) z któych dopiero później za pomocą powiedzmy skryptów (czy tablic z cyferkami), będą tworzone większe lokacje.
Problem będzie tylko jeżeli tych podstawowych modeli będzie więcej, niż można pomieścić (zwłaszcza może być problem nie tyle z modelami, co z ich teksturami). Poza tym w ten sposób możesz ekstremalnie wydłużyć czas początkowego ładowania. Najsensowniejszym rozwiązaniem by było cacheowanie takich modeli i doczytywanie tych, które są używane przez kafle, a których jeszcze nie ma w pamięci.

Cytuj
Wtedy doczytywania kafli z dysku byłoby faktycznie odczytem pliku np ASCII z rozłożeniem modeli czy ukształtowaniem terenu (+ ewentualne doczytanie niewielkich, specyficznych danych).
Plik ASCII jest takim sobie pomysłem (chociaż zachowałeś nieco zdrowego rozsądku i nie zaproponowałeś XML'a ;)). Do przechowywania wszelakich danych streamowanych z dysku proponowałbym pliki binarne, najlepiej w dodatku skompresowane jakimś w miarę szybkim niezbyt złożonym algorytmem (np. range encoding z jawnie zapisaną tablicą prawdopodobieństw bajtów, albo range encoding + model-1). Dodatkowo dane można początkowo przetransformować żeby mniej zajmowały, np. zapisując współrzędne obiektów jako liczby 16-bitowe (w końcu kafel ma ograniczoną powierzchnię), czy olewając współrzędne Z (albo Y, w zależności od układu) dla typów obiektów z definicji przypiętych do heightmapy. Dla danych heightmap można zastosować algorytmy kompresji 2D (np. falki - niestety JPG'i i większość gotowych formatów nie przejdzie, bo mają za małą precyzję koloru do reprezentacji heightmap). W efekcie pliki powinny się drastycznie zmniejszyć, co bardzo ładnie wpłynie na szybkość ładowania. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Reg w Kwiecień 20, 2008, 13:21:33
Esidar: Czy wobec tego jest możliwość tworzenia tych zasobów typu bufory i tekstury w osobnym wątku? Bo ja słyszałem, że to się kompletnie nie opłaca, bo urządzenie Direct3D utworzone z flagą D3DCREATE_MULTITHREADED po prostu zabezpiecza wszystkie metody D3D jedną wielką sekcją krytyczną, co tylko jeszcze bardziej spowalnia.

SauRooN: Czy histereza będzie lepsza, niż trzymanie określonej liczby ostatnio użytych sektorów i ich wymiana na zasadzie LRU - Last Recently Used?
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 20, 2008, 14:20:51
Cytuj
Czy wobec tego jest możliwość tworzenia tych zasobów typu bufory i tekstury w osobnym wątku? Bo ja słyszałem, że to się kompletnie nie opłaca, bo urządzenie Direct3D utworzone z flagą D3DCREATE_MULTITHREADED po prostu zabezpiecza wszystkie metody D3D jedną wielką sekcją krytyczną, co tylko jeszcze bardziej spowalnia.
Można by spróbować wywoływać wszystko z wątku głównego, a drugiemu wątkowi zostawić ładowanie i dekompresję danych do obszarów zalockowanych przez wątek główny. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: SauRooN w Kwiecień 20, 2008, 14:40:07
SauRooN: Czy histereza będzie lepsza, niż trzymanie określonej liczby ostatnio użytych sektorów i ich wymiana na zasadzie LRU - Last Recently Used?

Podałem tylko ogólną zasadę. Dobór optymalnego algorytmu zależy od kilku czynników - wielkości sektorów, układu sektorów (szachownica/heksy/quadtree/pełne 3D itd.), złożoności mapy, pola widzenia itp. Ważne jest, żeby algorytm określający sektory do wyładowania dobrze współgrał z wybranym algorytmem predykcji sektorów do załadowania. Większość algorytmów predykcji doczytywania opiera się w dużej mierze o kierunek przemieszczania się postaci w ostatnim czasie. Dla takiej predykcji LRU praktycznie zawsze zawiedzie, kiedy nagle postać zawróci i będzie szła drogą, którą przyszła, ponieważ po przejściu pewnej drogi okaże się, że będziemy dochodzić do sektora, na którym od dłuższego czasu nie byliśmy, LRU powie nam, że trzeba go wyładować, a za momencik albo w tym samym czasie algorytm predykcji powie nam, że trzeba go załadować. Ta sama sytuacja wystąpi, kiedy będziemy poruszać się po kole. Ogólnie nigdy nie powinno się zakładać stałej ilości wczytanych sektorów w pamięci. Jeśli mamy odpowiedni zapas wolnej pamięci, powinniśmy zaufać algorytmom, które wybraliśmy i nie ograniczać ich pola działania narzucając dodatkowe reguły.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 20, 2008, 16:30:10
Postaram sie zrobić to tak, czy sie uda to nikt tego nie wie. Podzielę świat na części. Z bazy danych będę odczytywał na której mapie (część świata) znajduje sie gracz. Z pliku tekstowego albo jak wymyślę jakiś algorytm będę wczytywał sąsiednie mapy.Będę ładował te mapy a potem je zwalniał.

Dziękuję za odpowiedzi i na pewno pomoże mi to bardzo w dalszym rozwoju gry, lecz nie ma mowy o wątkach. Znaczy się że ja kiedyś z nimi pracowałem i pracowało mi się okropnie.
W takim razie polecam lekturę tego: http://msdn2.microsoft.com/en-us/library/aa365683(VS.85).aspx
Mniej więcej działa to tak, że prosisz Windowsa, żeby Ci coś załadował, a on Ci grzecznie mówi, kiedy skończy. :)
A nie mogę po prostu wsadzić ładowania i zwalniania map przed funkcja renderującą w pętli komunikatów?
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 20, 2008, 16:47:29
Cytuj
Z bazy danych będę odczytywał na której mapie (część świata) znajduje sie gracz.
Jaką bazę danych masz na myśli? Bo mam nadzieję, że nie MySQL, czy coś w tym stylu. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 20, 2008, 16:51:26
Moja (nasza) gra jest grą typu mmorts. Klient łączy się z serwerem a serwer z bazą mysql która zawiera informacje o graczu.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: SauRooN w Kwiecień 20, 2008, 17:34:00
:O Trzeba było tak mówić od razu... Kolego, w pierwszym poście mówiłeś o World of Warcraft, wszyscy myśleli, że o takim silniku rozmawiamy...
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: kacperz1 w Kwiecień 20, 2008, 17:37:27
Heh, ale to chodzi o dynamiczne ładowanie terenu co w grze mmorts może być takie same jak w grze mmorpg.
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Esidar w Kwiecień 21, 2008, 02:50:27
Esidar: Czy wobec tego jest możliwość tworzenia tych zasobów typu bufory i tekstury w osobnym wątku? Bo ja słyszałem, że to się kompletnie nie opłaca, bo urządzenie Direct3D utworzone z flagą D3DCREATE_MULTITHREADED po prostu zabezpiecza wszystkie metody D3D jedną wielką sekcją krytyczną, co tylko jeszcze bardziej spowalnia.

Nie wiem czy ktoś zrobił jakiś porządny test wydajności. W tej chwili portuję grę z X360 w której jest kod z żywca z xboxa i tam rendering jest na jednym wątku a wczytywanie zasobów, tworzenie shader'ów, tekstur, buforów itd na drugim. Jest oczywiście włączone D3DCREATE_MULTITHREADED i gra działa bardzo przyzwoicie (40-80fps na 7900GT - Core2 2.4GHz). Nie wiem czy gra by dużo zyskała gdyby wyłączyć tą flagę :) Z resztą zdaje się DX10 działa w tej chwili jako MULTITHREADED już zdefaulta. Koszt sekcji krytycznej która nie ma konfliktu, jest bardzo niski (ok. 100 cykli, jeśli dobrze pamiętam). W porównaniu z kosztem dowolnej funkcji DX9 która ma średnio 5,000 cykli to 100 w jedną czy drugą stronę to żadna różnica :)

Cytuj
Cytuj
Bez wątków i procesora z co najmniej dwoma rdzeniami nie dasz rady
Myślę, że tutaj nie jest aż tak tragicznie

Dlatego zaznaczyłem, że to zależy od tego co się ma :) W firmie mam w tej chwili ATI 1300 w kompie i gra o której wspomniałem wyżej (D3DCREATE_MULTITHREADED + 2 wątki) wczytuje się/uruchamia ze 3x wolniej niż na NVidii 7900GT. Oczywiście główny powód to tworzenie tekstur, buforów, shader'ów itd. Na szczęście mam DualCore ale wole na razie nawet nie myśleć co się zacznie dziać jak zacznę to odpalać na single core :)

Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 21, 2008, 03:21:16
Cytuj
W firmie mam w tej chwili ATI 1300 w kompie i gra o której wspomniałem wyżej (D3DCREATE_MULTITHREADED + 2 wątki) wczytuje się/uruchamia ze 3x wolniej niż na NVidii 7900GT. Oczywiście główny powód to tworzenie tekstur, buforów, shader'ów itd.
Możliwe że te dwa wątki sobie w takim przypadku zaczynają jednak przeszkadzać i nie chodzi tu jedynie o blokowanie sekcji krytycznej DirectX'a, ale znacznym problemem mogą być zapisy po PCI-E. Rdzenie są dwa, PCI-E jedno, więc w momencie, gdy oba rdzenie zaczną próbować dopchać się jednocześnie do karty graficznej, to może być ciężko, bo pomimo sekcji krytycznej drugi wątek cały czas przepycha tekstury do zalockowanej pamięci i w efekcie driver lub GPU mogą dostać fioła, jeżeli nie są zbyt dobrze na taką sytuację przygotowane. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Reg w Kwiecień 21, 2008, 11:02:33
Jak wygląda kwestia tworzenia zasobów w czasie kiedy urządzenie D3D jest utracone? Jeśli nie działa, to jak sobie z tym poradzić?
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Krzysiek K. w Kwiecień 21, 2008, 14:08:24
Jak wygląda kwestia tworzenia zasobów w czasie kiedy urządzenie D3D jest utracone? Jeśli nie działa, to jak sobie z tym poradzić?
Po prostu funkcje zaczną zwracać Ci kody błędów i tyle. :)
Tytuł: Odp: Dynamiczne ładowanie świata
Wiadomość wysłana przez: Esidar w Kwiecień 22, 2008, 00:02:34
Cytuj
W firmie mam w tej chwili ATI 1300 w kompie i gra o której wspomniałem wyżej (D3DCREATE_MULTITHREADED + 2 wątki) wczytuje się/uruchamia ze 3x wolniej niż na NVidii 7900GT. Oczywiście główny powód to tworzenie tekstur, buforów, shader'ów itd.
Możliwe że te dwa wątki sobie w takim przypadku zaczynają jednak przeszkadzać i nie chodzi tu jedynie o blokowanie sekcji krytycznej DirectX'a, ale znacznym problemem mogą być zapisy po PCI-E.

Bardziej jednak chodzi o sekcje krytyczne ;) W tym wypadku chodzi o to, że karta ATI X1300 jest kilka razy gorsza od Nvidii 7900GT. To oznacza, że DirectX więcej czasu spędza w driverze i w sekcji krytycznej. Częściej następują kolizje i przestoje.


Xbox radzi sobie z tym doskonale. Dużo lepiej niż PC. Na Xbox dzięki temu, że CPU dzieli pamięć z GPU, nie trzeba mieć sekcji krytycznej podczas renderingu + wczytywania. Można utworzyć dowolny zasób bez udziału DirectX za pomocą zwykłego malloc i fread :) Na Xbox'ie poprostu wszystkie dane są trzymane w pamięci CPU. Alokujemy obszar, wczytujemy dane (np. texturę) inicjujemy samemu pola struktury IDirect3DTextureBuffer i wszystko działa... A rendering na drugim wątku sobie spokojnie idzie.