none
Windows 10のDisplay時間が遅い RRS feed

  • 質問

  • VS C#で、外部ADデータをUSB経由でWindosPCに一定周期で取り込み、PCで処理し表示するプログラムを作っています。つまり、ADデータ入力から処理と表示をPCで92ms毎にリアルタイムで実行してます。Windows7のC#では92msより十分早い時間でループを実行するので、当該プログラムは、動作してくれます。

    ところが、高速といわれるWondows10 PCでビルトして実行して、92msの実行時間を超えてしまう。

    そんなバカな、とても驚きです。 USBのループバック、メモリーアクセス、演算時間などはWin10 PCが確かに早いようです。

    ところが、文字の表示やPixcel表示がとても遅い。Testプログラムで確かめました。

    店頭で最新春バージョンの高速PCやゲームマシンでTestプログラムを実行させて貰いましたが、私のP社のWin7が何倍か高速です。

    どなたかWindows 10のDisplayの表示時間を早くするアイデア・方法をお持ちでしたら、ご教授ください。

    上記質問を少し詳しくしましたので、よろしくお願いします。

    【使用環境など】
    ・Visual Studio 2008 Professionalと2013 Express
    ・使用言語C#
    ・Windows7 ProffesionalとWondows 10 Professional
     Windows7はもともとWin8 PCをWin7にダウングレードしたPCです。
    ・.Net Framework3.5(2008).Net Fraework4(2013)
    ・プロジェクトの種類:Windowsフォームアプリケーション
    ・Win7はSSD 512GB搭載で、SSDの寿命の関係でWin10に乗り換える必要があり、今まで作った
    資産をそのまま使いたいのです。

    ご指摘のwindows 10 Fall Creators Update...での更新は、
    「この更新プログラムはお使いのコンピュータでは適用できません。」の
    コメントで失敗しました。

    【Testプログラムの概要】
    Win7 C#2008で作ったWindowsフォームアプリケーションです。Win7とWin10の実行時間を調べるプログラム。
    RZ符号のようなノイズ加味したパルス列をオシロスコープで観測するような
    波形を表示するものです。

    ① 予めパルス列データをintデータファイルをして作成しました。これを読み込み、
    Size 647,273のpictureBoxにpixel数320の画面に表示しました。高さ(振幅)最大75

    ② timer1.interval=90で90ms毎に、③の描画メソッドを実行し、①のデータをX軸2pixel分移動させ、動画もどきを作り、320の1画面ごとにStopwatch sw = ... sw.Reset、sw.Start、sw.Stopメソッドで表示時間を測定しました。

    ③ 描画メソッドは下記の通りです。このメソッドで2pixelデータを使って320pixel分表示しました。
    ・sw.Reset(), sw.Start()
     ・Graphics g = pictureBox1.CreateGraphics();
     ・Pen blackPen = new Pen(Color.Red, 2); 
    ・ g.Clear(Color,White);
    ・ 320pixel画面表示(g.drawLine(blackPen,x0,y0,x1,y1);) X軸の分解能は2です。
    ・ blackPen.Dispose(); g.Dispose();
    ・ sw.Stop(); 
    ・ textBoxに画面表示時間を表示
    ④ textBoxに表示された時間をWin7とWin10で目視で比較する。

    【 ADデータ処理プログラムの概要】
    プログラミングは、時間がある時だけ、実施します。ですから、数年この開発をしています。

    ①ADは約5kHzでサンプリングします。1サンプリングで16bit(ワード)のデータに変換します。
    このデータを512ワード分溜まったら、PCにUSB HSスピードで転送します。この512ワード転送周期が
    約92msです。転送時間は一瞬で無視できるはずです。(ADは外部マイコンで制御してます)

    ② PCはtimer1で70msで割り込んで、USB buffer fullであれば、512ワードデータを取得し、ノイズ除去などを
    行い、2値化した後、デコードします。デコード結果で表示すべき文字があれば、textBoxに表示させています。
    ③ デコードまでの実行時間が70msより十分早い必要があります。デコードが完了すれば、timer1割り込み待ちになり、割り込んだらUSB受信buffer fullまで待機します。

    ④ デコードまでに上記Testプログラムのような(もっと小さな画素画面)のメソッドがあり、Win7で実行できて
    Win10で実行できないでは、困る状況です。

    以上、Win10の表示時間を早くする仕方をご教授ください。


    2018年5月22日 23:36

回答

  • 私の環境(Win7=ビルド7601,Win10=1607)でも Win10 の方が遅くなっておりました。(下記コード参照)←※追伸があります

    Win7 = 8 ミリ秒
    Win10 = 40 ミリ秒 ←遅い

    ダブルバッファリングを使って描画することで回避できるようです。下記コードの button2_Click メソッドをご参照ください。

    Win7 = 4 ミリ秒
    Win10 = 2 ミリ秒

    using System;
    using System.Diagnostics;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            Stopwatch sw = new Stopwatch();
            Random cRandom = new Random();
            Image bitmap = new Bitmap(320, 320);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                sw.Reset();
                sw.Start();
                Graphics g = pictureBox1.CreateGraphics();
                Pen blackPen = new Pen(Color.Red, 2);
                g.Clear(Color.White);
                for (int i = 0; i < 160; i++)
                {
                    int x0 = i * 2;
                    int x1 = x0 + 2;
                    int y0 = cRandom.Next() % 320;
                    int y1 = cRandom.Next() % 320;
                    g.DrawLine(blackPen, x0, y0, x1, y1);
                }
                blackPen.Dispose();
                g.Dispose();
                sw.Stop();
                {
                    TimeSpan ts = sw.Elapsed;
                    string elapsedTime = String.Format("{0}", ts.Milliseconds);
                    textBox1.Text = "Time " + elapsedTime;
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                sw.Reset();
                sw.Start();
                Graphics g = Graphics.FromImage(bitmap);
                Pen blackPen = new Pen(Color.Red, 2);
                g.Clear(Color.White);
                for (int i = 0; i < 160; i++)
                {
                    int x0 = i * 2;
                    int x1 = x0 + 2;
                    int y0 = cRandom.Next() % 320;
                    int y1 = cRandom.Next() % 320;
                    g.DrawLine(blackPen, x0, y0, x1, y1);
                }
                blackPen.Dispose();
                g.Dispose();
                pictureBox1.Image = bitmap;
                sw.Stop();
                {
                    TimeSpan ts = sw.Elapsed;
                    string elapsedTime = String.Format("{0}", ts.Milliseconds);
                    textBox1.Text = "Time " + elapsedTime;
                }
            }
        }
    }


    追伸:
    この現象ですが、Win10 と Win7 による違いというよりは、DWM が有効(Win7 では Windows Aero が有効でタイトルバーが半透明の状態)のときに本現象が発生するようです。Win10 では常に有効で、Win7 では、「コントロールパネル」→「システム」→「システムの詳細設定」→「パフォーマンス」→「設定」→「ウィンドウとボタンに視覚スタイルを使用する」と「デスクトップコンポジションを有効にする」が ON でウィンドウのタイトルバーが半透明になっていれば Aero が有効です。(Aero が有効にならない環境もあるようです。)

    2018年5月28日 1:34
  • kenjinoteさんの言うダブルバッファリングを使って描画する方法を参考にさせて頂き、私のTestプログラムを変更しました。
    私のTestでは、Win7よりWin10が2倍位時間がかかりますが、pictureBox1.Image=bitmapの方が、10倍以上高速描画できるので、Win10で実行してもマージンが取れます。

    情報ありがとうございました。
    • 回答としてマーク isao1_1000 2018年5月31日 15:38
    2018年5月31日 15:38

すべての返信

  • isao1_1000 さん、こんにちは。フォーラム オペレーターの立花です。
    MSDN フォーラムへご投稿くださいましてありがとうございます。

    Windows 10 Fall Creators Update では下記の情報がございましたので、
    ご参考までに記載させていただきますね (更新プログラムにて修正済み) 。

    Windows 10 Fall Creators Update での GetPixel、SetPixel 関数の処理速度について
    https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2017/12/08/fcu_getpixel/

    また、Windows 10 で文字の表示などが遅いとのことですが、お試しされたのは
    どのような Test プログラムで試されたのでしょうか。
    例 ) WPF に Label で文字列を表示しただけのプログラム、など。

    状況は、USB メモリからデータを読み出して、処理と表示を 92ms 毎に実行している、
    ということでしょうか。
    そのあたりの詳細情報や開発環境などの詳細をご記載いただいた方が、
    情報が寄せられやすくなりますのでご検討ください。

    それでは参加者皆様からの情報をおまちくださいませ。

    フォーラム利用時の注意点のお知らせです。
    ※初めてご投稿された方を対象にお知らせしています。

    ご利用の際は、下記内容をお守りいただきますと
    情報が寄せられやすくなりますので、ぜひご一読ください。
    フォーラムでご質問頂くにあたっての注意点
    フォーラムのご利用方法(質問の投稿)について
    フォーラムへの回答に関するガイドラインおよびフォーラム運営について(再掲)
    ご意見、ご要望はこちらのフォーラムまで。
    各種設定方法はフォーラム内を [かんたん フォーラム ガイド] で検索してみてください。


    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年5月23日 0:43
    モデレータ
  • isao1_1000 さん、こんにちは。フォーラム オペレーターの立花です。
    ご質問の詳細を追記くださいましてありがとうございます。

    更新プログラムは適用できなかったのですね。

    その他情報をお持ちの方がいらっしゃればご返信くださると思いますので、
    お待ちください。

    また、深刻度が高い問題に見受けられますので、スケージュールなどの
    状況によっては有償サポートのご利用もご検討ください。

    フォーラムでご質問頂くにあたっての注意点 - 業務上のクリティカルなトラブル等について

    ※ [回答としてマーク] をご設定くださいましてありがとうございます。
        こちらを設定されますと、解決済みと判断され情報が寄せられにくくなってしまいますので、
        私にて解除させていただきますね。参考となる情報が寄せられましたら、その投稿にご設定ください。

    参考になった投稿には回答としてマークの設定にご協力ください
    MSDN/TechNet Community Support 立花楓

    2018年5月28日 0:41
    モデレータ
  • 私の環境(Win7=ビルド7601,Win10=1607)でも Win10 の方が遅くなっておりました。(下記コード参照)←※追伸があります

    Win7 = 8 ミリ秒
    Win10 = 40 ミリ秒 ←遅い

    ダブルバッファリングを使って描画することで回避できるようです。下記コードの button2_Click メソッドをご参照ください。

    Win7 = 4 ミリ秒
    Win10 = 2 ミリ秒

    using System;
    using System.Diagnostics;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace WindowsFormsApp1
    {
        public partial class Form1 : Form
        {
            Stopwatch sw = new Stopwatch();
            Random cRandom = new Random();
            Image bitmap = new Bitmap(320, 320);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                sw.Reset();
                sw.Start();
                Graphics g = pictureBox1.CreateGraphics();
                Pen blackPen = new Pen(Color.Red, 2);
                g.Clear(Color.White);
                for (int i = 0; i < 160; i++)
                {
                    int x0 = i * 2;
                    int x1 = x0 + 2;
                    int y0 = cRandom.Next() % 320;
                    int y1 = cRandom.Next() % 320;
                    g.DrawLine(blackPen, x0, y0, x1, y1);
                }
                blackPen.Dispose();
                g.Dispose();
                sw.Stop();
                {
                    TimeSpan ts = sw.Elapsed;
                    string elapsedTime = String.Format("{0}", ts.Milliseconds);
                    textBox1.Text = "Time " + elapsedTime;
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                sw.Reset();
                sw.Start();
                Graphics g = Graphics.FromImage(bitmap);
                Pen blackPen = new Pen(Color.Red, 2);
                g.Clear(Color.White);
                for (int i = 0; i < 160; i++)
                {
                    int x0 = i * 2;
                    int x1 = x0 + 2;
                    int y0 = cRandom.Next() % 320;
                    int y1 = cRandom.Next() % 320;
                    g.DrawLine(blackPen, x0, y0, x1, y1);
                }
                blackPen.Dispose();
                g.Dispose();
                pictureBox1.Image = bitmap;
                sw.Stop();
                {
                    TimeSpan ts = sw.Elapsed;
                    string elapsedTime = String.Format("{0}", ts.Milliseconds);
                    textBox1.Text = "Time " + elapsedTime;
                }
            }
        }
    }


    追伸:
    この現象ですが、Win10 と Win7 による違いというよりは、DWM が有効(Win7 では Windows Aero が有効でタイトルバーが半透明の状態)のときに本現象が発生するようです。Win10 では常に有効で、Win7 では、「コントロールパネル」→「システム」→「システムの詳細設定」→「パフォーマンス」→「設定」→「ウィンドウとボタンに視覚スタイルを使用する」と「デスクトップコンポジションを有効にする」が ON でウィンドウのタイトルバーが半透明になっていれば Aero が有効です。(Aero が有効にならない環境もあるようです。)

    2018年5月28日 1:34
  • GraphicsをpictureBoxから得るのではなく、別途Imageを用意する。確かに、遅いときには300msかかっていたが、 Image を差し替える様にすると3ms以内に終わる様になった。

    Jitta@わんくま同盟

    2018年5月28日 1:38
  • kenjinoteさんの言うダブルバッファリングを使って描画する方法を参考にさせて頂き、私のTestプログラムを変更しました。
    私のTestでは、Win7よりWin10が2倍位時間がかかりますが、pictureBox1.Image=bitmapの方が、10倍以上高速描画できるので、Win10で実行してもマージンが取れます。

    情報ありがとうございました。
    • 回答としてマーク isao1_1000 2018年5月31日 15:38
    2018年5月31日 15:38