在 OpenGL 动画停止工作之前,C# 窗体不会加载



我目前正在进行一个项目,该项目允许我通过让一些游戏专用的人工智能(它们是C#类)与其他智能进行比较。该项目包括一个OpenGL动画来查看这些类之间的匹配。

所以基本上我有一个包含OpenGL动画的Form,还有一个包含选项和比较信息的Form。但我的动画Form似乎在计算期间冻结了项目的其余部分。

这是我开始比赛时的代码:

        FormGL formGL = new FormGL();
        formGL.Show();

        // Variables declaration
        //
        // Variable declaration
        while (verifVictoire(plateau, _playerTurn) == false && nombreTours < 64)
        {
            if (_playerTurn == 1) _playerTurn = 2;
            else _playerTurn = 1;
            try
            {
                // Calculation part
                if (_playerTurn == 1) resultat = _AIPlayer1.Joue(plateau, _playerTurn);
                else resultat = _AIPlayer2.Joue(plateau, _playerTurn);
                pion = resultat[2] * 16 + resultat[1] * 4 + resultat[0] + 1;
                plateau[resultat[0], resultat[1], resultat[2]] = _playerTurn;
                nombreTours++;
                formGL.affichPion(_playerTurn, pion); // Send the move to display in the animation
                Thread.Sleep(100); // Pause before next move
            }
            catch (IndexOutOfRangeException)
            {
                // Exception management
            }
        }

当我使用该代码时,两个窗体都打开了,但在动画停止工作之前,它们都没有完成加载。所以我只能看到两个表单(空),动画会正确更新,但任何其他内容(标签、菜单、按钮…)都是不可见的,直到动画停止工作。我知道Thread.Sleep正在影响当前线程,这可能是原因,但即使我删除了它,问题仍然会出现。

FormGL包含这些方法(以及其他方法,但我认为它们不可能对此负责)

public FormGL()
    {
        this.CenterToScreen();
        InitializeComponent();
    }
private void FormGL_Load(object sender, EventArgs e)
    {
        GLPanel.InitializeContexts();
        Gl.glShadeModel(Gl.GL_SMOOTH);
        Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        Gl.glClearDepth(1.0f);
        Gl.glEnable(Gl.GL_DEPTH_TEST);
        Gl.glDepthFunc(Gl.GL_LEQUAL);
        GLWindow_Resize(this, null);
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
    }
public void affichPion(int Player, int Pion)
    {
        if (Pion != 0)
        {
            joueur[Pion - 1] = Player;
            positionJeton[Pion - 1] = Pion;
            GLWindow_Resize(this, null);
            GLPanel.Refresh();
        }
    }
public void GLWindow_Resize(object sender, EventArgs e)
    {
        float aspect = (float)GLPanel.Width / (float)GLPanel.Height; 
        Gl.glMatrixMode(Gl.GL_PROJECTION);
        Gl.glLoadIdentity();
        Gl.glViewport(0, 0, GLPanel.Width, GLPanel.Height);
        Glu.gluPerspective(60, aspect, 1.0, 300);
        Gl.glMatrixMode(Gl.GL_MODELVIEW);
        Gl.glLoadIdentity();
        Glu.gluLookAt(x, y, z, centerX, centerY, centerZ, upX, upY, upZ);
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
    }
private void FormGL_Resize(object sender, EventArgs e)
    {
        GLWindow_Resize(this, null);
        GLPanel.Refresh();
    }

您没有给表单任何时间来绘制自己。试着在睡觉前调整Application.DoEvents()

然而,我建议在不同的线程上运行while循环,以从一开始就避免这个问题。

最新更新