2013年3月29日金曜日

マージソートのパフォーマンス

void main(void)
{
 //システム時間を計る計測器(クロック数で計算)
 B_Counter* sys_counter = new B_Counter();
 
 //配列を用意する
 int x[MAX_DATA];
 for(int i = 0; i < MAX_DATA; i ++){
  x[i] = (int)rand();
 } 

 //カウンター開始
 sys_counter->Counter_Start();
 
 //ソート開始
 merge_sort(x, 0, MAX_DATA-1);
 
 //カウンター終了
 sys_counter->Counter_End();
 
 //時間出力
 printf("%f \n", sys_counter->Get_Time());


 int c[MAX_DATA];

 for(int i = 0; i < MAX_DATA; i ++){
  c[i] = (int)rand();
 }

 sys_counter->Counter_Start();

 //一番単純なソートシステム
 for(int i = 0; i < MAX_DATA - 1; i ++){
  for(int a = i+1; a < MAX_DATA; a ++){
   if(c[i] > c[a]){
    int data = c[i];
    c[i] = c[a];
    c[a] = data;
   }
  }
 }
 sys_counter->Counter_End();

 printf("\n");
 
 printf("%f \n", sys_counter->Get_Time());
}

上記のようなソースでソートアルゴリズムをテストしてみました。

使っているアルゴリズムは二つで
1.マージソート。
2.アルゴリズムでも何でもない単純比較ソート。

その結果は・・・

・配列を20個用意した場合
マージソート : 0.008979
単純ソート : 0.004489

20個ソートしているのに何でここまで時間がかかるんだよって疑問を持ってる方もいらっしゃると思いますが、
そこんとこはおいといて時間をご覧ください。

なぜかマージソートのほうが時間がかかっています。
この時点では・・・マージソートって効率悪いなーって思ってましたが、配列の個数を増やしてみたら・・・

・配列を200個用意した場合
マージソート : 0.085299
単純ソート : 0.300150

200個ソートした時点でかなりの差が見られました。
明らかにマージソートのほうが速いですね。

・配列を2万個用意した場合
マージソート : 12.141984
単純ソート : 3484.902047

この時点ではもう相手にならないですねw
マージソートの特徴かもしれませんが、ソートする量によって時間も比例しますが、
大量のデータのソートに適してるという結果がみられました!

かなり有意義なスピード比べでしたねーw(知らなかったのは自分だけかもしれませんがw)

2013年3月26日火曜日

ビルボードとソートとパーティクル

パーティクル処理は処理的なところはさほど難しいものではない。
でも、いろんな問題が起きる。

その中で一番大変なところはビルボードの前後関係をみてソートを行わないといけないところだと思う。

例えば、ソートを行わないと



.......なぞの状態になる。
αブレンドというのは描画バッファのデータを元に演算を行う処理なので、描画を行うとき後ろのデータがないとこうなるのである。
さらにデップステストを行っているので、隠れているオブジェクトは切り取られてしまってビルボードの形が見えてしまっている。

要はデップステストをきると塗りつぶしになるので、デップステストを切ってみた。


.............確かにかくかくはなくなってはいるものの、前後関係が完全におかしい絵になってしまった。
なので、結局ソートをすることになった。
ソートを行って、描画してみると


......確かに前後関係も正しくなっているし、ビルボードの形も見えなくはなっているけど、カメラを少し動かしたりするとちらつく問題がまだあった。

描画位置(ワールド座標)でのソートなので、傾いたりすると頂点同士の重なり合いでちらつく問題が発生するのである。
最終的にはソートを行った後、デップステストを切って描画することにした。


綺麗な描画になっているのがわかる。
前後関係の問題もちらつく問題もなくなり、求めた形として描画されるようになった。

実際の動画です



2013年3月9日土曜日

ソース表示テスト!

#pragma once
#include 
#include 

class LOAD_WAV
{
private:
 typedef unsigned char u_char;
 typedef unsigned int u_int;
 typedef unsigned short u_short;

 struct fmt_header{
  u_short m_FormatID;
  u_short m_Channels;
  u_int m_SamplerPersec;
  u_int m_BytesPersec;
  u_short m_Blocksize;
  u_short m_BitsPersample;
 };

 struct chunk_data{
  u_char m_Chunk_tag[4];
  u_int m_Chunk_size;

 };

public:
 
 LOAD_WAV(void);
 ~LOAD_WAV(void);

 class Wav_Data{
  friend class LOAD_WAV;
 private:
  fmt_header format_data;
  void* pSound_data;
  size_t Data_size;
 public:

  const void* Get_SoundData(void) const
  {
   return pSound_data;
  }

  size_t Get_SoundData_Size(void) const
  {
   return Data_size;
  }

  const fmt_header* Get_FormatData(void) const
  {
   return &format_data;
  }
 };

 static void Load_Wave(const char* file_name, Wav_Data* pOut_data);
 static void Release_Wave(Wav_Data* pOut_data);
};


Waveファイルの読み込みクラスのヘッダーファイルですー
ソースコード表示チェックなんです。

(でも、ヘッダーだけなんですけどなんか恥ずかしいですねw)