高速版 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型を選択する理由にすることはできなくなってしまいました… )