小编Mic*_*nas的帖子

当渲染循环中运行大量模拟时如何刷新 GUI 框架?

我正在尝试创建一个应用程序,用户可以通过按一下按钮来运行(耗时的)后端物理模拟。但与此同时,我希望 GUI 的其余部分保持功能,并且在模拟结束之前不会“冻结”。现在我知道在 OpenGL 中组合多个线程进行渲染并不是一个好主意,所以我的想法相当简单:1)使用一个线程(我想是默认线程)来运行除物理之外的所有内容。2)使用另一个线程,仅运行我在一个函数中限制的物理,正如您将看到的。但即使这样,整个 GUI 仍然“冻结”,因此在物理结束之前它毫无用处。我该如何解决这个问题?

下面是我认为可行的代码。它呈现一个“测试按钮”,以检查我是否可以在物理运行时实际按下它,以及触发大量计算的“运行物理”按钮。

#include"imgui.h"
#include"imgui_impl_glfw.h"
#include"imgui_impl_opengl3.h"

#include<GL/glew.h>
#include<GLFW/glfw3.h>

#include<cstdio>
#include<cmath>
#include<thread>

//Hypothetical "heavy" computation
void run_physics()
{
    for (double z = 0.0; z < 10000.0; z += 0.001)
    {
        double y = exp(sin(sqrt(z*abs(z)+ cos(z))));
    }
    return;
}

int main()
{
    glfwInit();
    glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow *window = glfwCreateWindow(800,600, "Test", NULL, NULL);
    if (window == NULL)
    {
        printf("Failed to open a glfw window. Exiting...\n");
        return 0;
    }

    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (glewInit() …
Run Code Online (Sandbox Code Playgroud)

c++ opengl multithreading glfw imgui

1
推荐指数
1
解决办法
357
查看次数

标签 统计

c++ ×1

glfw ×1

imgui ×1

multithreading ×1

opengl ×1