Welche Blitz-Version für schnellen "Text"

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

bmurray

Betreff: Welche Blitz-Version für schnellen "Text"

BeitragSo, März 16, 2014 15:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Gemeinde,

ich programmiere gerade ein sehr textlastiges Spiel (einen Fußballmanager, es gibt eigentlich keinen Screen ohne Text). Der Befehl "TEXT" ist bekanntermaßen ja sehr langsam, weswegen ich mich gerade nach einer Alternative umsehe. Derzeit programmiere ich in B+. Ich habe schon sehr viel Zeit und Energie reingesetzt, weswegen ich das Spiel auch unbedingt zu Ende programmieren möchte, nun suche ich nach dem besten Weg, mein "Text"-Problem zu lösen. Auf manchen Rechnern ruckelt das Spiel dermaßen, dass es unspielbar ist. Auf manchen ist es trotz hoher CPU-Auslastung gerade noch spielbar. Dazu habe ich einige Fragen:

1) Gibt es in B+ eine Möglichkeit, dass der Text-Befehl nicht mehr so viele Ressourcen verbraucht und ein flüssiges Spielen ermöglicht?

2) Sind "Speedtext" oder "Fasttext" für B+ möglich?

3) Welche Version müsste ich mir kaufen, damit Speed- oder Fasttext oder eine andere Möglichkeit funktioniert, ohne dass ich den Code umständlich auf die neue Version "umstellen" müsste?

Für Anregungen, Tipps und Vorschläge bin ich sehr dankbar. Leider sind die bisherigen Hinweie zum "Text"-Problem für mich als Anfänger noch zu unverständlich, aber vielleicht gibt es ja eine simple Lösung?!

Besten Dank,

bmurray

Tennisball

BeitragSo, März 16, 2014 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

Du könntest jeden Text in ein Image vorrendern, so muss für jeden Text nur noch ein Image gerendert werden, statt für jedes einzelne Zeichen. Funktioniert ungefähr so:

BlitzBasic: [AUSKLAPPEN]
Local t$ = "Dein Text"
Local image% = CreateImage( TextWidth(t), TextHeight(t) )
SetBuffer( ImageBuffer( image ) )
Text( 0, 0, t )
SetBuffer( BackBuffer() )
DrawImage( image, 0, 0 )
Flip()


Gruß,
Tennisball

bmurray

BeitragMo, März 17, 2014 9:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Tennisball,

cool, vielen Dank für deine Antwort, das werde ich nachher gleich mal probieren!! Ist das auch eine gute Lösung, wenn relativ viel Text auf einmal da steht? Irgendwo habe ich mal gelesen, dass das Vorrendern nur bei weniger Text sinnvoll ist.

LG

DAK

BeitragMo, März 17, 2014 9:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, Vorrendern ist gerade bei vielem Text sinnvoll. Es ist eventuell bei sehr dynamischem Text nicht sinnvoll, aber wenn der Text seltener als 1x pro Sekunde geändert wird, dann lohnt es sich auf jeden Fall.

Falls sich nur Teile ändern kannst du auch die statischen Teile vorrendern und die dynamischen Teile per normalem Text-Befehl einfügen.
Gewinner der 6. und der 68. BlitzCodeCompo
 

PhillipK

BeitragMo, März 17, 2014 10:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Auja, die sache mit dem text Smile

Text ist deswegen solangsam, weil jedes einzelne zeichen an die grafikkarte zum rendern geschickt wird. Stells dir so vor: Jede minute kommt dein chef mit ner neuen Aufgabe rein; du kommst nicht zum arbeiten.

Vorrendern ist in sofern sinvoll, das diese einzelnen zeichen zu einer größeren "Aufgabe" zusammen gefasst werden.
Hierbei gilt zu beachten, das jede Grafik speicher belegt (wo weiß ich nicht: Habe nie mit BlitzPlus gearbeitet.. aber es ist wohl der Grafikram Very Happy), das heißt, du musst grade bei Textlastigen anwendungen ab und an ausmisten.

Da du von einem Fußballmanager schreibst, denke ich nicht, das da große "Dynamische" texte drin vorkommen (beispiel: Ein coutdown, mitten in einem langen text), was wiederrum bedeutet, das du ziemlich viel vorrendern kannst.

Was ich mich grade allerdings frage:
Zitat:
(einen Fußballmanager, es gibt eigentlich keinen Screen ohne Text)

Von wieviel text reden wir hier?
Wenns unter 100 Zeichen sind, dürfte es nicht das problem fürs ruckeln sein, ausser BlitzPlus ist hoffnungslos unteroptimiert.
Wie auch immer - teste Tennisball's vorschlag, aber bitte so, das du wärend eines ladescreens oder ähnlichem die texte einmalig vorrenderst^^

BladeRunner

Moderator

BeitragMo, März 17, 2014 10:11
Antworten mit Zitat
Benutzer-Profile anzeigen
WAs die Vorredner schon anmerkten- rendere allen statischen Text beim aufrufen eines Screens einmalig vor und lass ihn als Grafik anzeigen. Ein neues rendern tut nur dann not wenn sich was an den Texten ändert.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

bmurray

BeitragMo, März 17, 2014 10:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Wow, danke für eure Antworten, ich werde das mit dem Vorrendern heute abend auf jeden Fall probieren. Der Text ist in 99% der Fälle statisch (also Tabellenstände, Spielereigenschaft, Spielerlisten, Meister der vergangenen Jahre, etc.), hier würde das also echt Sinn ergeben.

PhillipK hat Folgendes geschrieben:
Von wieviel text reden wir hier?
Wenns unter 100 Zeichen sind, dürfte es nicht das problem fürs ruckeln sein, ausser BlitzPlus ist hoffnungslos unteroptimiert.


Also bei einer Tabelle mit 18 Mannschaften (für jedes Team: Anzahl Spiele, Siege, Unentschieden, Niederlagen, Tore, Gegentore, Punkte) plus weiter unten der aktuelle Spieltag (nochmal die 18 Teams plus Ergebnisse) komme ich sicher auf 300-600 Zeichen. Der ganze Bildschirm besteht eigentlich nur aus Text Wink

PhillipK hat Folgendes geschrieben:
Wie auch immer - teste Tennisball's vorschlag, aber bitte so, das du wärend eines ladescreens oder ähnlichem die texte einmalig vorrenderst^^


Ja, das probiere ich auf jeden Fall. Habe schon eine Idee im Kopf, wann genau gerendert werden soll und wann der speicher wieder gelöscht wird!!

Danke euch!!

bmurray

BeitragMo, März 24, 2014 9:53
Antworten mit Zitat
Benutzer-Profile anzeigen
So, also das mit dem Vorrendern funktioniert einwandfrei, kein Ruckeln, keine hohe CPU-Belastung mehr, aber...

Ich habe keine Schriftart gefunden, die "sauber" aussieht, im Gegenteil, die Buchstaben sind extrem verzerrt oder total konturlos. Was ich auch festgestellt habe, dass ich die Farbe der Schrift nicht richtig hinbekomme: (Color 0,0,0) macht die Schrift unsichtbar, am ehestens eine schwarze Schrift erhalte ich mit (Color 4,4,4). Wobei ich glaube, dass die "Konturlosigkeit" auch mit der eingestellten Farbe oder der Schriftgröße zusammenhängt.

Welche Schriftart eignet sich besonders gut dafür? Genau genommen führt dieses Problem noch weiter, da ich bei einer Veröffentlichung ja nicht diese Schriftart, wenn sie geschützt ist, verwenden darf. Hat da jemand Erfahrungen sammeln können, wie dieses Problem genau gelöst wurde? Gibt es eine gute, empfehlenswerte, freie Font, die für solche Fälle genutzt werden darf?

DAK

BeitragMo, März 24, 2014 9:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du eine von den Fonts verwendest, die bei Windows dabei sind, dann ist das komplett legal, da du die Font nicht mitlieferst, sondern nur verwendest.
Gewinner der 6. und der 68. BlitzCodeCompo

bmurray

BeitragMo, März 24, 2014 10:58
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, das ist schon mal eine gute Nachricht. Kannst du eine Schriftart empfehlen, die bei B+ besonders gut darstellbar ist, oder kann man das so genau nicht sagen, weil es von weiteren Faktoren abhängt?

Edith sagt:

OK, ich glaube, es liegt an der Auflösung (1024x768), Kleinere Schriftgrößen sind da wohl nicht gut darstellbar Sad

DAK

BeitragMo, März 24, 2014 13:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Joa, alles unter 12pt braucht man da gar nicht probieren. Ansonsten die üblichen Verdächtigen: Arial und Times New Roman sind schon mal ein guter Anfang. Ansonsten einfach ausprobieren. Mach einen Texteditor deiner Wahl auf und schau dir die vorhandenen Schriftarten an. Unter Windows können Schriftarten systemweit installiert werden, was heißt, dass (beinahe) jede Schriftart, die du in einem Programm hast, auch von allen anderen verwendet werden können. Schau hald, dass es wenn möglich eine ist, die bei der Windows-Standardinstallation dabei ist, damit sie auch auf anderen Computern vorhanden ist.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Wipffinder

BeitragMi, März 26, 2014 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Wegen dem schwarzen Text der unsichtbar wird. Schwarz ist standartmässig die Maskenfarbe (wird nicht gezeichnet). Mit MaskImage kann diese geändert werden.

bmurray

BeitragSo, März 30, 2014 20:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Wipffinder hat Folgendes geschrieben:
Wegen dem schwarzen Text der unsichtbar wird. Schwarz ist standartmässig die Maskenfarbe (wird nicht gezeichnet). Mit MaskImage kann diese geändert werden.


Richtig, nur wenn ich eine andere Farbe als Maskenfarbe nehme (z.b. 255,0,255), dann wird das Bild komplett schwarz, weil ich mit Createimage anscheinend ein schwarzes Bild erstelle?!

count-doku

BeitragSo, März 30, 2014 20:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Dann male doch über das erstellte Bild erst ein 255,0,255 Rect rüber oder ändere die ClsColor und Cls es dann Very Happy

lg,
Count-Doku

bmurray

BeitragMo, März 31, 2014 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich stehe auf dem Schlauch... Wo kann ich Rect / ClsColor / CLS / MaskImage 255,0,255 eintragen, damit beide Texte angezeigt werden?

Code: [AUSKLAPPEN]
Graphics 1024,768,16,1
Global timercpu = CreateTimer(60)
hintergrund = LoadImage("bilder\hintergrund.png")

img = CreateImage (500,200)
SetBuffer (ImageBuffer(img))
       Color 0,0,0
       Text 100,100,"Dieser Text wurde mit der Farbe 0,0,0 geschrieben"
       Color 4,4,4
       Text 100,120,"Dieser Text wurde mit der Farbe 4,4,4 geschrieben"
SetBuffer (BackBuffer())

Repeat
       DrawBlock hintergrund,0,0
       DrawImage img,10,10

       WaitTimer timercpu
       Flip 0
       If MouseHit(1) Then End
Forever
 

PhillipK

BeitragMo, März 31, 2014 13:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
img = CreateImage (500,200)

Vor dieser Zeile musst du die Maskcolor eintragen, damit das bild damit erstellt wird.
Also in deinem beispiel nen hübsches pink.
NACHTRAG: Hm, ich glaube ich habs falsch in erinnerung. Siehe hier: MaskImage
Wenn ich das richtig verstehe, musst du das direkt nach CreateImage() ausführen - wie folgt:
Code: [AUSKLAPPEN]
MaskImage(img, 255,0,255)


Code: [AUSKLAPPEN]
SetBuffer (ImageBuffer(img))
       Color 0,0,0

Nach SetBuffer nutzt du ClsColor / CLS, damit du den "buffer" (das bild) in einem schönen pink clearst.

Sprich ClsColor 255,0,255.
Sollte dies wiedererwarten nicht funktionieren, kannst du einfach ein pinkes rechteck über den kompletten buffer zeichnen. in deinem beispiel ist dieser 500 x 200 pixel groß.
(Color 255,0,255 - Rect 0,0,500,200 ..)

Auf diese neue hintergrundfarbe renderst du dann den text.
Da das image maskiert ist, wird die maskcolor (zb 255,0,255) als "transparent" geweretet - ergo pinke pixel werden beim rendern geskippt. Am ende hast du deinen text in X beliebigen farben - solange er nicht die farbe der Maskcolor hat Very Happy

Ps:
Wenn ich mich richtig erinnere, musste man für jedes bild die MaskColor VOR dem Laden / erstellen setzen. Die bilder übernehmen immer die "aktuell" gesetzte maskcolor.

Pss: Es müsste auch irgendwo noch einen flag beim image geben, damit es auch maskiert gezeichnet wird.
*link entfernt, da ich dumm war und falsch gelesen hab*

bmurray

BeitragMo, März 31, 2014 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
also den Befehl "MaskColor" kenne ich gar nicht, aber "MaskImage" VOR dem erstellten Bild funktioniert nicht, da ich ja eine Zeile später das Bild überhaupt erst erstelle...

ABER:

PhlippK hat Folgendes geschrieben:

Code: [AUSKLAPPEN]

SetBuffer (ImageBuffer(img))
       Color 0,0,0

Nach SetBuffer nutzt du ClsColor / CLS, damit du den "buffer" (das bild) in einem schönen pink clearst.

Sprich ClsColor 255,0,255.


Das hat perfekt geholfen!!! Vielen Dank, jetzt klappt es wie gewünscht!!
 

PhillipK

BeitragMo, März 31, 2014 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das war mein fehler.
Ich glaube ich war in gedanken bei blitzmax. Hab mich grade durch die hilfe gewühlt und noch meinen beitrag oben ein paar mal editiert :/

Scheinbar ist es wirklich in der reihenfolge - Bild erstellen - Bild Maskieren - Bild füllen.


Das es "geholfen" hat ist logisch.
Der komplette buffer hat die maskierungsfarbe - dann zeichnest du den text drauf (oder anders ausgedrückt: Dort, wo die pixel des textes sind, werden die pixel im buffer auf eine andere farbe geändert und später nicht maskiert.)

bmurray

BeitragMo, März 31, 2014 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep, klappt. Eine Frage habe ich noch:

Ist es sinnvoll ein Bild erstellen zu lassen, in dem sowohl TEXT als auch ein anderes Bild selber vorkommt? Sozusagen ein (vorher geladenes) Bild im (vorgerenderten) Bild? Ich habe ein bißchen rumprobiert, es geht und würde auch einiges erleichtern. Spricht etwas dagegen, es so zu machen?
 

PhillipK

BeitragMo, März 31, 2014 14:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Was sollte dagegen sprechen?

Das einzige was dadurch verbraucht wird, ist ein wenig mehr speicher. Eventuell ist es sinnvoll dein "geladenes" bidl aus dem speicher zu schmeißen, wenn du es nichtmehr brauchst. Aber auch nur, wenn du wirklich nur einmal rendern musst.
Brauchst du das bild öfters (zum vorrendern zb), dann lass es geladen.

Eine anmerkung: Eventuell ist es sinnvoll, den text und das bild nicht zusammen zu packen, wenn beides zusammen zuviel platz nimmt.
Beispiel: Du hast oben text, und vertikal in der mitte einen grafischen balken. Der text ist 500 pixel breit, 20 pixel groß. Dh die textur dafür würde 512 x 32 pixel groß.
Der balken ist 20 breit und 500 hoch. Die textur würde 32x512 pixel werden.
Beides zusammen (mit dem passenden abstand) nimmt aber etwa 513 x 513 pixel ein - die textur würde 1024x1024 groß werden und unmengen "leere fläche" enthalten.
Nun, das ist ein Worst case, aber in einem solchen fall kann man sich überlegen es doch lieber getrennt zu halten - merken wirst du davon aber wahrscheinlich eh nichts, weil heutzutage die pc's einfach zu gut sind.

Ergo es ist mehr oder weniger eine frage der persönlichen einschätzen.
Im idealfall hast du irgendwoe eine krücke zum streßtesten rumstehen Smile

Seis drum, es spricht im prinzip nichts dagegen, mehrere elemente zusammen zu rendern.

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group