我正在尝试使用 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 为 15 毫秒(~65 fps),分辨率为 1600x900
是的,但实际上,不是。如果同一个精灵在不修改的情况下被多次使用,那么这些对象拥有指向相同 SDL_Texture 的指针是最有效的。此外,生成纹理后可以释放图像。此外,在构造函数中加载它们可能不是一个好主意,因为动态创建的对象需要磁盘读取。
我建立了一个系统,其中实体在构造时被赋予另一个变量,如果它是正数,实体将检查并查看是否有任何其他实体为其精灵使用相同的文件,如果是,则仅使用相同的引用。
这意味着可以通过在关卡中生成单个子弹来有效处理生成和销毁的子弹等对象。
https://www.reddit.com/r/sdl/comments/lo24vt/is_it_okay_to_have_a_sdl_surface_and_sdl_texture/ https://www.reddit.com/r/sdl/comments/lo24vt/is_it_okay_to_have_a_sdl_surface_and_sdl_texture/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)