実行速度とコード重複の関係について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち

実行速度とコード重複の関係について

#1

投稿記事 by ぬっち » 15年前

こんばんは。
現在作っているDirectXライブラリで悩んでいることがあるので質問させていただきます。

例えば、読み込んだ画像をVector2で表した特定の場所に表示する以下のような関数があったとします。
Vector2は2次元ベクトルを表す自作クラスです。
void drawImage( Vector2& vPos )
また他には画像を拡大縮小・回転・拡大縮小+回転を行ってから表示させるような関数があるとします。
(実際には、任意軸周りの回転などの変形も作成する予定です)
void drawScaleImage( Vector2& vPos, Vector2& vScale )
void drawRotateImage( Vector2& vPos, float angle )
void drawScaleRotateImage( Vector2& vPos, Vector2& vScale, float angle )
このような関数が例えばImageというクラスのメンバ関数であったとします。
class Image
{
    ...
public:
    drawImage(...);
    drawScaleImage(...);
    drawRotateImage(...);
    drawScaleRotateImage(...);
};
この場合、それぞれのメンバ関数の定義は特定の部分を除き、互いにコードが重複してしまい、重複した部分を変更するとき全てのメンバ関数の定義を変更しなくてはならなくメンテナンスが大変です。

これに対してdrawImageというメンバ関数だけを考え、その引数に列挙型(TransformMethod)を与えて変形の種類を決めるという方法を考えました。
例えば、
void drawImage( Vector2& vPos, Vector2& vScale, float angle, TransformMethod tm )
といった感じです。
使い方は、拡大縮小なら
drawImage( vP, vS, 0, TRANSFORM_SCALING )
回転なら
drawImage( vP, vS, 0.3f, TRANSFORM_ROTATION )
といった感じです。
これだとメンテナンスもしやすく、コードの重複も起こらないのですが、引数の数が多く関数の内部で余計な処理を行う必要があり実行速度が遅くなってしまいます。

現在は前者の方法を用いているのですが、後のことを考えると後者にしたほうがよいのか迷ってます。

皆さんだったらどちらを選びますか?
また選んだ理由は何でしょうか?
それとも何かよりよい方法があるのでしょうか?
よろしくお願いします。

Justy

Re:実行速度とコード重複の関係について

#2

投稿記事 by Justy » 15年前

>互いにコードが重複してしまい
 その重複した部分を別の関数に纏めるなど、上手く共通化できないのでしょうか?


>引数の数が多く関数の内部で余計な処理を行う必要があり実行速度が遅くなってしまいます
 引数の件はともかく、実行速度がおそくなるというのはどの程度遅くなるのでしょうか?
 そんなに速度が気になるほど複雑な処理をしている、ということでしょうか?


>それとも何かよりよい方法があるのでしょうか?
 個人的には位置や角度、スケール情報はメンバ関数から設定しメンバ変数に持たせて
drawメソッド一発で表示できた方が何かと楽な気がしますよ。
 ニュアンス的には Imageクラスというよりかは Spriteクラス的なものですね。

ぬっち

Re:実行速度とコード重複の関係について

#3

投稿記事 by ぬっち » 15年前

Justyさん返信ありがとうございます。

>共通化
描画開始、描画終了の処理の間に変形処理を行っているので、出来るとすれば描画開始の処理をdrawBegin、描画終了の処理をdrawEndといった関数を用意して、その間に変形処理を記述するという感じには出来そうです。

>実行速度と引数
受け取った列挙型の値をswitchで判定する予定です。
何度も呼ばれる関数なので実行速度にどのくらい影響を与えるのか気になってしまったので・・・。

>よりよい方法
そうですね、正しくはSpriteクラスですね。
メンバ変数に持たせる方法ですか・・・。
確かにそうすればいろいろと便利そうですね。
参考になります^^;

とりあえず重複しているところを関数にまとめてみようと思います。

Justy

Re:実行速度とコード重複の関係について

#4

投稿記事 by Justy » 15年前

>switchで判定する予定です。
>何度も呼ばれる関数
 実際のところ見てみないと正確なところはわかりませんが、一般的に想像できる範囲内の処理であれば
多分そんなに気にすることはないかと思います。

 むしろ描画に絡む DirectX内の処理やレンダリング処理そのものの方が処理負荷が高そうですし。


>メンバ変数に持たせる方法ですか・・・
 位置、角度などのパラメータを直接メンバに持ってもいいですし、行列を持つだけにして移動・回転などのメソッドが呼ばれる度に行列を更新していく方式でもいいですね。

ぬっち

Re:実行速度とコード重複の関係について

#5

投稿記事 by ぬっち » 15年前

やはりswitchのやり方だと無駄に引数の数が結構多くなってしまいますね。
簡単に考えただけでも、回転軸・回転角・位置・拡大倍率・・・
普通に表示したいだけでも位置以外の変数を指定するのは面倒ですね。
そう考えるとメンバ変数に持たせるほうが一番楽なのかもしれませんね。
いろいろ参考になりました。ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る