Questions tagged «memory-efficiency»

一种组织和存储信息的方法,以使其占用尽可能少的内存,同时仍保留其全部用处。

6
具有2000万个图块的地图会使游戏内存不足,如何避免呢?
在加载额外的巨大地图时,加载方法会在创建新的地图图块实例时抛出内存不足异常。我希望至少在服务器应用程序(如果可能的话,在客户端)上处理整个地图。我应该如何解决这个问题? UPD:这里的问题是,当仍有可用的可用内存时,如何使游戏停止崩溃。至于将地图分成几块,这是一个好方法,但不是我想要的。 UPD2:最初,我去给每个新的tile类实例分配了一个纹理,这就是占用大量内存(也需要加载时间)的原因。现在,它占用的空间减少了大约四倍。多亏了每个人,现在我可以运行巨大的地图,而无需考虑将它们分解成几块。 UPD3:重写代码以查看图块属性的数组是否运行得更快或消耗的内存更少(比相应的图块中的对象属性表示的对象属性要小),我发现不仅花了很多时间去尝试,而且并没有带来任何性能上的改进,并且使游戏难以调试。

1
具有相同位大小的渲染目标为何很重要?
我目前正在考虑需要哪种类型的GBuffer进行延迟着色,因此我也尝试在线上记录最常见的GBuffer及其格式。 我见过的大多数GBuffer都为每个渲染目标使用了相同的位大小,通常还导致未使用的通道。但是,作为我的GBuffer的第一个猜测,在纸上,我需要两个24位目标和两个32个目标,或者三个24和一个32。 我知道每个附件都具有相同的“大小”可以更好地对齐,但是实际上来讲,浪费信道(或保留它们以供将来使用)并拥有所有大小相同的RT更好还是还是应该使用所需的大小?在前一种情况下,为什么有这样的优势,是否仍将24位填充到32位呢?

3
为什么资产需要自定义内存管理?
几乎所有与游戏编程有关的资源,尤其是3D开放世界游戏,都在谈论您如何不断地在磁盘,系统内存和视频内存之间进行资产的卸载和重新加载。我可以在控制台上理解这一点,因为它们具有非常简单的内存管理方案,无法处理任何潜在的溢出。 但是,在PC上,情况就大不相同了。操作系统提供了用于系统内存的虚拟内存,图形驱动程序负责从CPU到GPU的来回交换。那么,为什么一次加载所有内容并仅处理预取并仅确保在交换所需资产时没有阻塞是为什么呢? 这并不是说所有的事情都是像那样天真地分配的malloc。一切都将保持连续并且与缓存保持一致。如果您不必担心手动分页和换页,那么提高内存访问的效率可以说很容易... 更新: 在对异步缓冲区传输进行了一些了解之后,我发现图形驱动程序可以自动分页内存的方式不是最理想的。CPU资源是否也是如此?即,是否最好始终手动管理何时在存在虚拟内存的情况下何时加载和卸载给定资源?


2
在大型瓷砖地图以及地牢上“分区”区域
我的游戏以伪无限且随机生成的方式具有类似于Minecraft的地图。又大 假设用户浏览了1000x1000区域(此处为2D),那么就是1,000,000个图块。 显然,我将无法将其全部存储在内存中。我也不只是想忽略10个磁贴或任何半径范围之外的所有内容-两者都不会更新(所有NPC,也许是反应性磁贴),我将不得不处理诸如1382,12918之类的笨拙位置。 因此,如果我要将其拆分为块或区域或诸如64x64的瓷砖之类的东西,则必须存储每个瓷砖和对象的位置,例如: 块a,b 位置x,y。 但是,如果我想要在地图中使用地牢之类的东西怎么办?因此,一块瓷砖可能会导致一个40层的地牢,每个区域的面积为40x40。我无法将它们完全存储在同一张地图中。 还有记忆的一面;我可以合理地同时在内存中存储多少?我可以很容易地按ID进行平铺,并在那里有普通的2D阵列。还是再说一次,有没有比包含瓦片类型的数据文件更有效的解决方案?所以对于64x64 ..那只会是20K或其他 我希望尽可能多地加载最真实的更新。但是我不知道在不浪费内存的情况下可以达到什么样的限制。


2
表示转换层次结构的有效结构
谁能建议一种内存有效的方式来表示矩阵树,例如在层次模型中? 我特别热衷于保留数据局部性,并且我怀疑数组结构(矩阵和矩阵的索引)类型的方法可能合适。 与许多链矩阵计算一样,此结构可能会在内存中被复制很多,因此具有连续存储将是一大好处。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.