0

我正在开发一个应用程序,我想显示大量图像,用户可以从中选择以全分辨率查看。图像的子集将在任何时间点对用户可见,其数量由用户使用控件控制,该控件将增加或减小缩略图大小。

目前,如果加载的图像过多,应用程序自然会耗尽 GPU 内存。

我正在考虑几种可能的方法,但我不确定哪种方法最好:

  1. 将完整图像加载到内存中,使用 CPU 将图像大小调整为缩略图,然后将其发送到 GPU
  2. 将完整图像加载到内存中,将其发送到 GPU 并在 GPU 上使用 vkCmdBlitImage 将其调整为缩略图大小
  3. 从应该嵌入jpeg的文件中加载缩略图(?)?(不知道如何获取缩略图)

解决这个问题的最佳方法是什么?

4

1 回答 1

0

调整大小的方法有点独立于内存不足。在几乎任何设备上,您都应该有足够的内存来存储帧缓冲区和几屏的图像。因此,如果您试图在内存中保留许多、许多屏幕的位图(全分辨率或缩略图),那么您只会耗尽内存。如果你想支持任意多的图像,你需要想出一个方案,你只在内存中保留当前可见缩略图的位图,加上一些额外的“上一个”和“下一个”用于平滑滚动。当用户滚动时,您需要从存储中获取新的,替换与滚动方向相反的那些。

如果您有能力将缩略图与全分辨率图像一起保存,那么您应该只加载它们,直到您需要全分辨率版本。这将使滚动更容易跟上(如果“存储”==“云”,则使用更少的带宽,或者如果在电池供电的设备上使用电源等)。

否则,如果你真的只能从存储中加载全分辨率图像,那么在 GPU 上调整大小可能会更快,但会使用更多的瞬态内存。在调整 GPU 大小时,您可以尝试使用 VK_EXT_external_memory_host 来避免其中一个副本。如果您只在内存中保留可见和近乎可见的图像,那么使用更多的瞬态内存应该不是问题。

于 2018-10-19T03:27:03.757 回答