首页 > 解决方案 > 大量的 libSDL 纹理

问题描述

我正在开发一个应用程序,向用户展示一个可能非常大的用户生成的图片库,当时大约有 10 张图片。该应用程序将使用 libSDL 和 2D 纹理以 C 语言实现以加速渲染。它在伪代码中的总体要点是:

while cycle < MAX_CYCLES
    while i < MAX_STEPS
        show a gallery of 10 image thumbnails
        while (poll events)
            if event == user has pushed next
            break
        i++
    scramble image galleries using a genetic algorithm
    cycle++

我可以在初始化时从磁盘加载每个图像,创建所有需要的纹理,因此图像呈现速度很快。但当然这会很慢,并且可能会分配大量纹理。

我将缩小图像进行展示,这样可以缓解问题,但集合的总大小取决于用户偏好。当然我可以限制最大值,但它不能小。

我正在考虑在每个周期的每个步骤中卸载每个未使用的图像,使用SDL_FreeSurfaceand SDL_DestroyTexture。这意味着每次都从磁盘重新加载数据,重新创建表面并重新创建纹理。这是一种可行的方法吗?

此外,我了解 SDL 纹理存储在 GPU 内存中,因此卡上的可用内存量应该是我主要关心的问题。我对吗?

综上所述,有没有推荐的方法来处理这种情况?

标签: cimagecachingsdl

解决方案


我会在内存中始终保留 3 张幻灯片。

上一页 - 当前 - 下一页

在呈现当前幻灯片时,预加载下一张幻灯片并卸载幻灯片编号 (Current - 2)。

此外,我了解 SDL 纹理存储在 GPU 内存中,因此卡上的可用内存量应该是我主要关心的问题。我对吗?

不完全是,如果 GPU(驱动程序)似乎有必要,它会将未使用的纹理数据外包给 RAM。

例如,如果您要呈现 10 个图像,因此内存中有 30 个图像,那么对于 2K(带 alpha)(1920 x 1080 x 4),您将需要大约 30 个图像。250 MB。

只要您不在嵌入式系统(或非常旧、过时的系统)上运行,这应该不是一个大问题。


推荐阅读