Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Ausweg aus langsamen Delphi Grafikroutinen gesucht!


shalashaska - So 14.11.04 21:06
Titel: Ausweg aus langsamen Delphi Grafikroutinen gesucht!
SO! ENDLICH! Nachdem ich es endlich geschafft habe mich hier in diesem SCHHH... Forum einzuloggen kann ich endlich mal ne Frage stellen... :evil:

puhhh..

Also. Ich brauche einfach etwas schnelleres als die guten alten Prozeduren wie Canvas.Draw, Canvas.CopyRect etc...! DIe sind zwar so ganz schön und gut aber ich brauche etwas schnelleres und ich denke wir sind uns sicher das es etwas schnelleres gibt!

Z.b. hat mir mal jemand von WinG erzählt. Schön. Da gibts die Unit welche sich "dibs" nennt und versch. Prozeduren für Dibs und FLIs enthält. Nun hab ich mir mal so eine dieser Prozeduren und was dazu gehörte in meinen Code kopiert aber denkt ihr das funktionierte? HAH!

Also was kann ich tun? Sollte ich vielleicht wirklich auf C++ umsteigen? Delphi scheint in Richtig Grafik/Spiele einfach NICHTS zu taugen. Vielleicht muss ich wirklich lernen systemnah zu programmieren da Prozeduren wie Canvas.Draw usw. vermutlich über die abenteuerlichsten Umwege funktionieren und somit in Sachen Performance nichts bieten können. :x :(

cya!

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.
Moderiert von user profile iconTino: E-Mailadresse entfernt. Antworten hier ins Forum - s. Richtlinien


raziel - So 14.11.04 21:20
Titel: Re: Ausweg aus langsamen Delphi Grafikroutinen gesucht!
shalashaska hat folgendes geschrieben:
SO! ENDLICH! Nachdem ich es endlich geschafft habe mich hier in diesem SCHHH... Forum einzuloggen kann ich endlich mal ne Frage stellen... :evil:

So macht man sich gleich ein paar Freunde in diesem SCHHH...önen Forum :roll:

WinG ist IIRC nichts anderes als der Vorgänger von Suche in: Delphi-Forum, Delphi-Library DIRECTX. Alternativ gäbs für Grafiken in Delphi auch noch Suche in: Delphi-Forum, Delphi-Library OPENGL und Suche in: Delphi-Forum, Delphi-Library SDL.


Spieler1 - So 14.11.04 21:22

Das hat nichts mit Delphi zu tun ... und nein, du solltest nicht auf C++ umsteigen. ;)

Probier mal (JEDI-)SDL aus.
Oder gleich OpenGL oder DirectX.


Spieler1 - So 14.11.04 21:23
Titel: Re: Ausweg aus langsamen Delphi Grafikroutinen gesucht!
raziel hat folgendes geschrieben:
shalashaska hat folgendes geschrieben:
SO! ENDLICH! Nachdem ich es endlich geschafft habe mich hier in diesem SCHHH... Forum einzuloggen kann ich endlich mal ne Frage stellen... :evil:

So macht man sich gleich ein paar Freunde in diesem SCHHH...önen Forum :roll:

WinG ist IIRC nichts anderes als der Vorgänger von Suche in: Delphi-Forum, Delphi-Library DIRECTX. Alternativ gäbs für Grafiken in Delphi auch noch Suche in: Delphi-Forum, Delphi-Library OPENGL und Suche in: Delphi-Forum, Delphi-Library SDL.

Ahhhrg, du warst schneller! :wink:


shalashaska - So 14.11.04 21:34

Ja schön das weis ich auch... >_<
Aber wie benutzt man denn DX oder OpenGL in Delphi6??
Woher weis ich welche prozeduren es gibt und was sie machen?


Spieler1 - So 14.11.04 21:35

shalashaska hat folgendes geschrieben:
Ja schön das weis ich auch... >_<
Aber wie benutzt man denn DX oder OpenGL in Delphi6??
Woher weis ich welche prozeduren es gibt und was sie machen?

Lies dir ein Tutorial darüber durch, schau in die Dokumentation oder such mal (z.B. mit Google ;)) danach ... :roll:


Spieler1 - So 14.11.04 21:38

Schau z.B. mal auf dieser Seite (offizielle JEDI-SDL Homepage): http://www.delphi-jedi.org/TEAM_SDL_HOME:255650


shalashaska - So 14.11.04 21:52

Ich rege mich doch nur so auf weil es nichts zu geben scheint was wirklich hilft. Diese ganze DElphiX *mist*e kann man doch vergessen weil sie nur für Delphi 3 ist! ABER ICH HAB DELPHI 6! Und ich will doch einfach nur einpaar Bilder schnell auf ein fenster malen! Kann denn das so schwer sein? Muss ich jetzt wirklich Assembler lernen? :evil: :evil: :evil:


Raphael O. - So 14.11.04 22:00

es würde schon helfen, wenn du uns sagen würdest, was GENAU du machen willst :evil:
DelphiX ist nicht nur für D3 btw...
aber ob sich z.B. OpenGL lohnt hängt von dem ab, was du machen willst...


shalashaska - So 14.11.04 22:26

Ich will eventuell ein kleines 2D Spiel programmieren.

Und hier ist z.B. schon ein Problem wo man schnelle Grafik braucht: Stell dir mal vor ich habe ein ein kleines Männchen das sich über das Fenster bewegen soll. Da das kein 3D spiel sein wird wird das Männchen also nicht aus Matrizen sondern simpel aus einem Bitmap bestehen das mit jedem Intervall des Timers etwas weiter gezeichnet wird was ja dann wie eine Bewegung aussieht. Damit das Männchen aber nicht eine Spur aus dutzenden duplikaten hinter sich lässt muss das Fenster bzw. der Hintergrung auf dem sich das Männchen-Bitmap bewegt permanent neu gezeichnet werden! Dazu braucht man auf dauer sicher etwas schnelleres als Canvas.Draw.

Der Hintergrung wird bei mir aus 40x40px großen Kacheln bestehen.

Wenn das Spiele Fenster jetzt 800x600 groß ist dann müssen also 20x15 Bitmaps der größe 40x40 jedes mal neu auf das Fenster gezeichnet werden wenn man die Map bewegt, oder sich eine Einheit bewegt oder was auch immer. Da nützt es auch sicher nichts nur einen Teil des Screens neu zu zeichnen weil da sicher soviele bewegungen zusammenkommen die es sinvoller machen gleich alles neu zu zeichnen. Wenn du mal mein Experimentalprogramm willst kannst du es gerne haben! Nur es sollte schon schneller gehen denke ich…

Animationen soll es ja auch geben! Nehmen wir z.B. mal ein Bitmap der größe 200x40px. Das wären dann also 5 bilder die dann aus diesem Bitmap mit jedem Intervall des timers auf das Fenster kopiert werden wodurch eine Animation entsteht.

Wie du siehst… Es gibt viele dinge so zusammenkommen. Und das ist ja nochnicht alles! Stell dir mal vor mein Programm muss noch irgendwelche berechnungen machen zwischendurch machen! Stell dir vor das Programm muss zu jedem Intervall prüfen ob sich eine Feindeinheit in der Nähe befindet welche beschossen werden muss. Das kommt alles zusammen. Es wird natürlich nur der Teil der Map gezeichnet der gerade angezeigt wird aber trodzdem.

Vielleicht könnt ihr jetzt besser nachvollziehen worum es geht und warum ich Unbedingt schnelle Grafik brauche…
:)

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


GSE - So 14.11.04 22:48

auf [url]http://www.DelphiGL.com[/url] gibt's auch'n Tutorial über 2D mit OpenGL

mfg
GSE


Spieler1 - Mo 15.11.04 00:12

shalashaska hat folgendes geschrieben:
Ich rege mich doch nur so auf weil es nichts zu geben scheint was wirklich hilft. Diese ganze DElphiX *mist*e kann man doch vergessen weil sie nur für Delphi 3 ist! ABER ICH HAB DELPHI 6! Und ich will doch einfach nur einpaar Bilder schnell auf ein fenster malen! Kann denn das so schwer sein? Muss ich jetzt wirklich Assembler lernen? :evil: :evil: :evil:
Hast du die Tipps mit SDL, DirectX und OpenGL schon wieder vergessen? :roll:
Schau dir doch mal ein paar Tutorials zu dem Thema an ...


MartinPb - Mo 15.11.04 10:37

Ich weiß nicht ob man einen unterstüzen sollte der so in einem Forum anfängt:

shalashaska hat folgendes geschrieben:
SO! ENDLICH! Nachdem ich es endlich geschafft habe mich hier in diesem SCHHH... Forum einzuloggen kann ich endlich mal ne Frage stellen... :evil:


An deiner Stelle würde ich mal eine dicke Entschuldigung von mir lassen.

So wie ich sehe willst du ein Spiel programmieren und kennst nicht mal die Sprache mit der du arbeitest. Aber es geht. Man kann auch ohne DirectX gute Ergebnisse erhalten. Aber zuerst zu der Frage ob andere Sprachen oder Systemnahe Programmierung da Abholfe bring. Nein. Warum? Delphis Canvas ist nur die Kapselung der Windows API. Es geht nicht alles 1:1 rüber, aber fast. Delphis Canvas macht die Verwaltung etwas einfacher, ohne jetzt selbst die Regie zu übernehmen. Wenn du es direkt mit der API machst, dann muß du vorher so um die fünf Anweisungen in der API ausführen. Dann muß du dir alles merken was du gemacht hast, weil du es später wieder schließen mußt. Delphis Canvas macht nichts anderes als diese Arbeit für dich zu erledigen. Der zeichnerische Part geht dann fast 1:1 rüber. Vielleicht klizekleine Verluste die bei der Übersetztung entstehen. Mehr aber auch nicht. Also, ob du mit Delphi oder API programmierst ist fast Wurscht. Nun zu C++. Glaubst du, daß C++ da irgendwelche Sonderkonditionen mit Bill Gates hat? Auch die kochen mit Wasser, bzw. gehen über die API.

Die Moral von der Geschichte ist, daß keine Sprache hier schneller ist, weil alle die Windows API nutzen. Und wie sieht es mit den Berechnungen? Also da kann ich mir nicht vorstellen, daß du komplizierte Berechnungen hast. Aber auch wenn, so spielt das keine große Rolle. Ich hab mal meine privaten Berechnungen durchgeführt und festgestellt, daß es da kaum nennenswerte Unterschiede gibt. Also, ob Delphi oder C++ ist hier erst ein mal egal.

Das Problem ist Canvas. Aber hier die Frage: wieso können einige Programme wie z.B. Makromedia Flash schnelle Grafiken erzeugen ohne DirectX. Antwort: weil die Leute von Micromedia programmieren können. Wenn man sich die Beispiele und Tipps anguckt wie man mit Canvas arbeiten kann, dann weiß man wieso da nichts vernünftiges rauskommt. Da gibt es zuerst die Neigung eine Image Komponente zu nehmen. Das kriegt man schnell ausgetrieben. Als nächstes macht mal es mit Canvas und DubleBuffer. Das bringt schon etwas Linderung, ist aber immer noch zu ruckartig. Warum? Weil hier mit Kanonen auf Spazen geschossen wird. Nur um eine kleine Änderung zu machen wird der ganze Hintergrund neu gezeichnet, und dann wird das Männchen bewegt. Bisher ist es das höhste der Gefühle, daß ich je als Tipp gelesen habe. Mehr kriegt man nicht empfohlen. Kein Wunder, daß da keiner was vernünftiges hinkriegt. Dabei ist alles so einfach. Allerdings muß man hier tatsächlich die API bemühen. Grund ist der, daß die Canvas einige Funktionen nicht bietet. Wahrscheinlich weil es keiner braucht, bist auf fünf Leute die ein Spiel programmieren. Also muß man sich seine eigene Canvas programmieren oder erweitern. Gemeint sind Regionen und Clipping Bereiche. Man braucht doch nicht die ganze Zeichnung verändern, nur weil ich ein Männchen paar Pixel bewegt hat. Allso muß man eine Maske für das Bild berechnen in dem nur für die kleine Änderung ein Loch zu sehen ist. Hier werden die Kleinigkeiten verändert. Bleiben wir großzügig und optimieren nicht weiter. Mache ist ein Draw über so eine Maske, dann wird alles ignoriert was nicht im Clipping Bereich ist. Schon alleine mit dieser Kleinigkeit kann man sein Spiel enorm beschleunigen. Das reicht zwar nicht für einen 3D Sooter, aber für ein 2D Spiel allemal. Allerdings muß man hier ein wenig programmieren können. So ein Engine muß auch erst ein mal programmiert werden.

Wenn du aber einfache Spiele programmieren willst, dann würde ich die Macromedia Flash empfehlen. Einfach, simpel und für einfache Spiele ausreichend. Hier ist die Engine schon fertig. Alternative 2 ist DirectX.


wulfskin - Mo 15.11.04 17:13

MartinPb hat folgendes geschrieben:
Der zeichnerische Part geht dann fast 1:1 rüber.
Dem kann ich zwar zustimmen, aber es ist manchmal schon verwunderlich, wie viel schneller die direkte Benutzung der APIs ist.
Einschauliches Beispiel: BitBlt anstatt Draw bei großen Bildern!


shalashaska - Mo 15.11.04 21:17

Hey MartinPb ich glaub das hier könnte ganz nütlich sein in sachen Maske oder?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function SelectClipPath;
begin
  GetProcedureAddress(_SelectClipPath, gdi32, 'SelectClipPath');
  asm
    mov esp, ebp
    pop ebp
    jmp [_SelectClipPath]
  end;
end;


Hab ich in einer der JEDI units gefunden die ich mir auf den rat einiger guter
Forum Mitglieder gedownloaded habe. :)

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.


recall - Mo 15.11.04 22:53

hallo, bei all dem "off topic" frage ich mich, ob ich noch was zum Thema sagen sollte ;)

Nein, Spaß beseite... :| :| :|

Ich habe auch schon ein 2D-Spiel geschrieben und zwar vollständig mit Canvas.Draw, denn es reicht in der Tat aus. Auf einem 166Mhz schaffst du damit locker 20 Frames/s bei 40x40-Pixel-Quadraten, jedes wird neu gezeichnet und noch 50 Einheiten dazu... Wie das geht ? Ganz einfach, du musst dir ein Bitmap erstellen, welches nicht sichtbar ist, dort alles draufzeichnen (es sozusagen "puffern") und danach auf eine PAINTBOX (!WICHTIG!) zeichnen. Diese muss Align=alClient sein, dein Form setzt du ebenfalls Align=alClient und BorderStyle=bsNone. Außerdem dürfen außer leeren images, die du zum Erkennen von MouseOver-Events benutzen kannst, keine Komponenten auf der Form liegen (keine Sichtbaren).

Nimm keinen Timer, sondern eine "Endlos"-Schleife, in die du jeweils Application.ProcessMessages; schreibst. Eventuell kann das Programm abstürzen, wenn zu schnell gezeichnet wird, daher schreibe in die Schleife sleep(1).

FERTIG ! Für 2D braucht man sonst nix!

Viele Grüsse.

P.S.: Willst du Einheiten zeichnen, dann lade sie in Images mit Transparent=True und zeichne sie einfach mit Canvas.Draw auf den Untergrund... Die Transparenz wird dabei übernommen.

//EDIT: Habe nichts von der Auflösung geschrieben: Also das geht mit 20 Frames/s auf einem 166Mhz P1 mit 2MB-Grafik bei einer Auflösung von 1024x768 !

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


Christian S. - Di 16.11.04 16:57

Hallo!

Ich habe alle "Off Topic"-Postings aus diesem Thread entfernt. Wenn jemand noch Frust ablassen muss, tue er das bitte hier [http://www.delphi-forum.de/topic_Unangebrachte+Titel+wie+quotich+verstehs+netquot_32272.html], das scheint zu dem "Off Topic"-Topic zu passen.

So, und nun brav beim Thema bleiben! ;-)

MfG
Christian

//edit: @basti: Poste das aus deinem Mega-Post, was on-topic war, bitte neu. Ich hatte keine Lust, mir das zusammen zu suchen.


shalashaska - Di 16.11.04 17:48

Oh ja jetzt werde ich ganz ganz brav sein... Aber meine Gedanken kannst
du nicht löschen. Du bist doch nichts weiter als ein kleiner braver Duckmäuser. Und Admin bist du auch dass findest du bestimmt ganz toll..
hilfe!


GSE - Di 16.11.04 18:18

Zitat:
Aber meine Gedanken kannst du nicht löschen
will er bestimmt auch nicht, behalt sie doch in Zukunft einfach für dich, ja?

Zitat:
hilfe!
ich glaube nach deinem Auftritt hier kannst du von niemandem mehr Hilfe erwarten, oder?

für mich liest sich das so wie: "Ich will programmieren. Jetzt sofort! Was, ich muss da was machen? Alles *mist*, bestimmt bist du auch Cheater (Du weißt schon: "Cheater haben kleine ..."

mfg
GSE


UGrohne - Di 16.11.04 18:19

shalashaska hat folgendes geschrieben:
Oh ja jetzt werde ich ganz ganz brav sein... Aber meine Gedanken kannst
du nicht löschen. Du bist doch nichts weiter als ein kleiner braver Duckmäuser. Und Admin bist du auch dass findest du bestimmt ganz toll..
hilfe!

Könntest Du Dich jetzt mal bitte ein bisschen zusammenreißen, denn lange wird sich das Team so etwas wohl dann nicht ansehen, auch wenn wir sehr freizügig sind, was die Ausdrucksweise in den Posts angeht ....
Aber ich denke, das meiste werden die User hier schon erledigen ...


Christian S. - Di 16.11.04 18:41

shalashaska hat folgendes geschrieben:
Oh ja jetzt werde ich ganz ganz brav sein...
Gut! Denn nur dann kommt auch der Weihnachtsmann bei Dir vorbei!

shalashaska hat folgendes geschrieben:
Aber meine Gedanken kannst du nicht löschen.
Mist! Immer durchschauen die Leute meine Pläne! :motz:

Aber jetzt mal im Ernst: Es ist doch auch in Deinem Interesse, dass hier Deine Frage besprochen wird und eine Lösung für Dein Problem gefunden wird. Und das geht nun mal sehr schlecht, wenn nebenher (eigentlich: hauptsächlich ) über etwas ganz anderes geredet wird. Im übrigen sind für solche Auseinandersetzungen auch PNs da, denn unbeteiligte interessieren sich nur für das Sachthema und nicht Eure Zankerei.


tommie-lie - Di 16.11.04 20:46

Christian S. hat folgendes geschrieben:
Aber jetzt mal im Ernst: Es ist doch auch in Deinem Interesse, dass hier Deine Frage besprochen wird und eine Lösung für Dein Problem gefunden wird.
Ähh.... da wäre ich mir gar nicht mal soo sicher...

Christian S. hat folgendes geschrieben:
denn unbeteiligte interessieren sich nur für das Sachthema und nicht Eure Zankerei.
Och, ich fand shalashaskas geistige Inkompetenz in seinen Posts eigentlich sehr viel interessanter als alles andere in diesem Thread :mrgreen:


Wo wir auch schon gleich beim nächsten Thema wären (Ja, eigentlich OT, aber ich führe ja nur fort :mrgreen:):
shalashaska hat folgendes geschrieben:
Oh ja jetzt werde ich ganz ganz brav sein... Aber meine Gedanken kannst
du nicht löschen. Du bist doch nichts weiter als ein kleiner braver Duckmäuser. Und Admin bist du auch dass findest du bestimmt ganz toll..
hilfe!
So mein Lieber. Du kommst hier rein, beschimpfst das Forum und damit die gesamte Community, bist nicht in der Lage, dein Problem zu schildern, steht Vorschlägen nicht offen gegenüber, meinst daß du eh Recht hast und willst nur deine Meinung bestätigt haben, daß das Team hier alles löschen würde und daß Delphi nichts taugt, UND DANN VERLANGST DU AUCH NOCH DIE GERINGSTE FACHLICHE HILFE BEI DEINEN PROGRAMMIERPROBLEMEN?!?! Ich glaub' wohl 's hackt!
Wäre ich an Martins oder Bastis Stelle gewesen, ich hätte mir nicht die Mühe gemacht und einen einseitigen, ausführlichen Post geschrieben, der das Problem so gut erklärt.
Die Spitze ist aber noch, daß du dich über Christian lustig (Peter Lustig :mrgreen:) machst, nachdem er vollkommen zurecht die OffTopic-Beiträge gelöscht hat. Er kommt sich auch nicht besonders geil vor, weil er Moderator ist (Admin ist hier nur einer, und das ist Tino!), und niemand hat hier je versucht deine Gedanken zu löschen, denn sowas wird hier generell nicht gemacht. Mit der Löschfunktion wird hier sehr sparsam umgegangen, du brauchst dich also gar nicht so aufzuführen, als würde hier immer alles gelöscht werden (Zitat habe ich nicht mehr wörtlich im Kopf, aber es ging sinngemäß "Lösch doch, lösch doch, ällerbätsch"), denn das ist nicht der Fall.
Und wenn du in Zukunft willst, daß dir irgendjemand irgendwo bei irgendetwas hilft, nicht nur aufs Programmieren bezogen, dann solltest du lernen, daß du ohne Beleidigungen und vor allem ohne Ignoranz sehr viel weiter kommst.


(Jaja, ich weiß, "don't feed the trolls", aber ich hab' einfach ein gutes Herz...)


Amiga-Fan - Di 16.11.04 20:51

OK bitte nochmal löschen... :D @shalashaska leg dir einen neuen Account zu und fang nochmal von vorne an, nichtmeckernd. (natürlich mit einem anderen Problem, das wäre sonst zu auffällig :D )

Angeblich gibt es auch Programme, die die eigene IP immer gegen eine andere austauschen... :D


GSE - Di 16.11.04 20:53

du meinst verschieben, oder? :wink:

mfg
GSE


recall - Mi 17.11.04 15:52

Saget mal ihr
Leut von hier,
Wie wär es denn
Wie ich euch kenn
Ihr lasst ihn in ruh,
Lasst ihn schreiben seinen Schmu...

Dann wärn wir alle lusiger
UND NICHT NUR OFF TOPIC ! - ich weiss: mir ist kein Reim merh eingefallen :(

Sagt doch einfach was zum Fachthema, oder aber lasst es.
Ich finde eure albernen Beschimpfungen genauso blöd
wie seine übertrieben selbstgefällige (Delphi-abwertende) Haltung.

Da kann man doch einfach schreiben:

Wenn du Delphi nicht magst, geh zu Microsoft C++ :) und gut is :)
Nicht: blablabla...Beleidigung...blabla...Blutrache...bla...Blutwurst*ähh*najaWasAuchImmer...blablabla...
Schwein...blablabla...bla...

Viele Grüsse, schnetzelt mich nicht.


ScorpionKing - Mi 17.11.04 15:57

ich prog grafik-routinen in assembler!


wulfskin - Mi 17.11.04 16:28

ScorpionKing hat folgendes geschrieben:
ich prog grafik-routinen in assembler!
Kannst du uns mal einen Einblick in die Routinen geben, die du in ASM programmiert hast?
Ich denke, dass hilft sicherlich vielen weiter!


ScorpionKing - Mo 22.11.04 20:08

Ich hab mal gelesen, dass man sich WinG erst seperat downloaden muss! das ist doch misst. das ist genauso als wenn man ein spiel verkauft, wo man erst noch 100 mb (mit seinem 56k modem :shock: ) grafik-treiber runterladen muss!


raziel - Mo 22.11.04 20:18

Na, die 835kB wirst wohl noch verkraften :roll:
-> WinG [http://support.microsoft.com/default.aspx?scid=kb;en-us;Q125698].
Außerdem ist WinG längst veraltet und ich würde daher eher zum Nachfolger von WinG, nämlich DirectX raten. Hab ich aber glaub ich schon mal geschrieben...


ScorpionKing - Mo 22.11.04 20:29

ich meinte nur das auch 1 mb abschrecken kann. wenn ich mir nen spiel kaufe, will ich es installieren und dann loslegen! :lol:


myukew - Mi 19.01.05 23:30

wenn man nur ein männchen bewegen will reicht es den platz neu zu zeichnen an dem das männchen war :roll: das lernt man schon wenn man mit qbasic 2d spiele programmiert...

im übrigen lernt man noch was wenn man mit qbasic spiele programmiert: wenn die geschwindigkeit *mist*e is liegts nicht an der sprache sondern am schlecht programmierten spiel