トップページ > 記事閲覧
回転"のみ"描画メソッドはありませんか?
名前:Dixq 日時: 2016/02/13 18:56

DrawRotaGraphF で回転とスケーリングができると思いますが、 スケーリングは必要なく、回転要素しか使用しません。その分高速に描画したいです。 DrawRotaGraphF の回転だけバージョンのメソッドはありませんか? int DrawRotaGraphF(int x, int y, double Angle, int GrHandle, int TransFlag) ; こんな感じです。 またスケーリングはあってもほとんど処理時間がかからないのであればその旨ご教示ください。 よろしくお願い致します。 #余談 DXライブラリはdouble型を用いても意味がないと思いますが ここにだけdouble型が使われているのは何故なんでしょう?
メンテ

Page: 1 |

Re: 回転"のみ"描画メソッドはありませんか? ( No.1 )
名前:gura 日時:2016/02/15 01:08

余談の部分ですがAngleがラジアンで float型だと有効桁数7桁なのでキャパシティーを 超える可能性があるからじゃないですか。 DX_PIが 3.1415926535897932384626433832795 という定義になっているので7桁は超えますよね。 間違っていたらすみません。
メンテ
Re: 回転"のみ"描画メソッドはありませんか? ( No.2 )
名前:管理人 日時:2016/02/15 03:31

高速版 DrawRotaGraph を追加してみましたので、よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 以下の関数を追加しました // 画像の回転描画( 高速版、座標計算のアルゴリズムが簡略化されています、描画結果に不都合が無ければこちらの方が高速です ) int DrawRotaGraphFast( int x, int y, float ExRate, float Angle, int GrHandle, int TransFlag ) ; // 画像の回転描画( 座標指定が float 版 )( 高速版、座標計算のアルゴリズムが簡略化されています、描画結果に不都合が無ければこちらの方が高速です ) int DrawRotaGraphFastF( float xf, float yf, float ExRate, float Angle, int GrHandle, int TransFlag ) ; 主に回転の計算に使用している sin, cos 関数を呼ばずに代わりに sin テーブルを使用するようにしたり、 最近点サンプリング描画( DX_DRAWMODE_NEAREST )の際に回転中心が±1ピクセルずれたりするのを補正したりする 処理を省いたりして高速化しています ±1ピクセルのずれの補正を行っていないので、正確な描画が必要な箇所では使用しないようにしてください 逆に常に動いている弾やキャラクターなどの描画には向いていると思います sin テーブルを使用する関係でメモリキャッシュのヒット率が悪くなるので、今までキャッシュが理想的に効いていた場合は 逆に遅くなるかもしれませんが、そうでなかった場合はCPUの負荷が DrawRotaGraph に比べて3分の2くらいに減ります 因みにスケーリングの乗算を無くしても誤差程度にも負荷軽減が確認できなかったので ExRate はそのまま残しました ( スケーリングの計算は乗算数回なので、その負荷は DrawRotaGraph の処理全体の負荷と比べると微々たるものなのだと思います ) よろしければお試しください m(_ _)m > DXライブラリはdouble型を用いても意味がないと思いますが > ここにだけdouble型が使われているのは何故なんでしょう? 単純に『DXライブラリの元となったライブラリの浮動小数点数の引数が double 型だったから』です なぜ 『DXライブラリの元となったライブラリの浮動小数点数の引数が double 型だったのか』については 正確に記憶できているかわかりませんが、『恐らくこうだった』ということを申し上げますと DXライブラリの Ver1.0 もできていない2000年前後の頃 『IntelCPU が持っている浮動小数点演算機能は double 型( 64bit )以上の精度( 80bit )を持っていて、 float型変数を使用した場合も double型変数を使用した場合も計算する際は必ず double型以上の精度( 80bit )で 行われるので float型変数を使用するのは「メモリ使用量が少なくて済む」という以上の意味は無い』 というようなことがあり、数値の末尾に f を付けなければならなかったり、整数値を代入しようと すると『'int' から 'float' への変換です。データが失われる可能性があります。』のような警告が出たりと float型は面倒な部分があるので、前述の理由もあり double型を引数に使用するようにした というような理由だったような気がします まあその後 32bit精度の浮動小数点演算を 64bit精度の浮動小数点演算の倍の速度で実行できるもの( PentiumV以降に 搭載されている SSE やプログラマブルシェーダー対応の GPU など )が登場して、float型を使用する意味がどんどん 増えて行ったわけですが… ( 因みに 64bitアプリでは上述の『double型以上の精度( 80bit )を持つ浮動小数点演算機能』は基本的に  使用されなくなったので( 代わりに SSE や SSE2 を使用する )、上述の理由( float型でも double型でも  演算時の精度は同じ( 80bit で計算される ) )も double型を選択する理由にすることはできなくなってしまいました… )
メンテ
Re: 回転"のみ"描画メソッドはありませんか? ( No.3 )
名前:Dixq 日時:2016/02/16 00:15

guraさん ご回答ありがとうございます。
メンテ
Re: 回転"のみ"描画メソッドはありませんか? ( No.4 )
名前:Dixq 日時:2016/02/16 00:21

管理人さん わざわざ特別な対応をして頂き大変恐縮です。 本メソッドは弾幕の描画に使用するので常に動いていますしありがたいです。 > 因みにスケーリングの乗算を無くしても誤差程度にも負荷軽減が確認できなかったので ExRate はそのまま残しました ここが今回一番知りたかったことでした。 なるほど、スケーリングにはほとんど時間がかからないんですね。 > 2000年前後の頃 情報ありがとうございます。 背景が良く分かり納得しました。 丁寧なご返信ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存