inline in BMAX ?

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Pokoyo

Betreff: inline in BMAX ?

BeitragMi, Jan 31, 2018 19:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo liebe Community,
da ich ja in meinem aktuellen Projekt erhebliche Performanceprobleme mit der Grafikausgabe hatte
(siehe diesen Thread https://www.blitzforum.de/foru...hp?t=40797), habe ich die Arbeit daran vorläufig eingestellt und mich intensiv mit dem Thema OpenGL beschäftigt.
Als Nebeneffekt habe ich dann parallel ein wenig C++ lernen müssen, da die meisten OGL Tutorials darauf aufbauen.
Ich habe mir also ein eigenes Grafikmodul gebastelt, welches logischerweise wesentlich Performanter als die in MAX integrierte Geschichte ist.
Da ich ja ne Menge Grafiken verarbeite wollte ich jetzt noch das letzte Quäntchen an Speed rausholen.
In C++ kann man ja den Compiler mit dem Attribut inline anweisen eine Funktion quasi an Ort und Stelle in das Programm zu integrieren.
Weil wie ich gelesen habe sind Funktionsaufrufe in BMAX ziemlich teuer.
Gibt es in BMAX etwas ähnliches ?
Oder muss man vorm Release Alles händisch in den Quelltext kopieren ?

Für eine Antwort bedanke ich mich im vorraus.

Gruß Poko
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|
 

ohaz

BeitragMi, Jan 31, 2018 20:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Allgemeinen sollte man inline nicht verwenden - weder in C++ noch in anderen Sprachen. Gute Compiler machen das automatisch und sind da wesentlich besser drin als Menschen. Weiß nicht wie das bei BlitzMax im Speziellen ist, aber im Normfall brings wirklich nicht so viel

Thunder

BeitragFr, Feb 02, 2018 1:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Der BlitzMax Compiler kann kein Inlining Sad
das ist besonders unangenehm, wenn man Funktionen wie Abs() oder Sqr() sehr oft aufruft.
Sqr ist in Assembly einfach:
Code: [AUSKLAPPEN]
_bbSqr:
fsqrt
ret

Wäre super zum Inlinen.

Zitat:
Weil wie ich gelesen habe sind Funktionsaufrufe in BMAX ziemlich teuer

Sie sind nicht teurer als in anderen Programmiersprachen. Natürlich sind sie etwas teurer, weil BlitzMax nur 32 bit kann (siehe calling conventions von x86 vs amd64). Wenn dir BlitzMax selbst zu langsam ist, musst du was anderes verwenden, aber du kannst es vorher versuchen Wink
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Pokoyo

BeitragFr, Feb 02, 2018 2:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Thunder,
BMax ist mir natürlich nicht generell zu langsam. Mir ist halt nur aufgefallen das speziell Drawimage irgendwie langsam ist.
Ich habe mir ein Tilemapsystem gebaut, wenn ich da beispielsweise 32x32px große Tiles verwende wären das mit Drawimage 2040 Aufrufe, 8160 Vertices bei FullHD. Dies wird von BMax noch unter 2 millisekunden berechnet. Füge ich aber nun einen 2. Layer hinzu, dann hab ich ca. 20 ms was zu einer Bildrate unter 60FPS führt obwohl es ja eigentlich nur in 4ms resultieren dürfte.
An der Grafikgeschwindigkeit kanns ja nicht liegen, weil selbst wenn ich grössere Grafiken verwende bekomme ich so ziemlich dieselben Werte. OpenGL oder auch DX können ja wesentlich mehr.
Die magische Grenze um unter 16ms zu liegen ist hier beim zeichnen von 3500 Grafiken. Irgendwo müssen die Geschwindigkeitseinbußen ja herkommen Confused
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|
 

#Reaper

Newsposter

BeitragFr, Feb 02, 2018 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Geschwindigkeitsunterschied von DrawImage gegenüber "direktem" D3D9 oder OGL liegt daran, dass DrawImage bei jedem einzelnen Aufruf rendert. Bei Eigenbauten wirst du vermutlich, wie früher schon in B3D mit 2D-3D-Varianten, erst alle Bilder+Vertices sammeln und dann einmal rendern, also deutlich weniger Overhead. Ich habe lange nicht mehr damit programmiert, aber daran wird sich sicherlich nichts geändert haben.

OT, zu deinem anderen Thread noch: Bei AMD gab es letztens (aber in den News eigentlich nach deinem Post) das Problem, dass nach einem Update plötzlich viele ältere Spiele deutlich langsamer liefen. Vermutlich hatte es damit auch BMax getroffen, oder es war zumindest in direktem Zusammenhang.
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Pokoyo

BeitragFr, Feb 09, 2018 9:33
Antworten mit Zitat
Benutzer-Profile anzeigen
#Reaper hat Folgendes geschrieben:
Der Geschwindigkeitsunterschied von DrawImage gegenüber "direktem" D3D9 oder OGL liegt daran, dass DrawImage bei jedem einzelnen Aufruf rendert.

Ja, es ist wirklich erstaunlich. Wenn ich bei meinem TileMapSystem die Quads vorberechne, also Texturkoordinaten und Vertexpositionen und danach alle Ebenen in einem Rutsch rendere, komme ich auf erstaunliche 116000 Quads bei unter 16ms. Das ist ziemlich genau die 33fache Geschwindigkeit gegenüber Drawimage. Und ich benutze hier noch keine dynamischen VBOs oder Arraylisten, wodurch sich sicherlich noch mehr erreichen ließe.
Desweiteren habe ich mir eine auf GL zugeschnittene Image Klasse erstellt. Diese rendert wie BMax bei jedem .draw call, hat einen aufgeblähten overhead durch setzen der blendmodes, farben, Texturattribute usw, und trotzdem kann ich hier locker den 3fachen Speed gegenüber Drawimage verzeichnen.

Die Speedbremse muss also doch noch woanders zu finden sein. Confused
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

count-doku

BeitragFr, Feb 09, 2018 9:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Benutzt du denn in einem selbstgeschriebenen Teil auch gl_QUADS ?

Aus GLMax2D:
BlitzMax: [AUSKLAPPEN]
glBegin GL_QUADS
glVertex2f x0*ix+y0*iy+tx,x0*jx+y0*jy+ty
glVertex2f x1*ix+y0*iy+tx,x1*jx+y0*jy+ty
glVertex2f x1*ix+y1*iy+tx,x1*jx+y1*jy+ty
glVertex2f x0*ix+y1*iy+tx,x0*jx+y1*jy+ty
glEnd


Ich meine mal in einem OGL Wiki gelesen zu haben, dass GL_QUADS langsamer ist als TRIS...

Pokoyo

BeitragFr, Feb 09, 2018 10:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, ich benutze GL_Quads. Konnte gegenüber den Dreiecken keinen Geschwindigkeitsvorteil ausmachen. Sind halt nur nicht mehr Zeitgemäß da sie Glaub ich seit Version 3.3 gar nicht mehr vorhanden sind wenn ichs recht in
Erinnerung habe.
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax|

Lobby

BeitragFr, Feb 09, 2018 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hast du sicher gestellt, dass du bei Verwendung von DrawImage stets das gleiche Bild (genauer Textur) zeichnest? Ich musste schon öfter die Erfahrung machen, dass Textur-Switches sehr langsam sind. Falls es damit zusammenhängt könnte ein Texturatlas Abhilfe schaffen.
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux
 

funkheld

BeitragDi, Feb 20, 2018 19:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mit Mingw das Blitzmax neu compiliert und verwende jetzt mit Blitzmax liebendgerne die C++ wenn es um eigene Toolchen geht. Ist mit Blitzmax eine tolle Sache.
ASM-Inline geht auch wunderbar.

Gruss

ASM.S :
Code: [AUSKLAPPEN]

;asm.s

format MS COFF
Public _Add

_Add:
   mov eax,[esp+4]
   mov ebx,[esp+8]
   add eax,ebx
ret


Blitzmax:
Code: [AUSKLAPPEN]

Import "asm.s"

Extern
   Function Add%(x%,y%)
EndExtern

WriteStdout "93 + 14 = "+Add(93,14)
End


c-fact.c :
Code: [AUSKLAPPEN]


int fact (int i) {
  int result = 1;
  while (i > 0) {
    result = result * i;
    i = i-1;
  }
  return(result);
}


Fact Blitzmax:
Code: [AUSKLAPPEN]

Import "c_fact.c"
Extern
   Function fact:Int(zahl1:Int)="fact"
EndExtern

Global x:Int=7
WriteStdout "fact: "+fact(x)+"~n"
End

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group