c ++中静态类的优点和缺点

问题描述 投票:3回答:2

我正在使用OpenGL和C ++制作的小型游戏引擎中制作小型游戏。我在游戏中使用了一个称为ResourceManager的静态类,该类负责加载和返回纹理,着色器,音频等。它是静态的,因此我可以在任何类(如播放器)中获取纹理,着色器,音频等,而无需初始化它和评估它非常容易。但是,如果我想为不同的级别使用不同的纹理和音频,该怎么办,我必须将先前加载的所有纹理和声音都带到下一个级别,并继续添加它们。我认为这不是一个好习惯。我应该为该级别加载所需的纹理和音频,并在进入下一个级别时删除所有纹理和音频,并为该级别加载新的纹理和音频。这将使我的记忆很小。但是我不能使用静态类来做到这一点,因为它们没有构造函数析构函数。

我应该使用非静态类来处理不同级别的资源。

我很困惑。请告诉我我该怎么做,我做错了什么,以及游戏开发者如何解决该问题。

对不起,英语很差。感谢您的阅读。

c++ class static resources non-static
2个回答
2
投票

Singleton pattern似乎适合您想要实现的目标。

它具有普通类的灵活性,但是可以轻松地访问您建议的纯静态类。


1
投票

我不是游戏开发者,所以我不知道任何专门针对游戏的常见做法,但是我会做的。

  1. 创建用于从永久存储(磁盘)加载资产的无状态管道。这可以是静态类,也可以只是名称空间函数的集合。该管道仅用于加载您的资产。它不需要任何所有权或管理这些资产的寿命。
  2. 创建有状态资源缓存。这可以是std::vector<MyTextures>或自定义类型,其中包含特定级别所需的所有资源/资产。
  3. 将资源缓存的一个实例添加到代表您的级别的类中,并在初始化您的级别(可以在构造函数中或任何initializesetup中)时,将资源(使用步骤1的管道)加载到缓存中功能)。
  4. 创建该资源缓存类型的静态(也许是全局)实例。在此对象中,您可以存储与关卡不相关且超过关卡的所有内容(例如播放器纹理,声音效果,共享资产等)。

此设计的优点是(如果实施正确)一旦不再需要,资源就会自动卸载。例如,如果您完成一个关卡,那么您也将销毁关卡对象,并且由于资源缓存是关卡对象的一部分,这些资源也将被销毁(同样,如果正确实现了)。

© www.soinside.com 2019 - 2024. All rights reserved.