Welche Blitz-Version für schnellen "Text"
Übersicht

![]() |
bmurrayBetreff: Welche Blitz-Version für schnellen "Text" |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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" Gruß, Tennisball |
||
![]() |
bmurray |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auja, die sache mit dem text ![]() 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 ![]() 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^^ |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
DAK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wegen dem schwarzen Text der unsichtbar wird. Schwarz ist standartmässig die Maskenfarbe (wird nicht gezeichnet). Mit MaskImage kann diese geändert werden. | ||
![]() |
bmurray |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dann male doch über das erstellte Bild erst ein 255,0,255 Rect![]() ![]() ![]() ![]() lg, Count-Doku |
||
![]() |
bmurray |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() Seis drum, es spricht im prinzip nichts dagegen, mehrere elemente zusammen zu rendern. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group