高速道路データを使って渋滞している所をシミュレーションしているのですが
1時間で多いときに2000台も流入量があるので
配列でいちいちしているとすぐメモリー不足になってしまいます
何かスマートにたくさんのイメージを一度に動かす方法はないでしょうか
物自体は丸い点が道路を一方向に動いているだけの簡単なものなのですが
一度に出でいる点は最高300前後くらいです。説明が足らなかったらすみません
ちょっと説明を追加します。
高速のある入り口から何時何分何秒に車が入ってきたというデータがあるので
それを秒に直しストップウオッチみたいなのを作り
そのデータの数値とあったら点が一本の道路を走るという簡単なものですが
多い時間で一時間当たり3000台一日で3万〜3万5千台くらいのデータなのと
将来的に速度などの変化も考えたいのです
データの構造は1台に対して1回の入り口通過データがあるだけでしょうか。
速度は一定と考えますか?それとも、流量によって速度を変えたりするのでしょうか。
一定であれば(実際には車の流れが一定ってことはないですが)、逆算して、道路上にある車のデータのみ抽出し、点を表示すれば多くて300程度のデータを処理すればOKのはず。
たとえば、1台につき入り口・通過点1・通過点2…通過点N・出口というデータがあり、それぞれに時間が設定されているのであれば、同じように各ポイント間にある車のデータのみ抽出し、点を表示します。
データ構造によっては、すべて読み込まないとだめかもしれません。
その場合は、使いやすいようにデータを変換した方がやりやすいと思います。
「Imageを大量に表示するには?」ちゅうタイトルやと、
車1台づつTImageつこうて…なん思うとるようやな。
300個も TImageつこうたら、そりゃメモリ足らんも当然や。
こないサンプルどうや。
Formに幅600、高さ50の TImage1個、ボタン1個、タイマー1個置いてな。
5000台くらいまでならいけるで。10000台やと、速いマシンないんと苦しい〜
ただし、衝突判定しとらんで事故続発やけんな(^^ゞ
var
aryX : array[0..2000]of Integer;
aryY : array[0..2000]of Integer;
dx : array[0..2000]of Integer;
procedure TForm1.FormCreate(Sender: TObject);
var
i, x, y, w, h : Integer;
begin
w := Image1.Width * 2;
h := Image1.Height * 2;
for i:=0 to High(aryX) do begin
aryX[i] := Random(w * 2) - w;
aryY[i] := Random(h * 2) - h;
dx[i] := Random(4) + 3;
end;
Timer1.Interval := 40;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Timer1.Enabled := not Timer1.Enabled;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i, x, y : Integer;
begin
with Image1.Canvas do begin
Brush.Color := clWhite;
Rectangle(0,0,Image1.Width,Image1.Height);
Brush.Color := clBlue;
end;
for i:=0 to High(aryX) do begin
x := aryX[i] + dx[i];
y := aryY[i];
if x > Image1.Width then begin
x := -Random(Image1.Width);
dx[i] := Random(4) + 3;
end;
Image1.Canvas.FillRect(Rect(x, y, x+5, y+3));
aryX[i] := x;
aryY[i] := y;
end;
end;
ツイート |