![]() |
Re: Fernsehrauschen zeichnen?
Delphi-Quellcode:
und nicht vergessen, die Threads irgendwann zu beenden und freizugeben.
constructor Tsnow.Create(image: TImage);
begin FImage := image; inherited Create(False); end; procedure Tsnow.Execute; begin while true do begin synchronize(setPixels); end; end; procedure Tsnow.SetPixels; var r : Integer; x,y:Integer; begin r := Random(256); x:=random(FImage.width); y:=random(FImage.height); FImage.Canvas.Pixels[x,y] := RGB(r,r,r) end; im Hauptprogramm: var snow1,snow2 : TSnow; begin snow1 := TSnow.create(image1); snow2 := TSnow.create(image1); end; in Deinem Quellcode zeichnest Du zeilenweise Deine Punkt und nicht zufällig auf das Image. Mußt mal schauen, ob der obige Code geht habe ich nicht ausgetestet. Grüße Klaus |
Re: Fernsehrauschen zeichnen?
Zitat:
|
Re: Fernsehrauschen zeichnen?
Liste der Anhänge anzeigen (Anzahl: 1)
danke für den Tipp, klingt ja auch einleuchtend, aber irgendwas stimmt nicht.
Erst hab ich das Application.ProcessMessages nach unten gesetzt, was der Geschwindigkeit aber nichts gebracht hat, beim ersten durchlauf konnte ich schön zugucken, wie das Weiss von Grauton-Punkten überzogen wird. Dann hab ich die Zeile komplett rausgenommen. Jetzt geht der erste Durchgang so fix, dass ich die "Bewegung" nichtmehr sehen kann, d.h. ich starte das Programm und das image erscheint schon gefüllt mit Punkten. Allerdings ist das nur beim ersten Durchlauf der Fall . Ich hab mal das Projekt angehängt. vielleicht guckt sich das mal jemand an, wenn er Zeit hat. |
Re: Fernsehrauschen zeichnen?
hallo,
wäre es nicht besser, statt der direkten Zuweisung der Pixelfarbe
Delphi-Quellcode:
die viel schnellere Variante mit Scanline zu verwenden?
Img.Canvas.Pixels[i,j] := RGB(random(256),random(256),random(256));
wie man jetzt Scanline anwendet weiss ich auch nicht mehr so genau, aber man braucht nur noch eine Variable, welche die Zeile beschreibt und die Spalten werden durch erhöhen des Pointer bestimmt. d.h. man müsste nur noch einen Pointer zuwesein, der den Farbcode (bzw. schwarz oder weiss) enthält. nur mal son gedanke, mfg heiopei |
Re: Fernsehrauschen zeichnen?
Könnte man schon, das fällt dann aber erstmal unter "Optimierungsmöglichkeiten" ;)
Es ging ja erstmal primär ums "wie überhaupt". |
Re: Fernsehrauschen zeichnen?
aber das würde doch sein problem lösen, dass die anzeige so lange dauert, oder nicht?!?
|
Re: Fernsehrauschen zeichnen?
es muss doch aber woanders dran liegen, denn ohne thread geht das ganze 1000 mal schneller, als jetzt so
bei ner kleinen größe von z.b. 200x200 , wo ich einfach alle 10 ms durch nen Timer die Snow funktion aufgerufen habe, sieht das ganze sogar Original so aus wie im TV.....nur im Thread dauerts auf der gleichen Größe viel länger. |
Re: Fernsehrauschen zeichnen?
Ich schätze mal das Synchronize schluckt viel Zeit.
Ich glaube sogar, dass da immer das Image neugezeichnet wird. Versuchs mal mit einem TBitmap im Thread, welches du nach dem komplette be-zeichnen einfach auf das Image kopierst. |
Re: Fernsehrauschen zeichnen?
jau, das funktioniert um einiges schneller, vielen Dank.
Für den vollbildmodus auf 1280 x 1024 reicht dann wohl allgemein die Performance nicht. da kommt nach ner Zeit immer OutOfResources. Aber wenn mans etwas kleiner macht, dann gehts ab wie schmidts Katze |
Re: Fernsehrauschen zeichnen?
Liste der Anhänge anzeigen (Anzahl: 1)
wollte Euch mal meine Lösung zeigen, schreibt direkt auf die Form.
Delphi-Quellcode:
lustiger wird es wenn man nicht nur von einem Pixel die Farbe ändert
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TForm1 = class(TForm) procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } end; TSnow = class(TThread) private procedure setPixel; protected procedure execute; override; end; var Form1: TForm1; snow1,snow2: TSnow; implementation {$R *.dfm} procedure TSnow.setPixel; var x,y : Integer; r,g,b: Byte; begin x := random(Form1.Width); y := random(Form1.Height); r := random(256); g := random(256); b := random(256); Form1.Canvas.Pixels[x,y]:=RGB(r,g,b); end; procedure TSnow.execute; begin while not terminated do begin synchronize(setPixel); end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin snow1.Terminate; snow2.Terminate; snow1.Free; snow2.Free; end; begin randomize; snow1 := TSnow.create(false); snow2 := TSnow.Create(false); end. sonder von [x-1,y], [x,y], [x+1,y], [x,y-1], [x,y], [x,y+2] Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz