我正在用C ++编写一个围绕GLFW和OpenGL的简单包装,作为练习。我有Window
一堂课Renderer
。本Window
类拥有一个Renderer
成员。
Window
在其构造函数中设置GLFW上下文并运行主循环,并调用其Renderer
成员进行绘制。Renderer
在其构造函数中设置缓冲区,并执行OpenGL操作。
我遇到的问题是OpenGL调用需要具有可用的OpenGL上下文。如果要Renderer
在调用的构造函数之前进行初始化,则会在创建GLFW上下文之前调用的构造Window
函数Renderer
。
我所做的是我将a存储unique_ptr
到Renderer
in中Window
,并调用std::make_unique<Renderer>
的构造函数Window
。然后,在析构函数中,我std::unique_ptr::reset()
在销毁GLFW上下文之前进行了调用,以便可以进行OpenGL调用以使用仍然有效的上下文来释放内容。
class Window
{
public:
Window()
{
//initialising GLFW and creating an OpenGL context
//...
m_renderer = std::make_unique<Renderer>();
}
~Window()
{
m_renderer.reset();
glfwTerminate();
}
int run()
{
while(...)
{
m_renderer->draw();
//...
}
return 0;
}
private:
std::unique_ptr<Renderer> m_renderer;
//...
}
class Renderer
{
public:
Renderer() { //Set buffers }
~Renderer() { //Free buffers }
draw() { glDrawElements(...); //... }
private:
//...
}
int main()
{
Window window();
return window->run();
}
我知道对象应该已经在构造函数的主体中初始化了,在这里情况并非如此。我觉得我可能在向后Renderer
和Window
往回之间做了一些依赖,或者我的总体架构是错误的。我宁愿根据作用域在适当的时候调用构造函数和析构函数,而不要依靠我手动触发它。
有什么更好的解决方案?
我建议您创建一个单独的类,将其GLFWInit
调用glfwTerminate()
进行GLFW初始化并调用其析构函数。然后,您有两个选择:
将类型的对象嵌入GLFWInit
您的Window
类中。尽早放置成员,但至少将其放置在成员之前m_renderer
。
派生Window
的类GLFWInit
。
两种方法均确保GLFW在其初始化之前被初始化m_renderer
并在其之后被拆除。然后,您甚至不必使渲染器成为指针,并且可以直接嵌入该成员(如果可行)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句