2016-10-11 7 views
-2

できるだけ早く膨大な数の線をラスタライズしたいと仮定し、実際のプロット関数を可能な限り抽象的にしたいと考えています。これは、必要なすべてのピクセルプロット関数のうちの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%高速であると言う(仮想関数テーブルの検索が遅い?)が、私は、グローバル変数を使用する必要があるという事実を嫌います。私はラインを描く方法に興味がありませんが、できるだけ一般的な(そして速い)ピクセルプロットを作る方法は興味があります。その問題に対処するより良い方法はありますか?

+2

"高速"とは、コンパイラ、ハードウェア、およびその他の無数の要因によって異なります。唯一の知っている方法は、独自のベンチマークを実行することと、同じコンパイラ、ハードウェア、および同じような無数の他の要因による既存の経験です。 –

答えて

1

スタティックポリモフィズムを使用すると、不要な仮想呼び出しのオーバーヘッドを避けることができます。この多態性は、テンプレートを使用してコンパイル時に解決されます。これは、C++標準ライブラリの大部分、例えばstd::sortのようなのアプローチです。 plotなしキャプチャとラムダ関数であり、したがってraster_lineがインスタンス化されるときにINLINABLEであることが保証場合、最適化をオンにしたときしたがって

template <class F> 
void raster_line(F plot, int x0, int y0, int x1, int y1); 

、次いで、オーバーヘッドは全くありません。プロット関数が何らかの状態を持つ必要がある場合は、関数に関数にアクセスする必要のない呼び出しにオーバーヘッドをかけることなく、関数を関数クラスまたはラムダにラップすることができます。

このアプローチの主な欠点は、raster_lineの定義をヘッダーに配置し、ヘッダーを含むすべての変換単位でコンパイルする必要があることです。この特定のケースでは、実行時のパフォーマンスが非常に重要なので、コンパイル時間のわずかな増加を受け入れることは、おそらく価値のあるトレードオフです。しかし、どこでもを実行することに注意する必要があります。そのため、コンパイル時間の増加は相当なものになり、実行時の改善はわずかです。

関連する問題