c++ - 每个精灵都有一个 SDL_Surface 和 SDL_Texture 可以吗?
问题描述
我正在尝试使用 cpp 在 SDL2 中构建游戏引擎。我有一个名为“实体”的类,它有一些运动数据以及一些指向表面和纹理的指针。函数“render”被称为 inmass 以基于 g_entities 向量渲染每个精灵。
class entity {
...
SDL_Surface* image;
SDL_Texture* texture;
entity(const char* filename, SDL_Renderer * renderer, float size) {
image = IMG_Load(filename);
width = image->w * size;
height = image->h * size;
texture = SDL_CreateTextureFromSurface(renderer, image);
g_entities.push_back(this);
}
~entity() {
SDL_DestroyTexture(texture);
SDL_FreeSurface(image);
//TODO remove from g_entities
}
void render(SDL_Renderer * renderer) {
SDL_Rect dstrect = { x, y, width, height };
SDL_RenderCopy(renderer, texture, NULL, &dstrect);
}
...
}
所以程序为每个精灵创建一个新的纹理和表面。这个可以吗?有更快的方法吗?
如果是这样,我想在它变得更大的混乱之前把它清理干净。
我用 96 个精灵制作了一个测试关卡,每个精灵占屏幕的 2%,有大量的过度绘制,ft 是 15ms (~65fps),分辨率为 1600x900
解决方案
是的,但实际上,没有。如果相同的精灵将被多次使用而无需修改,那么这些对象具有指向相同 SDL_Texture 的指针是最有效的。此外,可以在生成纹理后释放图像。此外,在构造函数中加载这些可能不是一个好主意,因为动态生成的对象需要读取磁盘。
我建立了一个系统,其中实体在构造时被赋予另一个变量,如果是肯定的,实体将检查并查看是否有任何其他实体使用相同的文件作为它的精灵,如果是,则使用相同的引用。
这意味着可以通过在关卡中生成单个子弹来有效地处理生成和销毁的子弹等对象。
https://www.reddit.com/r/sdl/comments/lo24vt/is_it_okay_to_have_a_sdl_surface_and_sdl_texture/
推荐阅读
- visual-studio-code - vscode 在哪里存储文件关联覆盖?
- python - 具有多重继承和 pytest 的 Super 产生 TypeError
- c# - 为什么 Visual Studio 不显示我的 WinForm 项目构建?
- bash - 如何在 bash 中并排打印多个 .csv 文件并找出这 3 个文件之间的区别
- javascript - 为 NodeJS 单元测试运行内存中的沙盒 Neo4J 数据库
- r - 如果条件 --- 需要 TRUE/FALSE 的缺失值
- c++ - 如何对向量的元素进行排序?
- python - 检查 ARPingResult 的输出?
- python - 如何将函数/方法应用于多个变量?
- android - 在使用 Unity 3D 开发的 Android App 中使用 Open Weather Map API