每个精灵都有一个 SDL_Surface 和 SDL_Texture 可以吗?

Is it okay to have a SDL_Surface and SDL_Texture for each sprite?

我正在尝试使用 cpp 在 SDL2 中构建游戏引擎。我有一个名为 'entity' 的 class,它有一些移动数据以及一些指向表面和纹理的指针。调用 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%,并且有大量透支,在 1600x900 的分辨率下,英尺为 15 毫秒(~65fps)

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

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

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

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