hoshimi、C#に悪戦苦闘
最近C#を勉強を始めたhoshimiです。クライアントがC#を希望していたので勉強し始めた感じですかね。
仕様はJavaにとてもよく似ているので学びやすかったです。といってもまだまだぜんぜん初心者ですが。
Javaで一度つくったサンプルをC#に乗せかえるところからはじめたのですがC#のダブルバッファリングの仕様が全然わからず悪戦苦闘。というかC#に関するサイトの絶対数が少ないのが厄介。いろいろ苦戦しました。
で結局以下のように実装したところ、うまくいったので、同じような悩みを抱えた人のためにメモっときます。
[C#] public class SampleWindow : Form { public const int FPS = 30; public SampleWindow{ //Design系init InitializeComponent(); //FormのDoubleBuffering設定 //参考:http://www.atmarkit.co.jp/fdotnet/dotnettips/197doublebuf/doublebuf.html this.SetStyle(ControlStyles.ResizeRedraw, true); this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.UserPaint, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); //Threadの設定 this.Paint += new PaintEventHandler(work); } private void work(object sender,PaintEventArgs e){ Graphics g = e.Graphics; //描画処理 Something.Draw(g); Invalidate(); System.Threading.Thread.Sleep(1000/FPS); } }
こんな感じで実装することで1000/FPSミリ秒毎にwork()が呼び出され描画処理を行ってくれるプログラムになるようです。ちなみにJavaのときはwhile(true)の中でwork()と同じ処理をしていました。
http://www.clks.jp/csg/によると実際にこの関数は1秒間に秒間に400000回ほどの計算を行ってくれるそうです。実際描画処理をするともちろん追いつかなくなりますがそれでも必要頻度の倍くらいはでているようです。
Thread.sleepをしないとCPUが100%に飛んでしまいかなり負担がかかるようですね。FPS = 60にしたところうちのintelMac 2GHz上で動くWindowsでは90%前後をうろついていました。やはりFPS = 30くらいが妥当なようですね。これで70前後でした。
もし上記よりもいい方法とかあったら、誰か教えてください。よろしくです。
あとネットでいろいろ調べてたのですが.netはmidiやmp3に関するクラスを提供していないようですね。WindowsAPIをむりやり使って再生しているところが涙をそそります。もしそれがガセで、再生できるAPIが存在するなら、誰か教えてください。よろしくです。
ちなみにMSDNには日本語ではありませんでした。英語は知らん。。。