Was ist die schnellste Grafik(engine) ?

  • Hey

    Da ich mich momentan mit GDI+ auseinandersetzte und leider feststellen muss, dass GDI+ ziemlich "langsam" ist. Desshalb will ich mal fragen, was der schnellste Weg ist etwas auf den Bildschirm zu zeichnen. Ich vermute eines dieser Dinge hier (Bitte nur Windows Komponenten, kein QuickDraw oder Unreal, posten):
    -DirectX
    -DllCall("gdi32.dll", "long", "SetPixel", "long", $dc[0], "long", $x, "long", $y, "long", $color)
    Mir ist es egal wie viel Zeit ich reinstecken muss, damit ich eine sehr schnelle Grafikengine mache, nur ich möchte bei AutoIt oder C++ bleiben.
    - Mit der Schnelligkeit meine ich natürlich nicht, dass ich jetzt hingehe und mit MASM arbeite :D .

    Schon mal danke im Vorraus

    Nur keine Hektik - das Leben ist stressig genug

  • Womit arbeitet denn die Irrlicht? Wahrscheinlich ja mit DirectX ...
    Also ist DirectX besser als der DllCall, wenn man 2D-Elemente zeichnen möchte ? (abgesehen von der verzögerung der DllCall)

    Nur keine Hektik - das Leben ist stressig genug

  • Hmmm, WAS ist bei GDI+ langsam? Das gesamte Windows setzt auf GDI(+), ich finde daher, Oberflächen/Fensterfunktionen usw sind schnell genug!

    Je nach Treiber/Grafikkarte werden 2D-Funktionen aus dem GDI auch beschleunigt, kommt ganz darauf an, was man machen möchte!
    DirectX setzt bei 2D generell auf die Leistungsfähigkeit der Graka, viel hilft viel. Wenn allerdings z.B. ein Netbook bestimmte Funktionen nicht in Hardware anbietet, werden diese per Software emuliert...dann bekommt der Begriff "langsam" ganz neue Dimensionen. Im 2D-Bereich wird idR eher weniger durch die Graka beschleunigt.

    Einige GDI-API-Funktionen (wie z.B. SetPixel() ) sind nicht das schnellste, aber wer setzt das ein? Ok, für z.B. ein "Apfelmännchen" mag das angehen einzelne Pixel zu setzen, aber bei Spielen wird z.B. mit Sprites gearbeitet, und da "setzt" kaum jemand einzelne Pixel zu einem Bild zusammen! Auch beim Apfelmännchen ist es WESENTLICH schneller, die Pixel direkt im Backbuffer zu setzen und diesen dann komplett in die GUI zu "blitten".
    Das was in AutoIt WIRKLICH Zeit kostet sind die Berechnungen bzw lange und rechenintensive "inner Loops". Der "Tunnelflug" im Assembler-Tut ist da ein schönes Beispiel. Die Darstellung, das heisst das eigentliche Projezieren in die GUI erledigt ein (immer gleich schnelles) Bitblt(). Wo man Zeit spart? In der Berechnung! Und die kann man ohne Probleme in eine C++ DLL auslagern. Die eigentliche Grafikdarstellung ist in GDI bei weitem schnell genug! (siehe UEZ´s Beispiele)

    Weiterhin hilft es, ALLES was an Grafiken erscheinen soll, im direkten Zugriff (d.h. im Speicher) zu haben. Dann reicht meist entweder ein schnelles blitten oder ein MemMove().
    Im 3D-Bereich ist GDI aber aufgrund des Bustransfers aus dem Hauptspeicher zur Graka einem "echten" D3D oder OpenGl hoffnungslos unterlegen.

  • Danke, ich guck mir mal die _WinAPI_BitBlt an.

    Andy: Also meinst du dass ich mit _WinAPI_BitBlt (oder GDI+) im 2D-Bereich arbeiten soll, und im 3D mit DirectX ?

    Edit: Kann man mit _WinAPI_BitBlt nur ein DC-Handel in den Buffer kopieren? Und kann ein DC-Handel auch eine Grafik sein oder ein Pixel-Array ?

    Nur keine Hektik - das Leben ist stressig genug

    Einmal editiert, zuletzt von AntiSpeed (8. November 2010 um 19:45)

  • Ich habe ja auch einige Grafik-Engines durch, und muß sagen das die QuickDraw im 2D Bereich so ziemlich die schnellste ist aber leider hat sie nicht genügend Funktionen. GDI+ hat viele Möglichkeiten ist aber schon eher 'langsam' in den allgemeinen Funktionen (nicht hauen, Andy). Prospeed lässt sich ziemlich schwierig Programmieren, hat aber schöne Effekte.
    Ich würde auch die aktuelle Irrlicht nehmen (ich arbeite auch gerade damit), ist zwar in 3D und daher etwas 'anders' in der Handhabung, lässt sich aber sehr gut programmieren und ist auch recht zügig unterwegs.

    Ist aber auch ein Glaubens-Konflikt ;)

    Grüsse!

    [Edit]
    Irrlicht Arbeitet mit DirectX, OpenGL und sogar mit Software-Renderer; jenachdem was man will.

  • Aber die Irrlicht ist doch bestimmt mit DirectX geschrieben und somit ist doch auch DirectX "schneller" als die Irrlicht, nur ohne die ganzen wichtigen Funktionen, oder nicht?

    Nur keine Hektik - das Leben ist stressig genug

  • Die Irrlicht-engine ist in C++ geschrieben und verwendet je nach Wahl DirectX 9, DirectX 8, Open GL (afaik 2.1, bin mir aber nicht sicher), Burningsvideo und einen eigenen Renderer.

    Burningsvideo eignet sich eigentlich fast nicht für 3d-Kram und der Irrlicht-renderer kann praktisch nur 2d, auch wenn es ganz wenig und total schlecht auch 3d anzeigen kann.


    Da für dich ja nur eine 2d-Engine in Frage kommt, ist das eigentlich egal, aber wenn es um 3d geht, ist DirectX 11 mit entsprechender Grafikkarte für die gleichen Effekte ca. 20% schneller als die entsprechenden Funktionen in DirectX 9 (zumindest bei meinem Test).

  • Also die Handhabung von der Irrlicht ist eben ganz klasse, wenn ich bedenke das man versucht mit C++ und DirectX zu Arbeiten und das alles dann iwie mit AU3 zu vertütteln... Viel Spaß!
    Wie gesagt, ich kann ja auch nur durch meine Erfahrung sprechen; und wenn du locker einen Monat krampfhaft versuchst irgendeine Technik zu verstehen die hinter einer Engine steckt, und das ohne Erfolg. Dann wechselst du frustiert die Engine und kriegst die gleichen Ergebnisse in wenigen Stunden... Würde ich mir echt überlegen!

    Und DX ist natürlich schneller als die Irrlicht, das mußt du aber auch iwie Programmiert kriegen.

  • Also ich finde das "spannende" am Proggrammieren ist ja, dass man alles von Grund auf versteht, und wenn man dann schon mal einen Ansatz einer 3D-Engine geschrieben hat, kann man die Erfahrung bestimmt gut wo anders gebrauchen (auch wenn man dann nachher zur Irrlicht wechselt)..

    Nur keine Hektik - das Leben ist stressig genug

  • Also die Handhabung von der Irrlicht ist eben ganz klasse, wenn ich bedenke das man versucht mit C++ und DirectX zu Arbeiten und das alles dann iwie mit AU3 zu vertütteln... Viel Spaß!
    [...]
    Und DX ist natürlich schneller als die Irrlicht, das mußt du aber auch iwie Programmiert kriegen.


    Jep, mit der Irrlicht-engine könnte ich problemlos ein kleines Spiel erstellen, mit DirectX schaffe ich es gerade mal ein paar farbige Dreiecke anzuzeigen.


    PS: Die Irrlicht-Engine ist open-source. Du kannst den Quelltext jederzeit anschauen. Sie ist auch ganz gut dokumentiert und die Funktions- und Variablennamen sind auch sehr leicht verständlich.

  • Danke für den Tipp.

    Zitat

    ein paar farbige Dreiecke

    Ist von der Schnelligkeit jeztzt GDI+ oder doch DirectX besser?
    So wie ich das verstanden habe ist GDI+ einfach, DirectX kompliziert und ein bisschen schneller im 2D als GDI+!?

    Nur keine Hektik - das Leben ist stressig genug

  • Von der schnelligkeit ist DirectX der GDI+ mehrfach überlegen. OpenGL währe auch noch eine Überlegung wert. Was hasst du den genau vor?? Ich habe hier jetzt rausgelesen das du eine Engine erstellen willst?!?

  • Jaa, so in etwa. Ich möchte mal selber so etwas anhaltweise versuchen. Desshalb möchte ich den schnellsten Weg, damit die Arbeit dann auch nicht umsonst war. Erst einmal möchte ich eine 2D Engine schreiben, bevor ich dann mich an 3D ranwage.

    Nur keine Hektik - das Leben ist stressig genug

  • Puhhh... Na dann mal viel spaß dabei!
    Und versuch dich dann in DirectX; am besten DX9 sowie DX11; Und entscheide dich welchen PS du nutzen willst (PS2.0 / PS4.0). Weil sonst kommen nur neueren Grafikkarten in den genuß deiner zukünftigen Engine. Aber eines kann ich dir jetzt schon sagen: das wird ein riesen stück Arbeit!
    Und als Tip, programmier es so das Grafik-Objekte angelegt werden. Diese kann man später immer verändern und auslöschen, brauch sie aber nicht jeden Frame neu aufbauen. Dadurch kann man ganz gut die Rechengeschwindigkeit von AutoIt Kompensieren.

  • Danke für die ganzen Tipps.
    Werde sie alle mal einbinden.

    Werde mich dann wieder melden, wenn ich probleme mit meiner UDF habe.
    Danke für alle Antworten.

    Nur keine Hektik - das Leben ist stressig genug

  • Ich beneide euch...
    Ihr könnt alle schon gut C++ und meine Motivation fällt ins Minus, wenn ich wieder 100 Fehler in Sachen Pointer und Datentypen habe und die net kapier ;(
    Darf man den C++ Code dann sehen?
    Würde mir sicher helfen :)

    [autoit]


    While $Life = True
    $nMSG = BrainGetMsg()
    Switch $nMSG
    Case $Idea
    _Convert_Idea2Code()
    EndSwitch
    WEnd

    [/autoit]