SDL.net はやい!はやい!
学校祭に向けて、ゲームのプログラムをゲームしながら書き始めました。
昨晩、背景に流す雲をランダム生成したら面白そうかなと思い、下のコードを書き上げて寝ました。
const int MIN_PARTS = 8, // 雲のパーツ数の包括的下限 MAX_PARTS = 10, // 〃 包括的上限 WIDTH = 240, // 全体の幅 HEIGHT = 150; // 全体の高さ const short MIN_RADIUS = 10, // パーツの最小半径 MAX_RADIUS = 50; // 〃 最大半径 Color COLOR = Color.White; // 雲の色 // 雲のパーツ配列を初期化 IPrimitive[] parts = new IPrimitive[Cloud.random.Next(MIN_PARTS, MAX_PARTS + 1)]; for (int i = 0; i < parts.Length; i++) { // ランダムに円を生成する short radius = (short)Cloud.random.Next((int)MIN_RADIUS, (int)MAX_RADIUS + 1); Point axis = new Point( Cloud.random.Next(radius, WIDTH - radius), Cloud.random.Next(radius, HEIGHT - radius)); // (円がサーフェスからはみ出さないように座標を計算) parts[i] = new Circle(axis, radius); } // パーツをサーフェスに描画し、スプライトを初期化 Surface surface = new Surface(WIDTH, HEIGHT); foreach (IPrimitive part in parts) { surface.Draw(part, Color.White, true, true); } this.sprite = new Sprite(surface);
これがコンストラクタに入ってて、インスタンスを生成するたび毎回個性溢れるステキな雲たちが生まれるわけですね。
と、ここで、どうしてもGDI+を使っていた頃の不安が・・・。ベンチしてみました。
int tick = Environment.TickCount; this.c = new Cloud(new Point(400, 300)); genAverage = (genAverage * genCount + Environment.Tick - tick) / (genCount + 1); genCount++; Console.WriteLine(genAverage);
大雑把に抜粋するとこんな感じです。
そしてデバッグ実行、コンソールを眺めていると、
一発目、22(ミリ秒)。次、14→9.5→8.6→.....→0.7・・・?
なんか変化が凄まじい気がしなくも無い。最初は起動時の処理があるからなのか?あるいは平均を出すコードが間違っているのか?
ちょっと気持ち悪いので、先ほどのコンストラクタにThread.Sleep(10);をぶち込んで実行してみました。
平均を出すコードが間違っていてあんなに速いのなら、平均が10ミリ秒を下回るハズ。
実行してみました。
結果は先ほどのコンソールの数字+10になって、最後は10.7*****で収束。
どうやらSDL.netをナメていたようです、余裕の速さだわ。
/* 追記
さっき余計なソフトを切って走らせっぱなしで昼食を取って戻ってきたら0.02ミリ秒で安定してた・・・
これで勝つる・・・! */