Írtam egy progit C#-ban de nem egészen úgy működik ahogy szeretném lassú hogy lehetne orvosolni a problémát?
szóval van egy picturebox x=500, y=500 és egy egybeágyazott for ciklussal minden pixelen végigmegy és random szerint feltölti feketével vagy fehérrel ez egy gombnyomásra tökéletesen működött de amikor beleraktam egy Timer-be akkor
ott amikor az Interval 200-ra volt állítva nem cserélte olyan gyorsan a képet hanem kb 1.5sec-et kellett várni a project lényege az volt,hogy a picturebox olyan hatást keltsen mint a régi TV amikor nincs adás olyan hangyásat de ez így nem működik mivel lehetne ezt orvosolni?
Hát jól kéne megírni.
Nem tudom milyen timerről meg intervalról van szó.
Valamily okból kifolyólag a gépem útálja a C#-ot és nem hajlandó fordítani grafikus dolgokat. Delphi-ben megírtam neked pár sor az egész, remélem megérted: [link]
A forráskód, kommentekkel:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
tmp_bmp : TBitmap;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
// Létrehozzuk a temp bitmap-et és beállítjuk a méretét
tmp_bmp := TBitmap.Create;
with tmp_bmp do
begin
Width := 500;
Height := 500;
// Nem állítjuk nagyra a felbontást, hogy ne sok helyet foglaljon
PixelFormat := pf4bit;
end;
Randomize;
// A villódzás elkerülése miatt
DoubleBuffered := True;
// Maximum 40, hogy a 25 képkocka meglegyen másodpercenként
Timer1.Interval := 30;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var i, j : Integer;
begin
// Feketére töröljük a vásznat
with tmp_bmp.Canvas do
begin
Pen.Color := clBlack;
Brush.color := clBlack;
Rectangle(0, 0, 499, 499);
end;
// Véletlenszerűen fehér pixeleket rakunk ki
for i := 0 to 499 do
// Soronként most 26-ot
for j := 0 to 25 do
tmp_bmp.Canvas.Pixels[i, Random(500)] := clWhite;
// a temp képet társítjuk a képünkhöz
Image1.Picture.Assign(tmp_bmp);
end;
end.
Nem igényel magyarázatot.
"és egy egybeágyazott for ciklussal minden pixelen végigmegy"
Ez a gond, így az adott intervallumonként lefutó programkód futási ideje ( [link] ) exponenciális (O(n^2)).
A megoldás az egyszerűsítésben rejlik: időnként kisebb mennyiségű - ennek számosságát ki kell tapasztalni - véletlen pozíciójú képpont színét kell lecserélni feketéről fehérre és vice versa.
Javascriptben, <canvas> segítségével egy példa:
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!