【问题标题】:Asyncronous loading of GLControl with C#, WinForms and OpenTK使用 C#、WinForms 和 OpenTK 异步加载 GLControl
【发布时间】:2013-12-13 15:06:54
【问题描述】:

我正在尝试制作一个跨平台的 WinForms 软件,其中包含一个 GUI 和一个 3D 窗口。目前,我有一个带有两个选项卡的 TabControl,第二个需要包含 GLControl(3D 窗口)。但是,当我切换到第二个选项卡时,程序在加载 GLControl 时挂起,可能是因为它们在同一个线程上。

我试过用这样的 BackgroundWorker 解决它:

    private void onTabSwitch(object sender, EventArgs e)
    {
        if (tabControl.SelectedIndex == 1)
            if (area3D == null)
                this.worker.RunWorkerAsync();
    }

    ...
    ...
    ...

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        area3D = new GLControl();

        area3D.Load += new EventHandler(area3D_Load);
        area3D.Paint += new PaintEventHandler(area3D_Paint);
        area3D.BackColor = Color.Black;
        area3D.Size = new Size(438, 435);
        area3D.Location = new Point(200, 0);

        this.Invoke((MethodInvoker)delegate
        {
           secondTab.Controls.Add(area3D); // runs on UI thread
        });
    }

但它仍然挂起,因为第二个选项卡仍在主 GUI 线程上。我该如何解决这个问题?

最重要的是,我需要在另一个选项卡中设置一个 3D 窗口,该窗口将异步加载,或者只是不会导致我的程序挂起。

【问题讨论】:

    标签: c# winforms opengl user-interface opentk


    【解决方案1】:

    GLControl 是一个 WinForms 控件,所以它必须在主线程上创建。有各种可能的解决方案。我会按顺序尝试这些:

    1. 切换到加载速度更快的 OpenTK 1.1(在 Windows 上快 2 到 3 倍,具体取决于 GPU 和 CPU。)

    2. 如果它只是一个单独的 GLControl,则强制它在应用程序启动时创建。缓存此实例并将其手动附加到选项卡(无论何时切换到/从选项卡都不要销毁并重新创建它。)

      OpenGL 渲染上下文是重量级对象,因此这将是一个巨大的胜利。这很有可能会解决问题:

      public MainForm : Form
      {
          readonly GLControl glControl = new GLControl();
      
          public MainForm()
          {
              InitializeComponent();
              glControl.CreateControl(); // Force the GLControl to be created
          }
      
          // ...
      }
      
    3. 创建您自己的异步 GLControl。 GLControl 由两部分组成:System.Windows.Forms.Control(必须在主线程上创建)和 OpenTK.GraphicsContext(可以在单独的线程上创建。)

      相关代码可见:opentk/Source/GLControl/GLControl.cs:203

      如您所见,这只是使用了 WinForms 和 OpenTK 的公共 API,因此这种方法是可行的。但是,我建议先尝试 1 和 2,并且仅在它们无法产生您所寻求的性能改进时才使用核解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多