我正在尝试开发游戏引擎,并正在添加批处理渲染功能。我这里有 2 个问题,
-
有一些异常的访问冲突错误。
我将 Buffer 类初始化为 Renderer 类的成员变量
Scope<VertexBuffer> vertex = CreateScope<OpenGLVertexBuffer>(ME_MAX_VERTEX_BUFFER_SIZE, GL_DYNAMIC_DRAW); Scope<IndexBuffer> index = CreateScope<OpenGLIndexBuffer>(ME_MAX_INDEX_BUFFER_SIZE, GL_DYNAMIC_DRAW);
上面的意思是
Scope
是指unique_ptr
,CreateScope
是指make_unique
代码文件:
Header: https://github.com/VikramSGIT/MarsEngine/blob/master/MarsEngine/src/RenderAPI/OpenGL/OpenGLRenderer.cpp
CPP: https://github.com/VikramSGIT/MarsEngine/blob/master/MarsEngine/src/RenderAPI/OpenGL/OpenGLRenderer.cpp
顶点缓冲区类的构造函数(索引缓冲区类具有类似的构造函数)OpenGLVertexBuffer::OpenGLVertexBuffer(const unsigned int& size, const unsigned int& mode) :Emptybuffer(true) { ME_PROFILE_TRACE_CALL(); GLLogCall(glGenBuffers(1, &m_RendererID)); GLLogCall(glBindBuffer(GL_ARRAY_BUFFER, m_RendererID)); GLLogCall(glBufferData(GL_ARRAY_BUFFER, size, nullptr, mode)); }
在
glGenBuffers(1 ,&m_RendererID)
完全有访问违规。 甚至双倍检查我在glfwMakeCurrentContext(window)
后打电话给glewInit()
。 -
当我尝试在上面的OpenGLVertexBuffer类构造函数中添加
glewInit()
时。出现了另一个不寻常的问题,glDeleteBuffers(1, &m_RendererID)
卡在未终止!!OpenGLVertexBuffer::~OpenGLVertexBuffer() { ME_PROFILE_TRACE_CALL(); GLLogCall(glDeleteBuffers(1, &m_RendererID)); }
然后我在VS Code中运行了相同的代码模型,运行流畅。所以这得出结论,我没有司机问题。
需要注意的是,我的屏幕上没有输出(不包括在内,因为我不确定逻辑),ImGui 运行流畅。但是我在逻辑的每个部分都运行断点,缓冲区按预期填充 ba 可以 fain waz goin wroonng :(
链接到我的 Github 存储库:https://github.com/VikramSGIT/MarsEngine
template<typename T>
using Ref = std::shared_ptr<T>;
template<typename T>
using Scope = std::shared_ptr<T>;
template<typename T, typename... Args>
Ref<T> CreateRef(Args&& ... args) { return std::make_shared<T>(std::forward<Args (args)...); }
template<typename T, typename ... Args>
Scope<T> CreateScope(Args&& ...args) { return std::make_unique<T>(std::forward<Args> (args)...); }
CreateScope
函数创建一个unique_ptr
,但Scope
对象存储shared_ptr
。我怀疑问题是这样的:
template<typename T>
using Scope = std::shared_ptr<T>;
这应该是:
template<typename T>
using Scope = std::unique_ptr<T>;