2013-03-12 213 views
7

我正在做一個XNA遊戲,在那裏我經常測試無法編輯的東西,而無需重新編譯整個遊戲應用程序(編輯並繼續不起作用)。到達實際測試事物的地步可能需要一段時間,因爲遊戲需要加載其資源。從另一個進程訪問對象

我希望做的是要能資源中加載一些後盾應用和遊戲應用程序以某種方式訪問​​它們,無需重新加載遊戲資源的大部分時間。在.Net應用程序中是否有可能,還是有其他的方法我應該知道?

我的XNA遊戲很大程度上依賴於Texture2D實例,特別是一個包含多個Dictionary<string, Texture2D>對象的庫類。

我想我希望能夠做的是有從遊戲應用程序內的後盾應用程序直接訪問這些字典。 XNA遊戲只能針對32位平臺,我希望支持應用程序爲64位,因此它可以保存超過1(.5)千兆字節的資源數據(如果可能的話)。


單元測試方法(或不使用某些資源的任何暗示)會爲我在這種情況下不能正常工作,因爲我開發的視覺效果,它涉及到每一個紋理我有。

+0

也許你可以設計出更好的單元測試,它不會加載巨大的資源並使用模擬數據而不是生產版本所需的大量數據。 http://stackoverflow.com/questions/14087/automated-testing-a-game#14136。 http://stackoverflow.com/questions/32835/xna-unit-testing – Despertar 2013-03-17 18:34:06

回答

-1

這一切都歸結到你想要在運行時加載什麼類型的資源。如果您只想測試紋理/聲音資產,則可以使用Texture2D.FromFileSoundEffect.FromStream(必須是PCM波形文件)方法來解決此問題。但是,如果您想要動態加載模型,則需要額外的努力。這個sample的適應應該能夠完成你所需要的。

+0

加載編譯的資源或原始圖像文件之間沒有顯着差異,無論哪種方式需要花費大量的時間在應用程序到達之前加載它們第一個屏幕。我想避免一直這樣做,而是隻加載一次資源,並將它們保存到新編譯的遊戲應用程序中。 – user1306322 2013-03-17 18:28:01

+0

好吧,如果這是速度/阻塞問題,您可以嘗試在單獨的線程(使用Cell互斥包裝器)中包含所有內容管理並輪詢以檢查資產是否已完全加載。這篇博文給出了XNA中線程安全內容加載的相當好的概述:http://konaju.com/?p=27。然而,XNA強制使用GraphicsDevice的關鍵部分,所以如果你想要做大量的動畫/資產加載,這可能會讓你的項目變慢。在這種情況下,這可能會起作用:http://theinstructionlimit.com/a-shared-content-manager-for-xna。 – 2013-03-17 18:35:59

+0

這就是2688個獨立的圖像文件,沒有任何東西可以完成*加速*。除非他們已經在任何時候加載並可用。 – user1306322 2013-03-17 18:39:31

0

如果您想爲您的資源動態提供商/服務器你有一大堆的可能性。用C#你可以使用f.e. WCF提供您的資源。但正如之前提到的,也許你應該試着去分離你的設計,這樣你才能真正使用單元測試而不是開始整個遊戲。

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

+0

不幸的是,大多數新功能都與遊戲的所有方面密切相關,所以我需要幾乎所有需要加載的東西,這樣我可以親眼看到變化,這也需要所有紋理。 – user1306322 2013-03-17 18:46:29

+0

你正在改變什麼? – SACO 2013-03-17 18:52:06

+0

有按鈕的菜單,可以執行各種與遊戲機制相關的操作,例如創建一堆射彈,運行一些動畫,修改粒子屬性,這意味着我需要看到它們,這意味着加載紋理。 – user1306322 2013-03-17 18:54:44

2

如果你想卸載編譯的DLL充分的資源,那麼你可能想看看在應用程序域的重裝。即您可以使用它卸載並重新加載程序集。但是你必須通過「代理」來訪問他們的內容。您無法直接卸載程序集,這就是您需要域名的原因。

這個想法是加載了一個主應用程序,它永遠不會關閉。然後你有一個獨立的Game.dll,你在它自己的應用程序域中加載。然後,您將所有資源加載到主應用程序中。所以你需要爲遊戲製作一個「代理」界面來獲取資源,但這應該是可行的。

關於這個的好處是,你停止你game.dll,重新編譯,重新加載組件,並給它仍然加載資源。

一條可能的路線。

+0

聽起來像我腦子裏想的,但我該怎麼做呢? – user1306322 2013-03-17 18:44:55

+0

那麼你需要問/回答另外一個問題:_你可以通過代理服務器跨域分享XNA資源。如果你想要走這條路線,你首先需要問這個問題。我無法幫助你。 – 2013-03-17 18:46:59

+0

我認爲* XNA資源*屬於* .Net資源*類別,至少我認爲共享'Texture2D'實例的問題不應該比'System.Drawing.Bitmap'多。 – user1306322 2013-03-17 18:48:44

0

爲什麼不使用WCF命名管道?

只是讓你的應用程序使用WCF servernamed pip提供 集(字符串spriteName,紋理的Texture2D)

,這將改變紋理..