できるだけ早く膨大な数の線をラスタライズしたいと仮定し、実際のプロット関数を可能な限り抽象的にしたいと考えています。これは、必要なすべてのピクセルプロット関数のうちの1つです。入力はピクセル座標である:非常に汎用的な関数をパフォーマンスの高い方法で引数として扱うにはどうすればよいですか?
void plot(int x, int y);
ピクセルプロット機能で使用されるパラメータは、私たちはラインの膨大な量を描く前に設定されていることはほとんどまたはまったく変更されません。
まず実装アイデア
当社のライン描画機能は、単にプロットは、それが(xでのピクセルをプロットしたい時はいつでも(x、y)を呼び出します
void raster_line(void (*plot)(int, int), int x0, int y0, int x1, int y1);
のように、その関数の実装を見ることができます、y)。我々は特定のバッファにラスタにしたい時間のほとんどは、私たちは、グローバル変数を定義し、そのバッファ上のプロット機能行為をしてみましょう:
static int* buffer;
void plot(int x, int y) {
buffer[x + y * width] = 1;
}
のでraster_lineを呼び出す前に、我々はバッファ変数を設定する必要があり、我々は合格しますプロット関数ポインタ。
第2の実施のアイデア
当社のライン描画機能はAbstractPlotインターフェイス
class AbstractPlot {
public:
virtual ~AbstractPlot() {}
virtual void plot(int x, int y) const = 0;
};
最初の例と同じ機能を持つことにある
void raster_line(const AbstractPlot& ap, int x0, int y0, int x1, int y1);
ようになります。我々派生クラスを提供する
class Plot : public AbstractPlot {
public:
int* buffer;
void plot(int x, int y) const {
buffer[x + y * width] = 1;
}
};
したがって、raster_lineを呼び出す前に、Plotオブジェクトを作成し、バッファメンバーを初期化してインスタンスを渡します。
概要
私のテストでは、最初のアイデアは、二以上〜20%高速であると言う(仮想関数テーブルの検索が遅い?)が、私は、グローバル変数を使用する必要があるという事実を嫌います。私はラインを描く方法に興味がありませんが、できるだけ一般的な(そして速い)ピクセルプロットを作る方法は興味があります。その問題に対処するより良い方法はありますか?
"高速"とは、コンパイラ、ハードウェア、およびその他の無数の要因によって異なります。唯一の知っている方法は、独自のベンチマークを実行することと、同じコンパイラ、ハードウェア、および同じような無数の他の要因による既存の経験です。 –