ChromiumWebBrowser мигает черным после скрытия без отключения WebGL

Я пытаюсь скрыть свой ChromiumWebBrowser за изображениями, видео и т. д. Но каждый раз, когда он меняется с ChromiumWebBrowser на что-то еще, кроме пустой панели или другого ChromiumWebBrowser, он мигает черным на несколько кадров.

Пример моей проблемы

аппаратное обеспечение:

  • i7-8559U
  • Intel IRI плюс графика 655

CefSharp версии 79.1.350 для программы Winform

Вот что я пробовал:

  • BringToFront другой PictureBox
  • Отправить в поддержку ChromiumWebBrowser
  • Видимость панели
  • Панель двойнаяШлифованная

Я также включаю Cef.EnableHighDPISupport(); но безуспешно.

Единственное, что пока сработало, это ДОБАВИТЬ SetOffScreenRenderingBestPerformanceArgs();

Но, к сожалению, он отключает реализацию WebGL :/ и я хотел бы сохранить его для более поздних целей.

static class Program
{
    /// <summary>
    /// Point d'entrée principal de l'application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Cef.EnableHighDPISupport();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

 public partial class Form1 : Form
{

    private static ChromiumWebBrowser chrome;
    private PictureBox ImageBox = new PictureBox();

    private Panel pPictureBox = new Panel();
    private Panel pChromium = new Panel();
    Timer timer = new Timer();
    public Form1()
    {

        InitializeComponent();

        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

        ImageBox.Image = Properties.Resources._3080;
        ImageBox.SizeMode = PictureBoxSizeMode.StretchImage;
        pPictureBox.Controls.Add(ImageBox);
        ImageBox.Dock = DockStyle.Fill;

        pPictureBox.Dock = DockStyle.Fill;
        pPictureBox.Size = this.Size;
        this.Controls.Add(pPictureBox); 
        pPictureBox.BringToFront();

        InitializeChromium();

        timer.Interval = 7000;
        timer.Start();
        timer.Tick += Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        if (pChromium.Visible)
        {
            pChromium.Hide();   
        }
        else
        {
            pChromium.Show();
        }
    }

    private void InitializeChromium()
    {


        pChromium.Dock = DockStyle.Fill;
        pChromium.Size = this.Size;
        CefSettings settings = new CefSettings();

        //Work but disable WebGL
        //settings.SetOffScreenRenderingBestPerformanceArgs();

        //settings.DisableGpuAcceleration();
        Cef.Initialize(settings);

        chrome = new ChromiumWebBrowser("https://www.apple.com/ca/airpods-pro/");

        pChromium.Controls.Add(chrome);
        this.Controls.Add(pChromium);

        chrome.Dock = DockStyle.Fill;

        pChromium.BringToFront();
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.White;
        this.ClientSize = new System.Drawing.Size(1904, 1041);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Cef.Shutdown();
    }
}

У вас есть какое-нибудь решение?


person Nicholas Chartier    schedule 31.01.2020    source источник
comment
Пожалуйста, укажите версию, которую вы используете. SetOffScreenRenderingBestPerformanceArgs следует использовать только для версий WPF и OffScreen.   -  person amaitland    schedule 31.01.2020
comment
Отключение ускорения графического процессора должно переключиться на использование swiftshader для webgl, поэтому будет использоваться программный рендеринг.   -  person amaitland    schedule 31.01.2020
comment
Вы пробовали на другом оборудовании? Часто такая проблема связана с видеокартой/драйвером.   -  person amaitland    schedule 01.02.2020
comment
@amaitland Кажется, ваше решение работает, но оно отключает графику графического процессора для ChromeWebbrowser WebGL, а средство визуализации использует только ЦП моей рабочей станции для рендеринга. Я попробую протестировать код дома, чтобы увидеть, исправит ли он (i7-4770k и GTX 1070).   -  person Nicholas Chartier    schedule 01.02.2020
comment
Я не знал, что предлагаю решение, просто предоставляю разъяснение. Я обновил устаревшие исходные комментарии в github.com/cefsharp/CefSharp/commit/   -  person amaitland    schedule 01.02.2020
comment
Убедитесь, что у вас установлены последние версии графических драйверов, вы можете поэкспериментировать с peter. sh/experiments/chromium-command-line-switches/#use-angle и peter.sh/experiments/chromium-command-line-switches/ Я бы посоветовал вам вызывать Cef.EnableHighDPISupport(); намного раньше при выполнении ваших приложений, так как слишком поздний вызов ничего не даст. github.com/cefsharp/CefSharp. MinimalExample/blob/master/   -  person amaitland    schedule 01.02.2020
comment
Что такое BufferedPanel?   -  person amaitland    schedule 01.02.2020
comment
Ваш пример кода неполный, пожалуйста, предоставьте полный пример. Он не компилируется.   -  person amaitland    schedule 01.02.2020
comment
Вы пытались скомпилировать свой код изолированно? Нигде не объявлен pictureBox2, пожалуйста, убедитесь, что он скомпилирован самостоятельно. Используйте стандартную панель для ChromiumWebBrowser, двойная буферизация не поддерживается элементом управления.   -  person amaitland    schedule 02.02.2020
comment
Я могу подтвердить, что эта ошибка все еще происходит с этим кодом на моем домашнем компьютере (i7-4770k / GTX 1070).   -  person Nicholas Chartier    schedule 02.02.2020
comment
Я собираюсь поэкспериментировать с peter.sh/experiments/chromium-command- line-switches/#use-angle Завтра.   -  person Nicholas Chartier    schedule 02.02.2020
comment
Код по-прежнему зависит от ресурса, который не включен, если вы можете разветвить github.com/cefsharp/CefSharp.MinimalExample отправьте изменения на GitHub, и я посмотрю, если у меня будет время.   -  person amaitland    schedule 02.02.2020
comment
ресурс представляет собой изображение, выберите любое   -  person Nicholas Chartier    schedule 02.02.2020
comment
@amaitland после экспериментов с командой peter.sh оба работают на начальном компьютерном оборудовании.   -  person Nicholas Chartier    schedule 03.02.2020


Ответы (1)


Вот мой окончательный код для всех, кто заинтересован

Ссылки команды, рекомендованной @amaitland

https://peter.sh/experiments/chromium-command-line-switches/#use-angle https://peter.sh/experiments/chromium-command-line-switches/#in-process-gpu

обе команды работают индивидуально

Cef.EnableHighDPISupport(); не требуется, но рекомендуется

static void Main()
    {
        Cef.EnableHighDPISupport();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

public partial class Form1 : Form
{

    private static ChromiumWebBrowser chrome;
    private PictureBox ImageBox = new PictureBox();

    private Panel pPictureBox = new Panel();
    private Panel pChromium = new Panel();
    Timer timer = new Timer();
    public Form1()
    {

        InitializeComponent();

        this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

        //any image here
        ImageBox.Image = Properties.Resources._3080;
        ImageBox.SizeMode = PictureBoxSizeMode.StretchImage;
        pPictureBox.Controls.Add(ImageBox);
        ImageBox.Dock = DockStyle.Fill;

        pPictureBox.Dock = DockStyle.Fill;
        pPictureBox.Size = this.Size;
        this.Controls.Add(pPictureBox);
        pPictureBox.BringToFront();

        InitializeChromium();

        timer.Interval = 7000;
        timer.Start();
        timer.Tick += Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        if (pChromium.Visible)
        {
            pChromium.Hide();
        }
        else
        {
            pChromium.Show();
        }
    }

    private void InitializeChromium()
    {


        pChromium.Dock = DockStyle.Fill;
        pChromium.Size = this.Size;
        CefSettings settings = new CefSettings();


        //-------------------------------------------------------------------------

        settings.CefCommandLineArgs.Add("in-process-gpu");

        //got best FPS with this renderer on "my machine"
        settings.CefCommandLineArgs.Add("use-angle", "gl");

        //-------------------------------------------------------------------------

        //Work but disable WebGL
        //settings.SetOffScreenRenderingBestPerformanceArgs();
        //settings.DisableGpuAcceleration();
        Cef.Initialize(settings);

        chrome = new ChromiumWebBrowser("https://alteredqualia.com/three/examples/webgl_pasta.html");

        pChromium.Controls.Add(chrome);
        this.Controls.Add(pChromium);

        chrome.Dock = DockStyle.Fill;

        pChromium.BringToFront();
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.White;
        this.ClientSize = new System.Drawing.Size(1904, 1041);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        Cef.Shutdown();
    }
}
person Nicholas Chartier    schedule 03.02.2020
comment
Если use-angle работает, то я бы выбрал этот вариант, поскольку в процессе GPU обычно не используется в Windows. - person amaitland; 03.02.2020