円の描画速度
Gala  2017/01/29(Sun) 11:21
「円の描画」と「円の枠の描画」を交互に行うと、処理速度が著しく低下しました。
解決方法が有りましたら教えて頂けると幸いです。

なお、円をまとめて描画後、円の枠を描画したり、
円ではなく長方形描画に変更すると、この現象は発生しませんでした。

下記プログラムにて検証しました。
パターン1(円と円の枠を交互に描画):FPS 6
パターン2(円を描画後、円の枠を描画):FPS 60
※パターン2では円が重なった時の描画結果が異なってしまいます。

よろしくお願いします。

-----

# include <Siv3D.hpp>

void Main()
{
static const int MIN = 0;
static const int WIDTH = 800;
static const int HEIGHT = 600;
// 描画数
static const int NUMBER = 5000;
// 描画設定
static const int SIZE = 5;
static const Color COL(160, 180, 100);
static const Color COL_F(120, 140, 60);

Window::Resize(WIDTH, HEIGHT);

std::vector<Point> pointList(NUMBER);
Point point;

// 座標設定
for (int i = 0; i < NUMBER; i++) {
point.x = Random(MIN, WIDTH);
point.y = Random(MIN, HEIGHT);
pointList[i] = point;
}

while (System::Update())
{
ClearPrint();

// パターン1
for (auto p : pointList) {
const Circle circle(p.x, p.y, 3);
circle.draw(COL);
circle.drawFrame(0, 1, COL_F);
}
/*
// パターン2
for (auto p : pointList) {
Circle circle(p.x, p.y, 3);
circle.draw(COL);
}
for (auto p : pointList) {
Circle circle(p.x, p.y, 3);
circle.drawFrame(0, 1, COL_F);
}
*/
Println(Format(L"FPS: ", Profiler::FPS()));
}
}
記事編集
Reputeless  2017/01/29(Sun) 20:04
円の描画は Texture 描画、円の枠は図形描画です。交互に描画すると毎回 draw Call が発生します。
画像描画と図形描画をまとめれば 2 回の draw call で済みます。

Circle::drawAsPolygon() を使うと CPU コストが上がりますが、円を図形として描画します。試してみてください。
draw call の数は Profiler::Graphics().print() で調べられます。
編集
Gala  2017/01/30(Mon) 21:48
円と円の枠は描画方法が異なるのですね。
Circle::drawAsPolygon()を試した所、FPS40程まで改善しました。

PCの環境や円のサイズにも寄るかもしれませんが、
今回のように単に円とその枠を描画するだけであれば、
Texture 描画を2度使い、円を重ねて描画したほうがより高速でした。

ご回答ありがとうございました。
編集
件名
Re: 円の描画速度
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -