• ベストアンサー

高速化のテクニック

プログラムを高速化するためのテクニック集を探していますがサイト、書籍ともなかなか見つかりません。特に図形のレンダリング(直線や曲線をイメージデータとして生成する)の高速アルゴリズムを探しています。ちなみに、Bresenham程度なら知っています。他にも乗算や割り算を高速化するための方法とかでもいいので、高速化するためのテクニックが載っているサイト、書籍をご存知でしたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • amru05
  • ベストアンサー率63% (33/52)
回答No.1

以下のサイトはなかなか優れものですね。非常に参考になるのではと、思います。 http://www2.starcat.ne.jp/~fussy/algo/index.htm 本では、 1)GAME PROGRAMMING に、「テンプレートメタプログラミングを使った高速数値演算」「3角関数の多項式近似」が有ります。 2)GAME PROGRAMMING2   に「不動少数点トリック:IEEE不動書数点でのパーフォマンス向上」が有ります。 3)GAME PROGRAMMING3   に「さらなる3角関数近似」があります 4)高速3Dグラフィックス   に「3次元数学の魔術」があります。 大体、以下のような方針で高速化するのが常套手段? 1)三角関数などは級数展開や、テーブルを使用して近似計算で代用する 2)場合わけをして簡単な計算をなるべく使用する   水平、垂直の場合は簡単に処理する   斜め45度も簡単に、それ以外は通常の計算。。など 3)割り算のかわりに掛け算を使用する。 4)必要な精度がとれるなら固定小数点計算を使用する 5)無駄な方変換を行わない(整数、実数の混在はX) 6)CPUの特性に応じた計算を行う  。。。。 ==>  「ゲーム」関係の本に「高速化」の話が良く出ているように感じます。「ゲーム」で検索してみるのも良いかも知れません。

situmonman
質問者

お礼

まさに私の探していたサイトです。 直線を両端からかくとか、目から鱗がとれました。 教えていただいた高速化手法も参考にさせていただきます。 確かにリアルタイム性が要求されるゲームプログラムは高速化 技術が必須になりますね。 でも高速化のテクニックは重要なノウハウだからか、なかなか書籍 とかで公表されてないようです。 ちなみに私がよく使う・知っている方法は ・演算結果をテーブルとして持っておく ・ループの中身を展開する ・除算は行わず1/xを2^n倍した整数テーブルとの掛け算+シフトで行う ・水平垂直方向の線分描画は座標計算行わず単純なforループで行う ・Bresenhamによる直線楕円描画アルゴリズム ・double,floatは使わず固定小数点演算で代用する ・無駄なメモリアクセスは削減する。 ・ADD計算を減らすため*ptr++;の乱用は避ける(ptr[base_index+offset]で置き換え) ぐらいです。 型変換は意識したことありませんでしたが、確かに無駄な処理が 増えそうですね。特に理由がなければintで統一していたほうが いいのでしょうね。 ありがとうございました。

関連するQ&A

  • 高速なプログラムを作るには?

    Windowsで高速なプログラムを作る為には、どういったテクニックがあるのでしょうか? また、そういったテクニックを勉強するにはどういった方法があるのでしょうか?(解説書とか解説サイトがあればいいのですが…)

  • 直線と線分の交差判定について高速なアルゴリズム

    タイトルの通りなのですが、 まさにその部分をプログラムで作っている最中です。 直線 : ax+by+c=0 で言うところの a,b,c のパラメータと 線分の2端点 ( x1 , y1 ) , ( x2 , y2 ) がわかっています。 その情報を使って今は  ( ax1 + by1 + c ) * ( ax2 + by2 +c ) < 0 のときに交差している。 という風に処理しているんですが、 どうにもこの部分の処理で時間がかかっているみたいで、 なんとか高速化したいんですが、直線と線分の交差判定について触れてあるサイトが少なかったり、 今使っているアルゴリズムのサイトだったりしか見かけないので、どうにもこうにもなりません。 もしこれが最速のアルゴリズムならしかたないんですが、もし皆さんご存知でしたらお力添えをお願いします。

  • 図形の交点を求めるプログラムに関して

    すみません。 表題の件で質問です。 例えば四角形と三角形の交点を求めるような、プログラムを作成したいのですが、 どのようなアルゴリズムを組めばいいのかわかりません。 直線と図形との交点算出はできたんですが....。 ちなみに開発言語はc#です。 どなたかわかる方いらっしゃいましたら、よろしくお願いします。

  • 高速思考について

    高速思考について 自分は物を考えるとき頭の中で言葉をしゃべるように考えます。 当然思考スピードは頭の中で話す言葉の速さに比例します。 ですが、そんなに難しくない平易な文章の本を読むときは、 明らかにしゃべるスピードを超えて読むことができ、理解もできます。 また、速読をマスターしている人は一秒数ページの世界で活字を読んでいきます。 そこで、思考を音声化するのでなく、イメージ化すれば現在よりも高速に思考することが 可能なのではないかと考えました。 取り急ぎ,検索サイトで「イメージ思考」「活字思考」などで検索してみたところ、 羽生名人についての考察や、いんちき臭く古臭い右脳系の情報などしか得られませんでした。 どなたか、私の考えている、 [言語をイメージ化して高速思考する] もしくは[言語を超える高速思考の方法]について情報をもっているかたがいたら、 お教えいただけたらと思います。 書籍やサイトの情報でも大変助かります。 よろしくお願いいたします。

  • JwwデータをWordに貼り付け後の図形の変形

    Windows XP SP2 にて、Jww(ver4.09d)で作図した図形を JwwToMF(ver2.40)を使用して、 「ファイル」「Jwwデータを開く」「クリップボードにコピー」 の順番でWord(2003)若しくはExcel(2003)に貼り付けを行い印刷をしてみると、文字や直線は問題ないのですが 円や曲線が異形になってしまいます。 例えば、「ひょうたん」状の図形ですと曲線と曲線がつながらず 隙間があいてしまい、また曲線もなめらかでなくなってしまいます。 何か手順が違うのでしょうか?どなたかご存じないでしょうか? 宜しくお願いいたします。

  • 変形したブロック矢印を書きたい!(Word)

    Wordで文書を作成しているのですが、出発点と到着地点で棒の太さの違う矢印を書きたいと思っています。 棒の部分が直線なら何の問題もなくフリーフォームで書けるのですが、棒の部分が曲線な矢印を書きたいと思っているので、少し話が難しくなっています。 「ノ」の字の上の部分に矢の先がついていて、かつ曲線部分が下が細く、上が太くなっているというイメージなのですが・・・ 書き方、もしくは図形をダウンロードできるサイトをご存知の方、ご教授お願い致します。

  • 静的HTML生成

    お世話になります。 テンプレートが存在して、その中にデータをはめ込み それをHTMLとして保存するという 静的HTMLを生成するプログラムを作成しようと思っています。 動的に生成された仮のHTMLを静的HTMLとして保存する仕組みが わかりません。 そのアルゴリズムのご教授願います。 それについて表記されているURLでもかまいません。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Fortranの割り算について

    フォートランによる数値計算についてお尋ねします。(技術系では今でもフォートランが現役なので) 何百万回も割り算をするアルゴリズムがあります。分母は定数で、分子がいっぱい変化します。としますと、割り算ではなく、分の1を計算して掛け算にしてもよいわけです。精度よりも高速化のほうが今はウェイトが高い状況です。 プログラムとしてそのように組んだ方が速いかも、と思いますが、一方でコンパイラが気を利かせて掛け算としてコンパイルしているかも知れません。もし、そうならばプログラムを書き換える意味がありません。 このあたりがコンパイラオプションなのかな?と思いますが、デフォルトでどのように計算しているか不明なのです。 以前の数値計算の本(PC-9801の頃)では時間を計って”ほら、割り算より掛け算が早いでしょ”ということを示すものなどがありました。そのような場合はコンパイラがそこまで気を利かせていないということになりますが、だいたいのところコンパイラは割り算をできるだけ掛け算に変更しようとしているのでしょうか。 PC上でのフォートラン(コンパックフォートランです。Microsoft,DECとオーナが変わってきてついに終わってしまったPC用のあのフォートランです。)を使っています。藁をも掴む思いで高速化を進めています。いかがでしょうか。

  • クロソイド曲線の接線の求め方

    こんにちは。 プログラム(WindowsとC++)でグラフを描く勉強をしています。 プログラム自体はなんとかなって、放物線を描くときは、固定値ですが接線も描いています。 いろんな図形を描いてみたくなったので調べていたところクロソイド曲線が目に止まりました。 高速道路にも使われている曲線だそうで描画させようと頑張ってみましたが、難しいので検索で出てきた RL=A^2 を展開した式を見ながらなんとかぐるぐるしたものが出来ました。 http://www.geikisha.com/blog/2012062801.html ここにはソースも載っていますが、それでは意味がないのでそれなりに調べて組みました。 今度は接線も出したいのですが、クロソイド曲線の接線の求め方が分かりません。 回っているので解が2つあると思いますがどのように計算すればよいのでしょうか。 うまく説明できず申し訳ありません。

  • 散布図からの近似曲線の書き方についてアドバイスをお願いします

    あるデータから散布図を書きました。横軸が長さで縦軸が長さに対する回数です。データの性質的に切片は間違いなくゼロです。散布図をエクセルで書いたところ、右肩あがりのようでしたので、直線回帰してみましたら、Rの2乗が0.7くらいで有意な直線関係が得られました。ただ、よくよくみますと、一番Y軸のさきの方でプラトーに達するような二次曲線のようにみえなくもありません。つまり、直線回帰してその傾きどうしを比較して、違うデータと比べて考察していましたが、そもそも直線でない可能性がることを指摘され、困っています。 そこで質問なのですが、得られた散布図で一番フィットする線を書くためにモデルを選択するにはどうすればよいのでしょうか?また、そこから近似曲線の性質(たとえば傾きなど)はどうやって求めたらいいか、参考となるURLや書籍があれば同時に教えて頂きたいのです。 わかりにくい説明で申し訳ありませんが、宜しくお願いします。

専門家に質問してみよう