大量的 libSDL 纹理

Posted

技术标签:

【中文标题】大量的 libSDL 纹理【英文标题】:Huge array of libSDL textures 【发布时间】:2021-04-11 14:10:54 【问题描述】:

我正在开发一个应用程序,该应用程序向用户展示一个可能非常大的用户生成的图片库,当时大约有 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_FreeSurfaceSDL_DestroyTexture 在每个周期的每一步卸载每个未使用的图像。这意味着每次都从磁盘重新加载数据,重新创建表面并重新创建纹理。这是一种可行的方法吗?

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

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

【问题讨论】:

您最后一次滚动到列表的第三页是什么时候,尤其是图像的第三页?每次我看到“可能非常大量的……”时,这通常只是意味着你实际上并没有考虑到你的用例,而是抛出了完全任意的数字来试图看起来/感觉很重要。 并非如此。该应用程序的全部意义,现在是我使用的,是选择一个充满图像的目录并使用它。越大越好。我没有完全阐明目的,但它旨在帮助创造力,而不是实用程序。这听起来可能含糊不清,但底线是拥有大量图像是必需的。否则将毫无意义。 【参考方案1】:

我会一直记住 3 张幻灯片。

上一个 - 当前 - 下一个

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

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

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

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

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

【讨论】:

有趣的想法。我采用的是全有或全无的心态,但您的解决方案可以很好地向前和向后导航,而无需分配太多内存。 这是一个权衡。要么加热 CPU 或 GPU,要么填满内存。最好将负载平均分配到系统的所有组件。 我不认为这是一种权衡,而是唯一合理的解决方案。如果程序一次只显示数十张图像,没有人愿意等待数分钟让程序加载数千张图像。

以上是关于大量的 libSDL 纹理的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL:渲染具有大量纹理透明度的模型,没有绘制顺序?

glFramebufferTexture2D 性能

纹理贴图原理与实践图形学基础

cocos2dx内存优化

Simple2D-22(重构)纹理池

纹理特征提取方法:LBP, 灰度共生矩阵