Results 1 to 7 of 7

Thread: Bugs, opmerkingen en aanmerkingen

  1. #1

    Bugs, opmerkingen en aanmerkingen

    Op verzoek in een andere thread

    Ik heb je control nog niet getest, maar misschien heb ik wel alvast een optimalisatie of twee.
    Je noemt zelf al het definiëren van een custom line type. Dat zal inderdaad waarschijnlijk een stuk sneller zijn dan het werken met Canvas.Pixels.
    Daarnaast schrijf je dat de verschillende timers ook processorkracht vreten. Eventueel kun je een reference-counted timer maken. Elk control maakt dan gebruik van dezelfde timer. Niet alleen bespaart dit op het aantal timers, maar bovendien lopen de 'ants' dan synchroon, wat waarschijnlijk een rustiger beeld geeft dan allemaal door elkaar lopende mieren.
    Eventueel kun je daar een singleton-achtige toepassing voor maken, zoals ik heb beschreven in deze tip, maar misschien hoeft het nieteens zo ingewikkeld.
    1+1=b

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Thanks voor je reactie.

    Custom line type:
    Zo'n custom line type maken/gebruiken zal even wat studie vereisen. Ik heb er ooit al wel eens mee geëxperimenteerd, maar nooit echt in verdiept. Het zal een keuze worden tussen een vast lijnpatroon dat steeds opschuift, of een veranderend lijnpatroon welke steeds op dezelfde plaats wordt getekend. E.e.a. ander is denk ik wel sterk afhankelijk van: (1) niet vastliggende afmetingen van het control (de omtrek), en (2) de keuze of je het patroon vanuit elke hoek opnieuw begint (zoals het nu is), of dat je het patroon door laat lopen.
    Ik kwam op het idee van zo'n lijntype omdat in het algemeen het gebruik van Pixels wordt afgeraden omdat dat langzaam/inefficient zou zijn. Echter, wil je het nog een beetje "rustig" houden met al die mieren, dan is de snelheid/frequentie niet dusdanig hoog dat je het met de Pixels property niet bij zou kunnen houden. Althans, ik zie met de huidige versie geen flikkering, na-ijlen, of anderzins vervelend gedrag.
    Maar ik zal me er (ter leerink ende vermaeck ) nog eens in verdiepen...

    Timers:
    Dat is wel een goed idee! Ik denk dat met een centrale Timer in de unit en een TList die de controls bijhoudt, dit prima voor elkaar te krijgen valt. Ben wel erg benieuwd of het loopje door de TList in het TimerEvent het interval kan bijhouden, afhankelijk van het aantal controls natuurlijk, maar dit is zeker het onderzoeken waard. De controls zelf worden daar ook een stuk "lichter" van. Thanks.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    Ik zou toch zeker gaan kijken naar die line-types. Canvas.Pixels levert dan weliswaar geen vervelend geflikker op, maar is wel erg traag. Ik vermoed danook dat het meeste 'gewicht' van deze control in het tekenen zit, en niet zozeer in de timer.

    Overigens zat ik me te bedenken: Het is misschien wel mooi als je iets zou kunnen bedenken waarmee je ook andere controls van een lijntje kunt voorzien. Misschien kun je een TComponent-afgeleide maken die zelf niet eens zichtbaar is, maar waarmee je een lijntje kunt tekenen rond andere controls, zoals edits en noem maar op. Met GetDC kun je een device context opvragen van elk TWinControl afgeleide. Deze kun je (aldanniet met een Canvas als tussenvorm) gebruiken om lijnen te tekenen.

    Er zullen nog wel wat haken en ogen aan zitten, maar met je huidige implementatie zul je de Marching Ant oplossing op moeten nemen in een afgeleide van elk control dat je wilt kunnen omlijnen. Het is wellicht de moeite waard om eens naar te zoeken.
    1+1=b

  4. #4
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Timer-issue even ingedoken:

    Ik heb nu drie mogelijkheden naast elkaar vergeleken:
    1. Elk control zijn eigen timer (zoals het was)
    2. Eén gezamelijke timer die alle controls markeerd in zijn OnTimer-event
    3. Eén gezamelijk timer die alle controls een WM_MARK message stuurt

    De conclusie:
    1. De klasse is 100 bytes groter dan bij B of C (=16%)
    2. Dit levert een schokkerig en soms zelfs niet zichtbare markering, afhankelijk van het aantal gemarkeerde controls. Hier was ik al een beetje bang voor: binnen het interval komt hij niet aan het eind van de lus...oid
    3. Dit geeft hetzelfde rustige en gelijklopende effect als bij A.
    Het wordt dus oplossing C, een timer die messages naar de betreffende controls verstuurd. Opgemerkt heb ik ook dat het CPU-usage gebruik niet verschild tussen de drie mogelijkheden:
    Code:
    Manier  Aantal    CPU-usage
            controls     [%]
    ------  --------  ---------
    A           9       25-26
    B           9       25-26
    C           9       25-26
    
    A          25       55-60
    B          25       55-60
    C          25       55-60
    
    A          64       95-96
    B          64       95-96
    C          64       95-96
    Overigens hebben A en C wel een nadeel: bij veel gemarkeerde controls (afhankelijk van computer) wordt de markering trager. Hij komt niet stil te staan (getest met 300 controls). Dus ik neem aan dat een aantal message die verstuurd worden met TControl.Perform niet verwerkt worden, dat de message-cue al maar blijft groeien, en dan vraag ik me af waar die messages blijven. Kan het kwaad? Zat te denken om ze bewust op te eten met GetMessage/PeekMessage, maar het control heeft geen handle. Iemand een idee?
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  5. #5
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Jahoe!

    Tussenstand-rapportage:
    Met een custom line-type is de CPU-usage inmiddels tot 0% gereduceerd!!
    Maar wat ik al verwachtte, de lijntjes sluiten (nog) niet goed aan.

    Wordt vervolgt...
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  6. #6
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Ik ben hier maar eens serieus ingedoken, maar kom net tot de ontdekking dat de conclusie uit post #4 betreffende welke methode de beste visuele performance geeft (door elk control zijn eigen Marking te laten tekenen a.d.h.v. een door één Timer verstuurde message), niet meer juist hoeft te zijn. Omdat het tekenen nu tot een factor ..?.. x zo snel gaat, zou het tekenen vanuit de Manager misschien wel weer aantrekkelijk worden aangezien het markeren van elk willekeurig ander control dan ook wat eerder tot de mogelijkheden gaat behoren.

    Albert gaat dus nog even de test herhalen...
    Last edited by NGLN; 04-Feb-08 at 02:37. Reason: typo
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  7. #7
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Nou, het heeft even geduurd , maar het is gelukt. Met één Timer, zonder Pixels-property en ook de TEdit kan van een markering worden voorzien.

    Ik heb niet voor de singleton-achtige oplossing gekozen zodat je nu eventueel meerdere markering met verschillende kenmerken kunt maken. Bijvoorbeeld met de klok mee en ander control tegen de klok in, mocht iemand dat ooit een keer leuk vinden...

    Thanks voor de tips!
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

Thread Information

Users Browsing this Thread

There are currently 3 users browsing this thread. (0 members and 3 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •