![]() |
Scrollen von Text per GDI sieht abgehakt aus ...
Hiho,
Flackern ist bei mir kein Problem, aber wenn ich Text scrolle (vertical) dann sieht das irgendwie nicht sehr befriedigend aus. Es hat irgendwas abgehaktes. Selbst bei ca 50ms, was IMO der maximalen Lesegeschwindigkeit entspricht, erscheint das Scrolling abgehakt. Gibt es da irgendwelche Smoothing-Algorithmen o.ä.? Wer sehen möchte, was genau ich meine, der kann mal meine ![]() Danke im Voraus. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Moin Assarbad,
vielleicht hilft Dir dies hier ja weiter: ![]() Besonders sakuras Beitrag auf Seite 2. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Zitat:
...:cat:... |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Moin sakura,
Zitat:
Zitat:
|
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Hi ihr beiden und danke.
Leider nicht wirklich was ich brauche. Übrigens, durch den Timer ruckelt es stärker, als wenn du einen Thread nimmst, der an das Control eine Updatenachricht schickt. Das Ruckeln ist nach wie vor da. Für euch vielleicht marginal, aber ich habe da hohe Ansprüche ;) Außerdem hängt das Ruckeln an sich dann auch stark von der Pause ab. 15ms bei nem Timer ist der Killer für eine Anwendung. Da sollte man nen eigenen Thread periodisch was machen lassen. Bei 50 ms sieht auch die "Komponente" nicht mehr so doll aus :mrgreen: |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Hallo!
Da gibt's schon einige Möglichkeiten zur Optimierung eines solchen Problems. Aber vielleicht solltest Du erstmal verraten, wie Du bei Deiner momentanen Methode vorgehst. Generell kann man aber sagen, dass der Delphi-Standard-Timer für solche Sachen extrem unbrauchbar ist. Ein Thread oder zum Beispiel auch der Timer von DelphiX arbeiten um einiges genauer. Gruß, Denny |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Ich zitiere mich mal selber:
Zitat:
Wie gesagt in 1Pixel-Schritten und mit 33-50ms Intervall. Übrigens, DirectX käme insofern nicht in Frage, weiles auf Win95 nicht standardmäßig verfügbar ist, oder irre ich da? Ich will eigentlich das ganze Weichzeichnen und dann Scrollen ... vielleicht macht das ja was aus ... :-/ |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Liste der Anhänge anzeigen (Anzahl: 1)
Versuch mal ScrollWindow() oder ScrollDC(). Nur die letze Pixelzeile wird dann in den DC gezeichnet. Am besten holste diese Pixelzeile aus einer Bitmap. Du zeichnest also zuerst mal die Bitamp in voller Größe (falls sie nicht zu groß). Dann beim wm_Paint,wm_EraseBkGnd zeichnest du die Bitmap ins Fenster. Nichts anders also wie Doublebuffering. Nun wird mit ScrollWindow() gescrollt. Dieser Funktion übergibst du aber eine leere Region mit. Mit dieser Region rufst du dann InvalidateRgn() auf. Danach gleich UpdateWindow(), oder gleich RedrawWindow) mit Region.
Es sieht so aus das die neuen Grafikkarten direkte Bildschirmbereiche schneller verschieben können als eine Bitmap mit gleicher Größe zu zeichnen. ScrollWindow() gibt dir in der Region den Bereich des Fenster der neu gezeichnet werden muß. Meistens, bei 1 Pixel Scroll, ist das also nur eine Pixelzeile. Die Ausnahme ist es wenn das Window durch andere Windows teilweise verdeckt werden. Dann besteht bei 1 Pixel Scroll die Region aus 1x Pixelzeile unterer Rand + x mal oberer Rand für x Fenster die überlappen. In meiner Arbeit zu meinem ersten Tutorial für die DP habe ich auch diesen Weg beschritten, allerdings innerhalb eines Threads. Anbei eine kleine Demo. Einfach Liblings-CD oder MP3 einlegen, Mediaplayer beenden und Demo starten. Ganz exakt flüssig wird es aber nur wenn ein extrem gutes Timing benutzt wird und das Updating des Bildschirmbereiches mit dem Vertical Retrace Signal der Grafikkarte synchronisiert wird. DirectX bietet glaube ich diese Möglichkeit. Auch ScrollWindow()/ScrollDC() scheinen da sehr flüssig zu sein (kein geflackerer durch Retrace). Allerdings funkt immer wieder der Threadsheduler dazwischen. Ich bin aber auch auf jeden anderen Vorschlag gespannt der nur mit API auskommt :) Gruß Hagen PS: ich scroll ca. alle 10ms um 1 Pixel nach links. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Zitat:
|
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Ah je :(
Also, bis jetzt ist noch keine Mediensteuerung drinnen, man muß also selber irgendwas anschupsen. Ich scanne nur den Input vom WAVE_MAPPER. Wahrscheinlich musste erstmal in den Soundeinstellungen die Häckchen rausnehmen. Wenn du nun die Demo startest und im Lautsprecherpopup den Regler bewegst kommt ja ein Beep. Dieses solltest du dann als Welle+Frequnzspetrum sehen. Was hast du für ein System ? Wenn du eine CD einlegst meldet sich erstmal der Mediaplayer, den dann schließen. Danach von Hand am CD/DVD Player auf Play drücken. Zumindestens funktionierts bei mir. Schon "braunes dampfendes Häufchen" wenn das dann bei der Veröffentlichung des Tutorials passiert. By the Way, da du mich ja fragtest ein Tut zu schreiben. Ich habe vor 2 Tut's zu schreiben. Als erstes wird es was zur Fast Fourier Transformation und threadbasierte Echtzeitaufnahme und Anzeige dieser Daten. (Deswegen ärgert mich das schon wieder das man für jede Hardwarekonfiguration eigene Test's unter Windows machen muß). Das zweite Tut wird sich mit Neuronalen Netzen beschäftigen und direkt auf's FFT Tutorial aufsetzen. Möglich sind 3 Schwerpunkte. Entweder Spracherkennung (natürlich auf einfachste Weise), oder Erkennung vom MF Tones z.b. von einer Anrufbeantworter Fernbedienung, oder aber die Anwendung und das Training eines NN's als Ersatz der Fast Fourier Transformation (ob ich das hinkriege weiß ich aber noch nicht). Naja, ich hoffe es ist nicht zu schwere Kost für die Leser der DP ? Gruß Hagen PS: der zweite Eintrag im Menu muß auf Stop stehen. Falls nicht draufklicken. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Sorry, seh immer noch nichts. Die gute Tom Petty CD liegt Laufwerk, dein Programm ist gestartet und ich habe Play gedrückt am Laufwerk. Nichts. Nur wenn ich die Fenstergröße ändere wird die grüne Linie am Fensterrand von rechts nach links neu gezeichnet.
Nachtrag: Alle Regler sind aufgedreht. Und beim Rumspielen mit der Lautstärkeregelung höre ich auch ein Peep, nur dein Programm zeigt keine Reaktion. System: Win2000 SP4, SoundOnBoard, Treiber irgend was SiS 7012 AudioDriver. Das mit den Tuts: Kein Problem mach nur. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Was steht als zweiter Menueintrag, "Start" oder "Stop". Falls dort "Start" steht gibts Problem beim Öffnen des WAVE Mappers. Falls "Stop" und danach sieht es wohl aus wird gescannt. Nun sollte oben Rechts die Frames per Second, der Delay in Millisekunden und meisten 0.0 stehen. Also z.B. "86 fps, 8.0 ms, 0.0", wobei der Millisekundenwert sich periodisch ändern sollte.
Nun einfach per MediaPlayer eine Wave abspielen. Gruß Hagen |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Liste der Anhänge anzeigen (Anzahl: 1)
Ja die Frames per second sehe ich, da steht auch Stop. Aber sollte sich nicht was auf den Linien abspielen? Da sehe ich auch, wenn nichts läuft nur ein paar Pixel was. Siehe Anhang.
Aber langsam wird es offtopic und Assarbad bringt das hier nichts. Entweder wir machen per PN, E-Mail oder, wenn vorhanden, per ICQ weiter oder du stellst es in der Freeware-Sparte für alle zum Testen zur Verfügung. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
@Hagen: Danke, man fragt sich bloß, warum MS ScrollDC unter "Windows and Controls" eingeordnet hat. Wäre es unter GDI gewesen, hätte ichs vielleicht auch gefunden. Ich schaus mir an.
Dickes Danke jedenfalls. |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Zitat:
Zitat:
2. Und wenn - wer benutzt es ohne DirectX? 3. Muss heutige Software noch auf Win95 Rücksicht nehmen? 4. War nur ein Beispiel, weil ich den Eindruck habe, dass jeder hier DelphiX installiert hat, warum auch immer. Vielleicht solltest Du mal ein wenig mit den Schritten beim Scrollen experimentieren. 2-Pixel-Schritte sind auch noch sehr flüssig. Denny |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Zitat:
Zitat:
Zitat:
...:cat:... |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Also bei mir tut das Programm mit dem grünen Strich ( ^^ ) doch wohl so halbwegs...aber nur der anfang bewegt sich.
Und unten sind manchmal blaue streifen drinne ;) Und ich persönlich kenne keinen mit Win95 aufm Rechner und glaube auch das man dort nur bedingt Rücksicht nehmen sollte *sakuraindenrückenfall* CrashMan |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
@Crashman:
Zitat:
Leider sind wir durch Programme wie WinAmp verwöhnt mit solchen Analysern. Die meisten zeigen nicht das Verhältnismäßig korrekte Spektrum an, sondern ein verzerrtes damit es mehr hermacht. Im unteren Teil wird das Fenster immer 1 Pixel nach links gescrollt, pro Abtastrate, alle 10ms bzw. 90mal in der Sekunde. Mit diesem Scrolling bezog ich mich auch auf Asserbad's Frage. Angzeigt wird farblich unterschieden das zeitliche Frequenzspekrtum. Man kann z.b. an hand dessen den Takt oder hervorstechende Instrumente erkennen. Es sollte unten grün bis punktuell rot sein und nach oben in blau übergehen bis schwarz. In deinem Falle ist also nicht genügend Saft auf'm Input. Gruß Hagen |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Hrm. Bei mir reagiert das Programm (fast) nur auf den Input über meine USB WebCam mit Micro (Logitech Quickcam). Mein Winamp verursacht nix, und mein CD-Player hat keinen extra Play-Knopf :)
Aber das Signal von der Kamera kann ich gar nicht abschalten. Auf jeden Fall ist die Sache recht flüssig :) |
Re: Scrollen von Text per GDI sieht abgehakt aus ...
Hi,
ich weiss nicht, ob ich jetzt auf dem aktuellen Stand bin (habe mir auch den Sourcecode von EDA nicht angeschaut...) Falls Du einen Timer verwendest solltest Du trotzdem die seit dem letzten Frame vergangen Zeit messen - da die Timer ziemlich ungenau sind - und die Scrollweite daran anpassen, dann fallen zumindest schon mal Ungenauigkeiten durch das Timing weg, falls Windows zwischen zwei Frames mehr zu tun hat als sonst. Wenn ich das richtig verstanden habe und es sich bei EDA um eine non-VCL- Anwendung handelt, könntest Du auch, sobald Du die About-Box anzeigst Deine Nachrichtenschleife mit PeekMessage statt GetMessage realisieren und immer dann, wenn alle Messages abgearbeitet sind, die Zeit messen und ein neues Bild 'rendern'. Damit erzeugst Du viel kürzere Intervalle als mit einem Timer möglich, allerdings zu Lasten der CPU-Auslastung, Deine Anwendung kriegt nämlich dann alles, was noch da ist. (Für Spiele völlig ok, für ein Utility fänd ich es eigentlich etwas übertrieben, Timer reicht da IMHO). Falls Du es sowieso schon in der Art machst, hab ich nix geagt... :) Ciao, teebee |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:28 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