[VB] Tekenen gaat te traag...

Pagina: 1
Acties:

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
Ik heb wat code gemaakt om een hostogram in 3D te laten tekenen in VB. Het is voor een DU Meter die elke seconde word ge-update. Onderstaande code simuleert dit door elke seconde 60 "blokjes" te tekenen. In de praktijk zal dit een array van 60 getallen worden.

Voor volgende code is nodig:
- een PictureBox met autoredraw=true en scalemode= twip
- een timer op 1000ms.

Het tekenen zelf gaat echter te traag om praktisch te zijn. het duurt ongeveer 0,5 seconde op mijn AMD 2000+. Dit moet toch ook in enkele miliseconden kunnen op een of andere manier :?

Er kan alvast nog 1 optimalisatie doorgevoerd worden door bij tekenen de VOLGENDE waarde ook mee te sturen en enkel de voorkant te tekenen vanaf het punt waar de volgende waarde start... maar vrees dat dat niet voldoende zal zijn...

Afbeeldingslocatie: http://www.ispmonitor.be/images/histo.png

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Public Sub Draw3d(mm As Integer, xx As Integer)
    Dim mX As Integer
    Dim mY As Integer
    
    For mY = 1500 To xx Step -1
        picBar.Line (mm + 70, mY)-(mm + 70 + 150, mY - 150), RGB(10, 10, 100)
    Next
    
    For mX = mm + 20 To mm + 70
        picBar.Line (mX, xx)-(mX + 150, mY - 150), RGB(10, 10, 200)
    Next
    
    picBar.Line (mm + 20, xx)-(mm + 70, 1500), RGB(10, 100, 200), BF
End Sub

Private Sub Timer1_Timer()
    Picture1.Picture = LoadPicture("")
    For i = 1 To 60
        Randomize
        Draw3d i * 50, Int(Rnd * (1490 - 200 + 1)) + 200
    Next
    Picture1.Picture = Picture1.Image
End Sub

[ Voor 4% gewijzigd door WhiteDog op 24-09-2003 08:56 ]


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

Je tekent nu tig lijntjes zie ik...

Is het niet een slim idee om alleen de outlines te tekenen en deze dan te vullen?

Stop uploading passwords to Github!


  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
Papa Eend schreef op 24 September 2003 @ 09:13:
Je tekent nu tig lijntjes zie ik...

Is het niet een slim idee om alleen de outlines te tekenen en deze dan te vullen?
Eventueel... maar ik geen idee hoe je zoiets moet fillen in vb :(

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Randomize hoef je maar 1 keer aan te roepen, moet je niet in de loop doen. (Kost niet zo heel veel performance, maar levert je wel foute, weinig random, getallen op).

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
Pooh schreef op 24 September 2003 @ 09:26:
Randomize hoef je maar 1 keer aan te roepen, moet je niet in de loop doen. (Kost niet zo heel veel performance, maar levert je wel foute, weinig random, getallen op).
das ook maar om te testen, komt niet in de uiteindelijke code :) (maar bedankt voor de tip :))

Heb hier wat gevonden over plogonen tekenen en fillen:
http://www.experts-exchan...ual_Basic/Q_20656279.html

Het probleem is dat al die api's in piwels werken wat een veel te "korrelig" effect geeft bij schuine lijnen... mijn code werkt met twips en is daarom veel mooier...

EDIT: optimized code die pas begint te tekenen van waar het zichtbaar zal zijn.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Public Sub Draw3d(mm As Integer, xx As Integer, yy As Integer)
    Dim mX As Integer
    Dim mY As Integer
    
    If yy < xx Then
        For mY = 1500 To xx Step -1
            Picture1.Line (mm + 70, mY)-(mm + 70 + 150, mY - 150), RGB(10, 10, 100)
        Next
    Else
        For mY = yy To xx Step -1
            Picture1.Line (mm + 70, mY)-(mm + 70 + 150, mY - 150), RGB(10, 10, 100)
        Next
    End If
    
    For mX = mm + 20 To mm + 70
        Picture1.Line (mX, xx)-(mX + 150, mY - 150), RGB(10, 10, 200)
    Next
    
    Picture1.Line (mm + 20, xx)-(mm + 70, 1500), RGB(10, 100, 200), BF
End Sub

Private Sub Timer1_Timer()
    Dim x(60) As Integer
    
    Picture1.Picture = LoadPicture("")
    Randomize
    For i = 1 To 60
        x(i) = Int(Rnd * (1490 - 200 + 1)) + 200
    Next
    
    For i = 1 To 59
        Draw3d i * 50, x(i), x(i + 1)
    Next
    
    Picture1.Picture = Picture1.Image
End Sub

[ Voor 45% gewijzigd door WhiteDog op 24-09-2003 10:15 ]


  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
Sta nog geen stap verder...

Wat ik geprobeerd heb:
1. een frame tekenen
2. dit laten fillen met de FloodFill API (door een pixel in het frame te berekenen)

Bovenstaande oplossing werkt echter niet 100%. Ik kreeg het ook niet gescaled en ben er maar vanaf gestapt dan...

Heb het nu zo gemaakt dat hij de voorkant met verticale strepen vult ipv horizontaal. Dit zijn er maar 130 ipv de 500 a 2000 die anders getekend moeten worden...

De code doet het hier nu in 0,06 a 0,20 seconde.

Helaas is het nog veel te traag om te gaan gebruiken daar de graph elke seconde hertekend word.

Alvast nog een screenie:
Afbeeldingslocatie: http://www.ispmonitor.be/images/graph2.png

En het project:
http://www.ispmonitor.be/files/graph.rar


wie helpt?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 04:06

.oisyn

Moderator Devschuur®

Demotivational Speaker

Vergeet trouwens niet dat twips system-dependant zijn. Een twip is 1/1440e van een inch, en is dus niet een vast deel van een pixel.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • henkleerssen
  • Registratie: December 2000
  • Niet online

henkleerssen

Your life is as you narrate it

WhiteDog schreef op 25 September 2003 @ 21:22:
Sta nog geen stap verder...

Wat ik geprobeerd heb:
1. een frame tekenen
2. dit laten fillen met de FloodFill API (door een pixel in het frame te berekenen)

Bovenstaande oplossing werkt echter niet 100%. Ik kreeg het ook niet gescaled en ben er maar vanaf gestapt dan...

Heb het nu zo gemaakt dat hij de voorkant met verticale strepen vult ipv horizontaal. Dit zijn er maar 130 ipv de 500 a 2000 die anders getekend moeten worden...

De code doet het hier nu in 0,06 a 0,20 seconde.

Helaas is het nog veel te traag om te gaan gebruiken daar de graph elke seconde hertekend word.

Alvast nog een screenie:
[afbeelding]

En het project:
http://www.ispmonitor.be/files/graph.rar


wie helpt?
mm bij mij ff de code getest.... met default vbtwips komt die vaak boven de 0,03125 uit (niet meer dan de helft..).. Als je Scalemode = vbPixels zet.. dan heb ik meer dan de helft op 0,03125 na de draw... Helpt dat bij iemand anders nog ook? Praat ik hier onzin?

  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
henkleerssen schreef op 25 September 2003 @ 23:02:
[...]


mm bij mij ff de code getest.... met default vbtwips komt die vaak boven de 0,03125 uit (niet meer dan de helft..).. Als je Scalemode = vbPixels zet.. dan heb ik meer dan de helft op 0,03125 na de draw... Helpt dat bij iemand anders nog ook? Praat ik hier onzin?
Ik heb de oplossing... ben overgestapt op pixels en heb alle getallen door 10 gedeeld.

hierdoor worden er een factor 10 minder berekeningen gedaan, de hele boel word nu getekend op 0,01 a 0,1 seconde :P

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt "gedeeld door 10" beter effe laten uitrekenen m.b.v. Screen.TwipsperPixelX en Screen.TwipsperPixelY, dan heb je het exacte getal (meestal 15) en teken je dus op hele pixels.

Tevens zie ik dat je nu netjes wat API's gebruikt. Dat scheelt al weer een hoop ;)

Tevens zijn bij mij de tijden redelijk acceptabel (let op: ik zie soms 4,589844E-02, dat lijkt lang maar is dus eigenlijk maar 0.04nogwa seconden). Op mijn systeem (PIV 2Ghz) zijn de tijden zo gemiddeld rond de 0.03 en 0.04 seconden.

Overigens, echt snel 2D kun je met DirectDraw, maar dat is volgens mij vervallen sinds DirectX 8 of 9...Of ja..vervallen.....onder een andere noemer waarschijnlijk doorgegaan ofzo maar daar weet ik het fijne niet van. Overigens is het nogal overkill voor zo'n klein diagrammetje ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • WhiteDog
  • Registratie: Juni 2001
  • Laatst online: 21-08 08:40

WhiteDog

met zwarte hond

Topicstarter
RobIII schreef op 26 September 2003 @ 01:30:
Je kunt "gedeeld door 10" beter effe laten uitrekenen m.b.v. Screen.TwipsperPixelX en Screen.TwipsperPixelY, dan heb je het exacte getal (meestal 15) en teken je dus op hele pixels.

Tevens zie ik dat je nu netjes wat API's gebruikt. Dat scheelt al weer een hoop ;)

Tevens zijn bij mij de tijden redelijk acceptabel (let op: ik zie soms 4,589844E-02, dat lijkt lang maar is dus eigenlijk maar 0.04nogwa seconden). Op mijn systeem (PIV 2Ghz) zijn de tijden zo gemiddeld rond de 0.03 en 0.04 seconden.

Overigens, echt snel 2D kun je met DirectDraw, maar dat is volgens mij vervallen sinds DirectX 8 of 9...Of ja..vervallen.....onder een andere noemer waarschijnlijk doorgegaan ofzo maar daar weet ik het fijne niet van. Overigens is het nogal overkill voor zo'n klein diagrammetje ;)
Ik heb niet "exact" door 10 gedeeld uiteraard maar gewoon pixels ingesteld. ben alles aan het overbouwen naar mijn main app nu... :P

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 15-08 11:47

Sponge

Serious Game Developer

1 ) Die RGB(r,g,b) kan je ook vervangen, met een voorgezette variabele, of gewon een constante.

2) Maak van de integers 32bit - (Long dus)

3) Maak van Picture.Loadpicture gewoon Picture.cls (clear screen)

4) Check http://www.persistentrealities.com/vbfibre :Y)

Eventueel:
- Gebruik API's, bijv SetBitmapbits, Setdibbits, of gewoon de Line drawing API's (ff google :P)
- Gebruik direct memory access, zoals bijv voor de voxel engine gedaan wordt op www.ur.co.nz
- Check bijv de raytracer op m'n site :)

[ Voor 4% gewijzigd door Sponge op 26-09-2003 08:57 ]

Pagina: 1