gpt4 book ai didi

c++ - 为什么在使用不相关的宏时会阻止 while 循环结束?

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:18 25 4
gpt4 key购买 nike

我正在用 C++ 编写一个 opengl 应用程序,最近在使用自定义调试宏时遇到了一个问题。当我使用宏时,主循环在尝试结束循环时挂起,并且当我关闭窗口时程序将无法正常结束。据我所知,宏不应该影响循环的结束,但是当我编辑宏以使其不执行任何操作时,while 循环会按预期结束。我已经测试过 glfwWindowShouldClose() 确实返回了预期值,并且在返回时它到达了循环的末尾。问题是当它到达循环的末尾时,它不会跳出循环而只是挂起。这是受影响的代码。

while循环目前只在main函数中...

while (!glfwWindowShouldClose(window.getWindow()))
{
GLCall(glClear(GL_COLOR_BUFFER_BIT));
vertexBuffer.bind();
indexBuffer.bind();
shader.bind();
shader.setUniformMat4("projection", projection);
shader.setUniformMat4("translation", translation);

GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
glfwSwapBuffers(window.getWindow());

glfwPollEvents();
}

glfwTerminate();

和宏...

#define ASSERT(x) if(!x) __debugbreak()
#define GLCall(x) Engine::clearGLError(); x; ASSERT(Engine::logGlError(__LINE__, __FILE__))

namespace Engine {
void clearGLError()
{
while (glGetError() != 0);
}
int logGlError(const int& lineNumber, const std::string& fileName)
{
int error = glGetError();
if (error != 0)
Console::TextUtils::errorText("Opengl error on line: " + std::to_string(lineNumber) + " in " + fileName + " Code:" + std::to_string(error));
return error == 0 ? 1 : 0;
}
}

最佳答案

感谢@derhass,我发现了这个问题。我相信我理解这个问题。 glGetError() 出现问题。当程序被关闭并且一切都被破坏时它被调用。在析构函数中,GLCall() 被用来判断那里的调用是否正常工作。发生问题是因为在 glfw 终止后调用的析构函数被终止,因此窗口上下文被破坏。这意味着每次我调用 glGetError 来清除错误标签时,这本身就会创建另一个错误标签。

解决方案是确保缓冲区和程序在终止 glfw 之前超出范围,这可以通过在 glfwTerminate() 之前使用一组带有结束括号的大括号来完成。就像下面...

    {
//...buffers and program variables here

while (!glfwWindowShouldClose(window.getWindow()))
{
GLCall(glClear(GL_COLOR_BUFFER_BIT));
vertexBuffer.bind();
indexBuffer.bind();
shader.bind();
shader.setUniformMat4("projection", projection);
shader.setUniformMat4("translation", translation);

GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0));
GLCall(glfwSwapBuffers(window.getWindow()));

GLCall(glfwPollEvents());
}
}
glfwTerminate();

关于c++ - 为什么在使用不相关的宏时会阻止 while 循环结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51990759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com