我目前正在开发跨平台C ++游戏引擎(Windows,Mac,Ubuntu)。我已经写完了一个内存管理器模块,我希望其他模块可以使用。理想情况下,应该只有一个CMemoryManager类的实例来监督所有分配器(堆,竞技场等......)然后在工厂中将其传递给其他模块(输入,图形内容管理器等)的管理器方法
我应该如何共享内存模块?将CMemoryManager的实例传递给DLL进行所有内部分配是危险的吗?有什么风险,我该如何避免它们?我使用DLL / SO作为内存模块(而不是静态lib / archive)的原因是我想动态加载内存模块。通过这种方式,我可以分析各种实现,并可能在将来发布更高效的版本。
例如,
// Win32 Version
Result Engine::LoadModules()
{
HRESULT input_library = LoadLibrary(input_library_path);
if(input_library == NULL)
{
return Result::Failure(L"InputLibrary Failed To Load");
}
InputFactoryFuncPtr InputFactoryFunction;
InputFactoryFunction = (InputFactoryFuncPtr)GetProcAddress(input_library,"MakeFactory");
input_factory = InputFactoryFunction(memory_manager,...);
if(input_factory == NULL)
{
return Result::Failure(L"InputLibrary::MakeFactory Failed");
}
// The input_factory allocates memory using the memory_manager here.
keyboard = input_factory.create_keyboard();
return Result::Success;
}
换句话说,是否存在与传球相关的风险?跨DLL边界使用内存管理器实例?
答案 0 :(得分:0)
“只应该有一个CMemoryManager类的实例”这听起来像Singleton Pattern。回到核心问题,听起来像Plugin架构是你需要的。我会使内存管理器类和所有其他模块动态文件具有不同的类型 即
typedef enum {PLUGIN_TYPE_MEMMGR, PLUGIN_TYPE_NORMAL}PType;
然后在插件的构造函数中传递类型(以后可以有多个内存管理器)。然后会有一个插件管理器,它将由引擎创建,并将成为传递给每个插件的另一个参数。管理器应该只有一个具有MEMMGR类型的插件实例(您可以将其扩展为将来有多个代码更改)。插件管理器应该是一个单独的插件,以便每个插件都具有相同的内存管理器实例。
class PManager{
public:
PManager(){
m_memoryManager = LoadPluginSomeHow(PLUGIN_TYPE_MEMMGR);
}
CMemoryManager* GetMemoryManager(){
return m_memoryManager;
}
//other code to do task
private:
CMemoryManager* m_memoryManager;
};
我无法更好地解释,可能会编辑和添加信息,但您可以通过阅读this thread
来了解相关信息