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

时间:2021-02-18 20:27:12

标签: c++ sdl-2

我正在尝试使用 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

1 个答案:

答案 0 :(得分:1)

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

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

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

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