Womit am schnellsten einfache Linien Zeichnen?

peterhagen

Grünschnabel
Hallo,

ich moechte ein virtuelles Messgeraet programmieren, dazu muss ich ziemlich viele Linien zeichen (etwa 10 Millionen / Sekunde). Ich dachte mir das die aktuellen Grafikkarten das schaffen sollten, oder? Nun bin ich auf der Suche nach der schnellesten und nicht zu aufwendigen Methode. GDI, DirectX9 oder OpenGL oder gibt es noch was?

Richtig toll und einfacher fuer mich waere auch ein Samplecode der einfach nur einen Array von Linien malt. Sowas wie DrawQuickline(X1,Y1,X2,Y2,Color) braeuchte ich.

Achso ein anderes nicht unwichtigeres Problem, wenn mehrer Linien sich Kreuzen oder sogar aufeinaderliegen, dann sollen diese Schnittpunkte bei jedem neuen druebermalen heller werden... aber das kommst später :)

Freue mich ueber hilfreiche Ideen oder Links, etc.

Peter
 
(etwa 10 Millionen / Sekunde)
Das ist mächtig viel. Bist du sicher, dass du dich da nicht verrechnet hast?

Bei GDI dürfte es am einfachsten sein, etwas auf die Beine zu stellen, es sei denn, jemand hat ein einfaches Linienmalprogrammbeispiel mit Sourcen für Direct3D oder OpenGL.

Achso ein anderes nicht unwichtigeres Problem, wenn mehrer Linien sich Kreuzen oder sogar aufeinaderliegen, dann sollen diese Schnittpunkte bei jedem neuen druebermalen heller werden... aber das kommst später
Dann solltest du auf jeden Fall mit Direct3D oder OpenGL arbeiten, weil sich das bei sinnvoller Einstellung des Rendermodes/der Transparenz von selbst erledigt.
 
Hallo,
naja das war grob aufgerundet mit den 10 Millionen, es sind eigentlich nur grob 5,2 Millionen Linien/Sekunde :)

Peter
 
hi
Ich weis net obs dir weiter hilft, aber
so sieht ein einfacher OpenGl Quelltext aus der ein paar Linien zeichnet:

Code:
#include <windows.h>
#include <gl/Gl.h>
#include <gl/Glu.h>
#include <gl/glut.h>

static void myInit(void)
{   
    /* Initializations */
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glClearColor (1.0, 1.0, 1.0, 1.0);  /* Background color */
 }

static void myDisplay(void)
{
    /* Creating the Scene */
    glClear(GL_COLOR_BUFFER_BIT);   
    glColor3f(0.0,0.0,0.0);		  /* Black */
    glBegin(GL_LINES);          
		glVertex2f(0.25,0.25);
	 	glVertex2f(0.75,0.25);  
		glVertex2f(0.75,0.75);    
		glVertex2f(0.25,0.75);		  
    glEnd(); 
    glFlush ();		  /* Flushes OpenGL command queues and buffers */
}

static void myReshape(int w, int h)
{
    /* Callback function to handle window dimensions and size changes */

    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);	/* specifies the current matrix */
    glLoadIdentity();			/* Sets the currant matrix to identity */
    gluOrtho2D(0.0,1.0,0.0,1.0);	/* Sets the clipping rectangle extends */
}

/*  Main Loop */

void main(int argc, char** argv)
{

    glutInit(&argc, argv);   // initialize the toolkit
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);   // set the display mode
    glutInitWindowSize(480, 480);   // set window size
    glutInitWindowPosition(100, 150);   // set the window position on screen
    glutCreateWindow("Quadrat");   // open the screen window

    // register the callback funtions
    glutDisplayFunc(myDisplay);
    glutReshapeFunc(myReshape);

    myInit();   // additionally initializations as necessary
    glutMainLoop();   // go into a perpetual loop
}


glVertex2f(0.25,0.25); setzt einen Pixel und je 2 pixel ergeben eine Linie,um andere Linien zu zeichen , must du den Eintrag "GL_LINES" ändern.
Weiterhin musst du die OpenGl biliotheken installieren damit das ganze funktioniert.

Obs schnell genug ist ,weis ich auch net .probs am besten aus.

Mfg col.blake
 
Ohh fein das sieht doch sehr schoen aus und ist nicht so kompliziert, wie DirectX9... Da hatte ich mir schon diverse Sachen angeguckt, aber alleine das Initialisieren ist schon so lang wie dein Qelltext...

Peter
 
Zuletzt bearbeitet:
Die hast du (zumindest bei VC++ 6.0) schon dabei. Guck mal in das Verzeichnis Microsoft Visual Studio\VC98\Include\GL. Allerdings fehlt dir GLUT (eine OpenGL-Hilfslibrary) noch zu deinem Glück, das bekommst du beispielsweise hier .

@colblake: Guter Schnipsel! Vielen Dank!
 
Zuletzt bearbeitet:
Hallo,
also ich hab mir die .h und die .lib von OpenGL.org geholt. Ich benutze uebrigens VC7. Nun habe ich probier "den Schnipsel" zu compilieren, habe noch eine WinMain() hinzugefuegt (geht das auch ohne irgendwie?) Nun sagt mir der Compiler die Opengl.dll wuerde fehlen, was auch stimmt. Ich habe nur eine OpenGL32.dll wenn ich die kopiere und umbenenne bekomme ich noch weitere Fehlermeldungen. Grafikkarte ist eine normale GeForce Ti4200 mit aktuellem Treiber.

Peter
 
*Kopf kratz*

habe noch eine WinMain() hinzugefuegt (geht das auch ohne irgendwie?)
Eine main() brauchst du immer irgendwo, und eigentlich hätte ich gedacht, dass die aus dem Schnipsel genügt, obwohl sie void zurückgibt. Mit GLUT funktioniert das allerdings ein bischen anders - schau da mal in die Doks rein oder warte ab, was colblake vielleicht noch dazu sagt.

Nun sagt mir der Compiler die Opengl.dll wuerde fehlen, was auch stimmt.
Das sollte dem Compiler eigentlich egal sein. Die DLL wird (meines Wissens) erst gebraucht zur Runtime. Kopier die opengl32.dll doch mal in dasselbe Verzeichnis, in dem sich deine Exe befindet, vielleicht geht das.

Hast du dir übrigens GLUT besorgt oder ist das bei VC7 dabei?
 
Hallo,
ich habe die GLUT direkt von http://www.opengl.org, damit ist soweit auch alles okay. Ich bin nur zu bloed ein vc7 projekt anzulegen womit ich einfach nur ein simples, gutes, altes c Programm compilieren kann.

z.B.
void main(){}

Er motzt immer rum, das er eine winmain braucht.:

atltest error LNK2019: unresolved external symbol _WinMain@16 referenced in function _WinMainCRTStartup

Ich hab bislang immer nur .dlls damit programmiert, das hat immer alles prima funktioniert. Ich versteh die Welt nicht mehr. Frueher unter DOS war irgendwie alles einfacher :)

Peter

EDIT: ahh selbst gefunden, man kann bei dem Win32Projekt noch Settings einstellen... da muss man Console anklicken und alles wird gut :)

EDIT2: und nun kann ich auch den Beispielcode compilieren! nur kommt da kein Quadrat raus, sondern nur 2 Linien oben und unten, die Seiten links und rechts fehlen, aber zum anfangen reichts! Vielen Dank!
 
Zuletzt bearbeitet:
Noch eine weiter Frage. Kann man die Koordinaten des Quadrats auch anders skalieren? Also so dass ich z.B. den Raum mit Bytes ansprechen kann. Also unten-links = 0/0 und oben/rechts=255/255 oder ist das immer ein float() von 0-1?
Wuerde wahrscheinlich schneller gehen, wenn ich nicht noch jedes byte umrechnen muesste oder?

Peter
 

Neue Beiträge

Zurück