忍者ブログ
不定期に気が向いたら更新します
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


 ご無沙汰しています。
何していたかは・・・特に何もしていませんorz
ただ、ちょっとプログラムから離れていました。
自作ライブラリ(WINAPI)のほうは、次回にまわしたいと思います。

さて、今回は、ゲーム制作において、使用頻度の高い三角関数(sin,cos)の計算速度、呼び出し速度をちょっとだけ実験してみました。(といっても大したことはしていませんが・・・)

 まず、三角関数を使用する際は、引数はdouble方にします。
計算内容は

y = sin(x1) + cos(x2) (0 <= x1 <= 2π , 0 <= x2 <= 2π) ...(i)

です。ここで、速度比較のために、あらかじめ、テンプレートとして、それぞれの0~2πのデータ(360)を読み込ませた配列も同様の計算に使用してみます。

実験内容は以下の通りです。
(i)をn回実行するまでにかかる時間を計測する(n <=109

計測結果のグラフを以下に示します。
graph.png







defaultは関数、tableはテーブルを用いた時の結果です。一目瞭然ですが、三角関数は回数が1.0×107を超えてくると、テンプレートに比べ、かなり時間がかかることが分かります。FPSを重要とするゲームでは、精度は落ちますが、やはりテンプレートを使用したほうがよいですね。精度も同時にって場合は、数回に一回は関数を使用するなんていう方法でも少しは変わってくるかと思います。

いやはや、なんとなく気になったものですから^^;
これもWINAPIの画像回転を実装するために知りたかったことでした。
メモリはちょっと増えるけど、どれぐらいの恩恵が得られるのかな?っと。
これから、回転の精度、速度はユーザーが指定できるように実装しました。

最近、速度、メモリ効率、などをちょくちょく考えるようになりまして、
それぞれをグラフ化して、最適点を見つける作業が楽しくなってきましたw
最近では、MMX命令最適化、ハッシュの利点などなど・・・趣味でやってました。
時間があったらちょっとずつUPしていこうかなんて思ってます。
PR

Comment
Name
Title
Mail
URL
Comment
Pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
sin/cos
IntelCPUの命令 fsin / fcos、或いは fsincosを使えばかなり高速に sin/cosを求められますよ。
Justy 2009/11/15(Sun)18:03: 編集
sin/cosテーブル
sin/cosをテーブル化する場合でメモリと精度が気になるのであれば、入力する角度を整数 0~65536で1周という方式にして1025個の float(ゲームなら floatで十分なので)テーブル用意します。

これで後は配列参照と単純な条件分岐と計算で sin/cosを求めることができます。
何より &0xffffすれば角度を正規化できるという利点もあります。

暇があったらお試し下さい。
Justy 2009/11/15(Sun)18:13: 編集
Justyさん、コメントありがとうございます!
いやいや、こんなブログを見ていただいてありがとうございます。。そして回答まで・・・。。大変感謝です。

>intelCPUの命令 fsin / fcos、或いは fsincos
自分は本当に無知なんで、このようなコメントは本当にありがたいです。
asmでゴリゴリやってましたが、MASM32もがんばってみます。
今はちょっと時間がないので、来週の週末にでも。


>sin/cosテーブル
先人の知恵は恐れ入ります。。
shortの性能(オーバーフロー),ビット操作による正規化を円に生かす点がまさにイカしてますw
90、180、270の条件の時、条件分岐が必要になるのかな?っと思って、調べてみたら、その通りですね。これはメモリ領域に対して、それ相応の速度の恩恵を得ることができそうです。もちろん、実験させてもらいますwwまぁ、どれがいいかなんて評価まではできませんが。。
kazuoni(管理人) 2009/11/15(Sun)21:41: 編集
re:
> 条件分岐
 そうですね。それぞれの象限で分岐が必要です。
 テーブルが 1025個しかないので角度が 16の倍数でない場合はテーブルを2カ所参照して、線形補完します。

 メモリに余裕があれば、 16385個分のテーブルにしてしまってもいいんですけどね。
Justy 2009/11/16(Mon)02:11: 編集
Justyさん、コメントありがとうございます!
値の区間が狭いので、線形補完で十分ですね。

>メモリに余裕があれば、 16385個分のテーブルにしてしまってもいいんですけどね。

精度はぐんと上がりそうですね。でも、今回は2D目的なんで、1025個のテーブルで自作DXライブラリもどきに実装しようかと思います。まぁ、正直、1025個もいらないかっ・・・(ry



kazuoni(管理人) 2009/11/16(Mon)18:19: 編集
この記事へのトラックバック
この記事にトラックバックする:
[26] [25] [24] [23] [22] [21] [20] [19] [18] [17] [16
«  Back :   HOME   : Next  »
カレンダー
10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フリーエリア
最新コメント
[11/16 kazuoni(管理人)]
[11/16 Justy]
[11/15 kazuoni(管理人)]
[11/15 Justy]
[11/15 Justy]
最新記事
最新トラックバック
プロフィール
HN:
kazuoni
年齢:
36
性別:
男性
誕生日:
1988/05/06
職業:
大学生
趣味:
プログラミング
自己紹介:
全体的に無気力な人です。
物事に対して取っ付きはいいです。
でも飽きやすいです。
そんな人です。
バーコード
ブログ内検索
最古記事
(12/03)
(12/10)
(12/13)
(01/07)
(02/02)
忍者ブログ [PR]