inline in BMAX ?
Übersicht

![]() |
PokoyoBetreff: inline in BMAX ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der BlitzMax Compiler kann kein Inlining ![]() 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 ![]() |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
![]() |
Pokoyo |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 ![]() |
||
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax| |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
#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. ![]() |
||
|Win10 64bit|FX 8350@4,5 GHz|Asrock 990FX Killer Fatality|16GB HyperX|R9 290X|Blitz3D|BlitzMax| |
![]() |
count-doku |
![]() Antworten mit Zitat ![]() |
---|---|---|
Benutzt du denn in einem selbstgeschriebenen Teil auch gl_QUADS ?
Aus GLMax2D: BlitzMax: [AUSKLAPPEN] glBegin GL_QUADS Ich meine mal in einem OGL Wiki gelesen zu haben, dass GL_QUADS langsamer ist als TRIS... |
||
![]() |
Pokoyo |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group