首页 > 解决方案 > 每个精灵都有一个 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

标签: c++sdl-2

解决方案


是的,但实际上,没有。如果相同的精灵将被多次使用而无需修改,那么这些对象具有指向相同 SDL_Texture 的指针是最有效的。此外,可以在生成纹理后释放图像。此外,在构造函数中加载这些可能不是一个好主意,因为动态生成的对象需要读取磁盘。

我建立了一个系统,其中实体在构造时被赋予另一个变量,如果是肯定的,实体将检查并查看是否有任何其他实体使用相同的文件作为它的精灵,如果是,则使用相同的引用。

这意味着可以通过在关卡中生成单个子弹来有效地处理生成和销毁的子弹等对象。

https://www.reddit.com/r/sdl/comments/lo24vt/is_it_okay_to_have_a_sdl_surface_and_sdl_texture/


推荐阅读