我最近遇到了我的游戏项目问题。当我在启动时加载超过一定数量的纹理(大约1000)时,我收到有关内存的错误(因为我必须在XNA中使用32位)。我是自学成才,因此只掌握游戏编程“正确”方法的基本知识。项目本身变得越来越大,虽然我尝试将图像压缩在一起等,但我将不得不在整个项目中使用超过1000个纹理。
我的问题是:如何使用vb.net在其他时间点加载纹理,而不是在XNA启动时加载纹理? (我根本没有使用我所知道的课程,所以如果可能的话,我希望远离那些课程)
感谢您的任何反馈! /基督教
答案 0 :(得分:1)
我无法评论,所以我只是把我的想法放在这里。宣言时间:我也是自学成才的开发者,因此我使用的算法并未被证明是标准或类似的东西。希望能帮助到你!
我正在使用一个名为GContent的单一课堂,女孩是" instanciated" (更喜欢加载)游戏开始时的第一件事。这个类是静态的,它有游戏中所有纹理,声音和spritefonts的列表。所以,在我的代码中的任何地方我都可以放GContent.Texture("texture_folder\\texture_name");
(类似于声音和spritefont)。现在,在此函数加载Texture2D
之前,它会检查它的纹理列表,并尝试返回一个纹理,其中包含参数中要求的名称。如果找到正确的纹理,它将从列表中返回纹理。如果没有,则使用Content.Load(textureFullPath);
(完整路径,我不是指" C:\ Users \ ....")来加载纹理,为其命名({ {1}})等于参数Texture2D.Name
,将该纹理添加到列表中,然后返回新纹理。
所以,如果我在游戏开始时没有加载所有资源,你玩游戏的次数越多,加载的纹理就越多。现在,我想你可以简单地拥有一个textureFullPath
数组来表示单个级别,地图或主菜单使用的所有纹理......这样,您可以轻松创建将要执行的功能string
并尝试加载或卸载一个地图/级别/菜单的所有纹理...
所以,我的答案非常多:拥有一个静态类,其中包含资产列表和加载/卸载资产,这些资产来自您想要的游戏!
另外,如果我的回答对您有帮助,请将其作为答案检查:)
答案 1 :(得分:1)
所以答案似乎比我预期的要容易得多,如果我现在做的那样(?)。
我只需加载所有" Worlds"所需的内容在游戏开始时(在Protected Overrides Sub LoadContent()中),然后是Dispose()和Load.Content(),具体取决于以后加载的World(在我选择的任何Sub中):
{{1}}
如果我还没有发现任何问题,这似乎可以解决问题并且不会让我在开始时留下内存错误。
谢谢 Davor Mlinaric 和 Monset 帮助我