ウィンドウ内に1×1ピクセルの点を敷き詰めて描画する処理
まいまい  2015/02/27(Fri) 13:09
Siv3dを使用させて頂いております.

実行ウィンドウ内に1×1ピクセルの正方形(というより点)を片っ端からしきつめて描画したいのですが,
下のコードを実行すると,描画が全体に行き渡らないという問題が起きました.

毎フレームに描画できる図形の限界数があるのでしょうか.

セルオートマトンのような格子をたくさん使う処理を行いたいので,格子の最小単位を1ピクセルにしようとしています.
添付画像の白色の範囲はドットを描画できている領域です.


ご教授よろしくお願いします.


動作環境
OS: Windows 7 Pro 32bit
IDE: Visual Studio Community 2013 Update 4
Siv3D Version: January 2015 v3




///////////////////////////////////////////////////////////////////////////

# include <Siv3D.hpp>

void Main()
{
const int window_x = 1000, window_y = 800;

Window::Resize(window_x, window_y);

while (System::Update())
{
for (int x = 0; x < window_x; ++x){
for (int y = 0; y < window_y; ++y){
/*PointとRectどちらも同じ結果になります*/
//Point(x, y).draw();

Rect rect(x, y, 1, 1);
rect.draw();
}
}
}
}



記事編集
Reputeless  2015/02/27(Fri) 15:16
パフォーマンスの問題を避けるため、Siv3D の 2D 描画には上限があり、
1 フレームで約 104 万頂点以上は使用できません。
Point や Rect に換算すると、約 25 万個以上の点や四角は描画できないことになります。

セルオートマトンなどで大量の点を描画したい場合は、
ライフゲームのサンプル http://play-siv3d.hateblo.jp/entry/jp/example/gameoflife
のように、予め Image に書き込んだものを DynamicTexture に転送し、draw() を 1 回で済ますのが効率的で適切な方法です。

サンプルを以下に示します。

# include <Siv3D.hpp>

void Main()
{
const int window_x = 1000, window_y = 800;

Window::Resize(window_x, window_y);

Image image(window_x, window_y, Palette::White);

DynamicTexture texture(image);

while (System::Update())
{
if (Input::MouseL.clicked)
{
for (int y = 0; y < image.height; ++y)
{
for (int x = 0; x < image.width; ++x)
{
image[y][x] = RandomColor();
}
}

texture.fill(image);
}

texture.draw();
}
}
編集
まいまい  2015/02/27(Fri) 16:09
早速の回答ありがとうございます.
サンプルコードを参考に記述することで想定した通りの動作をすることができました.
重ねてお礼申し上げます.

今後もSiv3dの開発・発展に期待しております.
編集
件名
Re: ウィンドウ内に1×1ピクセルの点を敷き詰めて描画する処理
名前
コメント
画像添付


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

- WEB PATIO -