2013-03-12 26 views
7

Tworzę grę XNA, w której często testuję rzeczy, których nie można edytować bez przebudowania całej aplikacji gry (edycja i kontynuacja nie działa). Dojście do punktu, w którym faktycznie testuję rzeczy, może zająć trochę czasu, ponieważ gra musi załadować swoje zasoby.Uzyskiwanie dostępu do obiektów z innego procesu

Chciałbym móc załadować zasoby do niektórych aplikacji zabezpieczających i uzyskać do nich dostęp z aplikacji, eliminując konieczność przeładowywania zasobów gry przez większość czasu. Czy jest to możliwe w aplikacjach .Net, czy jest jakieś inne podejście, o którym powinienem wiedzieć?

Moja gra XNA polega w dużej mierze na instancjach Texture2D, a konkretnie na klasie biblioteki z kilkoma obiektami Dictionary<string, Texture2D>.

Myślę, że chciałbym móc uzyskać bezpośredni dostęp do tych słowników w aplikacji do tworzenia kopii z poziomu aplikacji gry. Gry XNA mogą być kierowane tylko na platformy 32-bitowe i chciałbym, aby aplikacja do tworzenia kopii zapasowych była 64-bitowa, więc mogłaby pomieścić więcej niż 1 (.5) gigabajta danych zasobów (jeśli to możliwe).


Testy jednostkowe podejście (lub cokolwiek oznacza nie korzystaniu z niektórych zasobów) nie będzie pracować dla mnie w tym przypadku, ponieważ Zajmuję się tworzeniem efektów wizualnych i obejmuje każdą fakturę mam.

+0

Może uda Ci się zaprojektować lepsze testy jednostkowe, które nie obciążą ogromnych zasobów i nie użyją próbnych danych zamiast dużych ilości danych potrzebnych do wersji produkcyjnej. http://stackoverflow.com/questions/14087/automated-testing-a-game#14136. http://stackoverflow.com/questions/32835/xna-unit-testing – Despertar

Odpowiedz

-1

Wszystko sprowadza się do rodzaju zasobów, które chcesz załadować w czasie wykonywania. Jeśli chcesz przetestować zasoby tekstur/dźwięków, możesz to rozwiązać za pomocą metod falowych PCM (MUST be PCM): Texture2D.FromFile i SoundEffect.FromStream. Jeśli jednak chcesz dynamicznie ładować modele, wymaga to trochę więcej wysiłku. Adaptacja tego sample powinna być w stanie osiągnąć to, czego potrzebujesz.

+0

Nie ma znaczącej różnicy między ładowaniem skompilowanych zasobów lub surowych plików obrazów, w obu przypadkach potrzeba dużo czasu, aby załadować je wszystkie zanim aplikacja uzyska dostęp do pierwszy ekran. Chciałbym unikać robienia tego przez cały czas, a zamiast tego ładować zasoby tylko raz i pozostawić je dostępnym dla nowo skompilowanych aplikacji do gier. – user1306322

+0

Cóż, jeśli jest to problem związany z prędkością/blokowaniem, spróbuj wpisać całe zarządzanie zawartością w osobnym wątku (z opakowaniem komórek mutex) i odpytaj, aby sprawdzić, czy zasoby są w pełni załadowane. Ten post na blogu daje całkiem niezły przegląd ładowanych treści wątków w XNA: http://konaju.com/?p=27. Jednak XNA narzuca krytyczną sekcję w stosunku do jakiegokolwiek użycia GraphicsDevice, więc jeśli próbujesz zrobić dużo animacji/ładowania zasobów, może to spowolnić twój projekt DUŻO. W takim przypadku może to zadziałać lepiej: http://theinstructionlimit.com/a-shared-content-manager-for-xna. –

+0

To jest 2688 osobnych plików graficznych, nic nie można zrobić, aby przyspieszyć * to * wystarczająco. Chyba że są już załadowane i dostępne w każdej chwili. – user1306322

0

Jeśli chcesz mieć dynamicznego dostawcę/serwer dla swoich zasobów, masz mnóstwo możliwości. Przy C# można użyć f.e. WCF, aby zapewnić zasoby. Ale jak już wcześniej wspomniano, może powinieneś spróbować oddzielić swój projekt, aby móc faktycznie używać testów jednostkowych zamiast rozpoczynać całą grę.

http://en.wikipedia.org/wiki/Unit_testing

+0

Niestety, większość nowych funkcji jest ściśle związana z wszystkimi aspektami gry, więc potrzebuję prawie wszystkiego, aby załadować, więc mogłem zobaczyć na własne oczy zmiany, które również wymagają wszystkich tekstur. – user1306322

+0

Jakie rzeczy się zmieniasz? – SACO

+0

Menu z przyciskami, które uruchamiają metody, które robią różne rodzaje mechaniki gry, dotyczą rzeczy, takich jak tworzenie pęczków pocisków, uruchamianie animacji, modyfikowanie właściwości cząstek, a to oznacza, że ​​muszę je zobaczyć, co z kolei oznacza załadowane tekstury. – user1306322

2

Jeśli chcesz wyładować się przeładować skompilowany bibliotek DLL pełne zasobów to może warto spojrzeć na Application domen. np. można z niego ładować i ponownie ładować złoenia. Ale musisz uzyskać dostęp do ich zawartości za pośrednictwem "proxy". Nie można bezpośrednio rozładowywać złożeń, dlatego potrzebne są domeny.

Ideą byłoby załadowanie aplikacji głównej, która nigdy się nie zamyka. Następnie masz osobny plik Game.dll, który ładujesz we własnej domenie aplikacji. Następnie ładujesz wszystkie swoje zasoby do swojej głównej aplikacji. Musisz więc stworzyć interfejs "proxy", aby uzyskać dostęp do zasobów, ale powinno to być możliwe.

Dobrą rzeczą jest to, że zatrzymasz grę game.dll, przekompilujesz ją, ponownie załadujesz zestaw i dasz mu wciąż ładowane zasoby.

Jedna z możliwych tras.

+0

Brzmi jak to, co miałem na myśli, ale jak mam to zrobić dokładnie? – user1306322

+0

Cóż, musisz zadać/odpowiedzieć na inne pytanie: _Możesz udostępniać zasoby XNA między domenami za pośrednictwem serwerów proxy. Jeśli chcesz podążać tą trasą, musisz najpierw zapytać. Nie mogę ci pomóc z tym. –

+0

Myślę, że * zasoby XNA * należą do kategorii * .Net zasobów *, przynajmniej nie sądzę, że powinno być więcej problemów z udostępnianiem instancji "Texture2D" niż "System.Drawing.Bitmap". – user1306322

0

dlaczego nie używać potoku nazwanego WCF?

prostu zrobić swoją aplikację jako WCF server użyciu named pip i zapewniają Set (spriteName ciąg Texture2D tekstury)

że zmieni tekstury ..

Powiązane problemy