ウィンドウ内に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();
}
}