Προς το περιεχόμενο

Γραφικά με την Visual Basic


DataMan

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω αναπτύξει μία εφαρμογή σε περιβάλλον Visual Basic 6, η οποία σχεδιάζει πάρα πολές γραμμές στο εργαλείο PictureBox (20.000 και πάνω) και σε ανάλυση 1024 768. Δεδομένου ότι το Refresh των γραμμών (Cls και επανασχεδίαση) αργεί πάρα πολύ (λογου του πλήθους), γνωρίζετε κάποιον τρόπο που θα κάνω την εφαρμογή αρκετά γρήγορη?

Οι γραμμές σχεδιάζονται στο PictureBox με τον ακόλουθο τρόπο PictureBox1.Line (10,10)-(20,20) κλπ.

Δεν έχω ασχοληθεί με τα εργαλεία DirectX και OpenGL γιατί τα θεωρώ δύσκολα (είναι έτσι?).

 

Ευχαριστώ πολύ.

Δημοσ.

Βασικά αν κατάλαβα καλά το πρόβλημα είναι ότι πετάει τις γραμμές μια μια. Αυτό που πρέπει να κάνεις είναι πρώτα να σχεδιάζεις τις γραμμές στην μνήμη και μετά όταν τελειώσει το ζωγράφισμα στην μνήμη πετάς το αποτέλεσμα όλο στο PictureBox. Αυτό που θες με άλλα λόγια είναι η τεχνική double buffering.

 

Δυστυχώς δεν ξέρω αν το PictureBox υποστηρίζει κάτι τέτοιο. Αν έγραφες σε C θα σου έδινα άπειρο κώδικα.

Δημοσ.

Πρέπει να βρεις κάποιον τρόπο να αποθηκεύσεις ΟΛΟΚΛΗΡΗ την εικόνα του picturebox, και να μην την ξανακατασκευάζεις ανά γραμμή. Κάτι δηλαδή σαν getimage, η οποία θα σου σώζει κάπου στην μνήμη το αποτέλεσμα, και όταν θες να κάνεις refresh θα κάνεις putimage, δηλαδή να βάζεις κατευθείαν όλα τα pixel που έσωσες χωρίς να ξανακάνεις PictureBox.Line.

 

Δες το msdn help για το .NET PictureBox control, κάπου θα σου λέει το όνομα της αντίστοιχης συνάρτησης...

Δημοσ.

vasika mporeis na dokimaseis na kaneis visible=False sto picturebox oso diarkei to loop pou kataskevazeis tis grammes kai meta visible=True wste na mhn ta zwgrafizei real time.

Δημοσ.

Αν για την δημιουργία των γραμμών κάνεις χρήση timers για κάποια επανάληψη εντολών κατέργησε τα timer και παίξε με βρόχους Do...Loop While...Wend κτλ. Ή κάνε χρήση timer μέσω windows API. Θα δεις τρομερή διαφορά σε ταχύτητα.

Δημοσ.
Βασικά αν κατάλαβα καλά το πρόβλημα είναι ότι πετάει τις γραμμές μια μια. Αυτό που πρέπει να κάνεις είναι πρώτα να σχεδιάζεις τις γραμμές στην μνήμη και μετά όταν τελειώσει το ζωγράφισμα στην μνήμη πετάς το αποτέλεσμα όλο στο PictureBox. Αυτό που θες με άλλα λόγια είναι η τεχνική double buffering.

 

Δυστυχώς δεν ξέρω αν το PictureBox υποστηρίζει κάτι τέτοιο. Αν έγραφες σε C θα σου έδινα άπειρο κώδικα.

 

Έχω ακούσει για την τεχνική double buffering, ξέρει κανείς περισσότερες λεπτομερειες ή κάποιο sample code?

Δημοσ.
Πρέπει να βρεις κάποιον τρόπο να αποθηκεύσεις ΟΛΟΚΛΗΡΗ την εικόνα του picturebox' date=' και να μην την ξανακατασκευάζεις ανά γραμμή. Κάτι δηλαδή σαν getimage, η οποία θα σου σώζει κάπου στην μνήμη το αποτέλεσμα, και όταν θες να κάνεις refresh θα κάνεις putimage, δηλαδή να βάζεις κατευθείαν όλα τα pixel που έσωσες χωρίς να ξανακάνεις PictureBox.Line.

 

Δες το msdn help για το .NET PictureBox control, κάπου θα σου λέει το όνομα της αντίστοιχης συνάρτησης...[/quote']

 

Ο τρόπος αυτός δεν με συμφέρει, διότι θα αργεί πάντα την πρώτη φορά δεδομένου ότι οι γραμμές σε ολόκληρο το σχέδιο είναι αρκετές χιλιάδες, ενώ κάθε φορά εμφανίζω συγκεκριμένες. Πάντως σε παρόμοια Projects είναι ένας έξυπνος τρόπος προγραμματισμού.

Δημοσ.
vasika mporeis na dokimaseis na kaneis visible=False sto picturebox oso diarkei to loop pou kataskevazeis tis grammes kai meta visible=True wste na mhn ta zwgrafizei real time.

 

Αυτό έχω κάνει ήδη μεχρι τώρα. Αλλά το πρόβλημά μου δεν είναι εάν θα φένεται ο σχεδιασμός ή όχι, αλλά η ταχύτητα του Refresh.

Δημοσ.
Αν για την δημιουργία των γραμμών κάνεις χρήση timers για κάποια επανάληψη εντολών κατέργησε τα timer και παίξε με βρόχους Do...Loop While...Wend κτλ. Ή κάνε χρήση timer μέσω windows API. Θα δεις τρομερή διαφορά σε ταχύτητα.

 

Η χρήση Timers νομίζω ότι ενοείται ότι δεν χρησιμοποιώ.

Δημοσ.

Ευχαριστώ παιδιά για τις απαντήσεις και τον χρόνο σας.

Νομίζω ότι η τεχνική double buffering που αναφέρει ο godlike πιο πάνω τελικά θα είναι η πιο σωστή. Καλό θα ήταν πάντως από τους πιο ειδικούς του θέματος (πιστεύω ότι υπάρχουν στο Forum) να δώσουν περισσότερες πληροφορίες.

 

Ευχαριστώ και πάλι παιδιά

Δημοσ.

Epeidi exw kanei paromoia pragmata, thewrw pws to provlima einai i .Line method tis basic autis kathe autis, enw stin .net einai akoma pio argi.

 

Exw antimetwpisei to provlima me duo tropous:

1. DirectX. Proswpika exw dokimasei to bibliothikes tou dx8.1. Mporei na kanei theamatika pragmata me ligo kopo. Gia perissoteres plirofories kai samples ektos fusika apo msdn mporeis na katebaseis olokliro to sdk tou dx to opoio exei kai samples se vd, vc gia na deis kai na ta efarmoseis sto diko sou.

 

2. Dokimase tis API functions pou uparxoun sto gdi32.dll (endeiktika onomata PolyLine, PolyPolyLine, Rectangle, etc)

Pragmatika foveres taxutites. Idiws gia grammes pou anafereis nomizw uperterei se taxutita apo to dx, to opoio isws einai kai peritto se mia efarmogi an den exei 3d grafika kai motion.

Sunoptika, oi function tou gdi32 exoun tin eksis logiki:

ftiaxneis enan buffer me ola ta simeia pou thes na zwgrafiseis kai meta afou tou theseis ta "actual" (se poia pragmatika oria zwgrafizeis) kai "visual" (poia oria exei i zwgrafia sou) points of view tris zwgrafias sou apla me ena call zwgrafizei se xrono miden.

Sun oti me ton tropo auto exeis dikaiwma tin idia zwgrafia na tin kaneis polu eukola zoom/unzoom, move apla allazontas ta parapanw points of view tis zwgrafias sou. Simeiwteon o buffer upologizetai mia fora.

 

An sou fanikan endiaferonta rikse mia matia edw gia peraiterw panw sta api functions:http://www.allapi.net

katebazeis ena mikro programmataki pou exeis samples gia to pws na xrisimopoieis tis api functions entos vb (kuriws vb6).

Δημοσ.

Alcoholic,

Δηλαδή μου λές να αλλάξω την Line με την PolyLine?

 

Στην εφαρμογή χρησιμοποιώ την Line για απλές γραμμές η Rectangle τι κάνει?).

Τα στοιχεία τα διαβάζω από βάση δεδομένων και έχω ελέγξει βέβαια ότι η καθυστέριση οφείλεται στον σχεδιασμό. Αυτό που δεν είμαι σε θέση να γνωρίζω είναι εάν αλλάξω κάρτα γραφικών, εάν θα αλλάξει και η ταχύτητα σχεδίασης ή τελικά οφείλεται σε αδυναμία της Visual Basic.

Πάντως θεωριτικά παντα, ο τρόπος σχεδιασμού στη μνήμη και μετά αποτύπωση στο PictureBox ίσως είναι ο καλύτερος

Δημοσ.
Ο τρόπος αυτός δεν με συμφέρει, διότι θα αργεί πάντα την πρώτη φορά δεδομένου ότι οι γραμμές σε ολόκληρο το σχέδιο είναι αρκετές χιλιάδες, ενώ κάθε φορά εμφανίζω συγκεκριμένες.

Νομίζω ότι δεν έχεις εκθέσει σωστά το πρόβλημά σου.

1) Το doublebuffering είναι για να μην τρεμοπαίζει το control κατά το ζωγράφισμα. Δεν θα είναι πιο γρήγορο, θα είναι λίγο πιο αργό.

2) Εφόσον θες να εμφανίζεις ένα υποσύνολο των γραμμών, ΔΕΝ είναι σωστό προγραμματιστικά να λες στο PictureBox να τις εμφανίσει όλες. Εκτός από το clipping που γίνεται έτσι κι αλλιώς, πρέπει να μειώνεις και τον όγκο που ζωγραφίζεις. Αν τα 3D παιχνίδια στέλναν όλα τα δεδομένα της πίστας κάθε οθόνη θα χρειαζόταν αρκετά δευτερόλεπτα για να ζωγραφιστεί.

 

Περιέγραψε λίγο τι ακριβώς κάνεις με τις 20000 γραμμές, πώς επιλέγεις ποιες θα εμφανίσεις κτλ για να σε βοηθήσουμε να κάνεις κάποιο optimization.

 

Πάντως και χειρωνακτικό clipping να κάνεις (να ελέγχεις δηλαδή και όποιες γραμμές δεν θες να εμφανιστούν να μην τις ζωγραφίζεις) θα έχεις πολύ μεγαλύτερη ταχύτητα.

Δημοσ.

Αντιθέτως alkisg νομίζω ότι ήμουν σαφής.

Έχω στη βάση δεδομενων πληροφορίες σημείων που αφορούν ένα συγκεκριμένο σχέδιο. Ανάλογα με το zoom που θέλω να εμφανίσω, επιλέγω με ποιες πληροφορίες θα εμφανίζονται στο PictureBox.

Δεδομένου ότι σχεδιάζω μόνο ότι είναι μέσα στο PictureBox, κάθε φορά που κάνω move, zoom, κτλ. επανασχεδιάζω τις νέες πληροφορίες που θα εμφανιστούν.

Όπως είπα και πιο πάνω, ανάλογα με το zoom που επιλέγω, εμφανίζονται λίγες ή πολλές γραμμές. Όταν φτάνω σε σημείο που εμφανίζω πολλές γραμμές (είναι απαραίτητες να σχεδιαστούν και όχι περριτές), καθυστερεί η σχεδίαση.

Λέω λοιπόν εάν υπάρχει τρόπος (προγραμματιστικά στην VB) να σχεδιάζω πολλές γραμμές σε πιο σύντομο χρονικό διάστημα ή τελικά είναι αδυναμία της γλώσσας.

Δεν είμαι σαφής?

Δημοσ.

i PolyLine kai oi alles pou anefera einai api functions pou pairnoun san orisma enan window handler opote zwgrafizoun panw se otidipote exei window handler.

rikse mia matia gia ena sample kai tha katalabeis, den prokeitai gia methodo tou picturebox.

Episis, thewrw pws to priovlima souopfeiletai ston xrono pou xreiazetai i basic gia na tabiksei tis grammes xrisimopoiwntas auton tropo PictureBox.Line ..... Pisteyw pws oti kai na allakseis the deis beltiwsi mexri se ena simeio, pou ousiastika einai kai to porio tis basic pou suzitame.

 

Auto pou eipe o alkisg einai swsto, kai auto ennoousa panw katw me ta oria pou theteis stin zwgrafia sou.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...