SDL 纹理和 CPU\内存问题

Posted

技术标签:

【中文标题】SDL 纹理和 CPU\\内存问题【英文标题】:SDL Textures and CPU\Memory issuesSDL 纹理和 CPU\内存问题 【发布时间】:2014-01-25 10:59:12 【问题描述】:

我用 SDL2.00 和 c++ 开发了一个游戏。我似乎遇到了内存和 CPU 问题。 CPU 使用率高达 40%,内存使用率每秒增加 5mg。

所以我认为原因是我处理纹理\精灵的方式。

我的问题是我应该为每个实例创建一个不同的/新的精灵/纹理吗?

例如,我有一个名为 Enemy 的类,其中包含与敌方怪物相关的所有变量和方法,例如 HP、伤害、位置、图像(纹理)等。该类包含要渲染到渲染器上的自己的纹理。

这是正确的方法吗?还是我应该事先为所有图像创建一个 Sprite/Texture 并根据需要进行渲染?

我想知道这是否会将两个不同的图像渲染到渲染器上:

RenderCopy(renderer, image);
image->SetPosition(X,Y);
RenderCopy(renderer,image);

还是要将精灵移动到新位置?

我认为我的问题是渲染器超载和/或加载了太多纹理。

让我知道你的想法。

【问题讨论】:

【参考方案1】:

OpenGL 不是场景图。这是一个绘图 API。因此,每次分配新纹理时,您都会创建一个消耗内存的新数据对象。您应该尽可能重复使用和共享资源。

【讨论】:

【参考方案2】:

我的问题是我应该为 每个实例?

不,除非精灵的每个实例使用不同的纹理,否则你应该重用它们,即只加载一次并存储指向精灵使用的纹理的指针。

我想知道这是否会将两个不同的图像渲染到 渲染器:

RenderCopy(renderer, image); 
image->SetPosition(X,Y);
RenderCopy(renderer,image);

还是要将精灵移动到新位置?

这将复制图像两次。首先在旧位置,然后在新位置。你会得到一个尾随图像。您可能应该清除先前的位置或在该位置渲染背景(或任何应该存在的位置)。

【讨论】:

非常感谢。这就解释了为什么我的记忆总是被搞砸了。我为每一个不同的实例使用不同的精灵哈哈。像弹丸一样,新的敌方怪物。所以事情越来越多。我现在会修复它。似乎随着内存使用量的增加,CPU 也在增加。但这也可能与 SDL 处理事件的方式有关。我也看到其他人抱怨 SDL 事件处理导致的 CPU 使用率。

以上是关于SDL 纹理和 CPU\内存问题的主要内容,如果未能解决你的问题,请参考以下文章

神秘的 OpenGL/SDL 内存增长

纹理的 SDL 渲染器参数,但表面不需要

OpenGL纹理内存布局和查找速度

一个操作让游戏内存立减50+%-CocosCreator性能优化之压缩纹理

表面和纹理之间的区别(SDL/一般)

CUDA 中的常量内存、纹理内存和全局内存