Type-Erstellung zieht fps runter

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bloxel93

Betreff: Type-Erstellung zieht fps runter

BeitragMo, Jul 09, 2012 17:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,
Ich habe ein Problem mit meinem 2D-Programm und zwar will ich ein sichtbares Objekt erstellen, bzw ein Npc
mit den Eigenschaften X und Y erstma nur. Dazu habe ich ein Type erstellt und es so gemacht das auf Mausklick der Npc gezeichnet wird also das objekt. nebenbei ich arbeite mit Tiles. Das Problem is jetzt dass das Objekt zwar entsteht und auch gezeichnet wird aber die Fps extrem nach unten fällt.
Hier der dafür zuständige Code:
Code: [AUSKLAPPEN]
Type Npc
   Field NpcX
   Field NpcY
End Type

Global Holz.Npc

Repeat

If KeyHit(2) Then   ;Bilder
   editmode = 1
   Tile = 0      
EndIf

If KeyHit(3) Then    ;Kollision-Tile
   editmode = 2
   Tile = 0
EndIf

If KeyHit(4) Then   ;Objekte
   editmode = 3   
   Tile = 0
EndIf

If KeyHit(5) Then   ;Lebewesen
   editmode = 4
   Tile = 0
EndIf

If editmode = 1 Then
   show1 = 1
   show2 = 0
   show3 = 0
   show4 = 0
EndIf
If editmode = 2 Then
   show1 = 0
   show2 = 1
   show3 = 0
   show4 = 0
EndIf
If editmode = 3 Then
   show1 = 0
   show2 = 0
   show3 = 1
   show4 = 0
EndIf
If editmode = 4 Then
   show1 = 0
   show2 = 0
   show3 = 0
   show4 = 1
EndIf

If MouseHit(1) Then
   If show1 = 1 Then
      map(MausX/tilesize, MausY/tilesize, 0) = tile         ;Bilder
   EndIf
   If show2 = 1 Then   
      map(MausX/tilesize, MausY/tilesize, 1) = 1            ;Kollision
   EndIf
   If show3 = 1 Then
      map(MausX/tilesize, MausY/tilesize, 2) = objects      ;Objekte
   EndIf     
   If show4 = 1
      Holz.Npc = New Npc
      a = a+1
      x = MausX/tilesize
      y = MausY/tilesize
      Holz\NpcX = x*tilesize                                         
      Holz\NpcY = y*tilesize
   EndIf
EndIf
 
;---[Zeichnen]---

For x = 0 To mapx
   For y = 0 To mapy
      DrawImage tileset, x*tilesize-scrollx, y*tilesize-scrolly, map(x,y,0)
      
      If show2 = 1 And map(x,y,1) = 1 Then
         DrawImage Kollision, x*tilesize-scrollx, y*tilesize-scrolly
      EndIf
      
      If map(x,y,2) = objects Then
         DrawImage Baumstamm, x*tilesize-scrollx, y*tilesize-scrolly
      EndIf
      
      For Holz.Npc = Each Npc
         DrawImage npc, Holz\NpcX-scrollx, Holz\NpcY-scrolly
      Next
      
   Next
Next


wichtig unter repeat ist eig nur : editmode = 4 , if mousehit(1) if show4 = 1 ...etc und halt in der for schleife die Npc Zeichnung. Wie gesagt es geht um den Type ... und die Fps geht stark runter wenn der Npc erstellt und gezeichnet wird. Danke schonmal für jede hilfreiche Antwort. Falls der gegebene Code nicht reichen sollte kann ich auf Wunsch auch den ganzen senden

BladeRunner

Moderator

BeitragMo, Jul 09, 2012 17:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Sobald Du mode4 erreichst wird in jedem Durchlauf der Mainloop ein neuer NPC erstellt, da Du ja den Mode nicht wieder auf 0 stellst.
Und ohne mehr von deinem Code gesehen zu haben glaube ich Dir sagen zu können dass Du sehr vieles vereinfachen könntest - es ist zB unnötig 4 Mode-Variablen zu benutzen, du kannst eine nutzen und ihr einen passenden Wert aus einer Konstante zuweisen:
const EDIT_NPC = 1
Const EDTI_NONE=0
...
...

if keyhit(bla) then Mode=EDIT_NPC

EDIT: Hab übersehen dass da ein if mousehit drumherum steckt, dann muss der Fehler doch woanders liegen. Den Code vereinfachen kannst Du dennoch.
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

Xeres

Moderator

BeitragMo, Jul 09, 2012 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Wieviele Objekte erstellst du denn? Du zählst ja mit der variable a mit.
Selbst bei wenigen Objekten wird ein Rechner in die Knie gehen, da du For..each in zwei verschachtelt Schleifen ausführst... Multiplizier mal aus, wie oft du damit Drawimage aufrufst.

Die Variablennamen solltest du überarbeiten. Type Npc und Bild npc lässt BB vielleicht zu, aber mach dir nicht selbst solche Probleme - nenn sie unterschiedlich und eindeutig.
Die Variablen show1 bis show4 können auch locker zu einer eingedampft werden. Benutze lieber Konstanten, um den Status zu setzen...
Code: [AUSKLAPPEN]
Const SHOW_TILES=1, SHOW_IMG=2, SHOW_TYPE=3
Local ShowStat=SHOW_TILES
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

ToeB

BeitragMo, Jul 09, 2012 18:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleiner Tipp am Rande: Du hast eine Variable "editmode" in der gespeichert wird was angezeigt bzw. Editiert werden soll. Dann fragst du welchen wert diese Variable hat und setzt dann die ensprechenden "Show" Variablen nur für die Überprüfung was angezeigt werden soll. Um das ganze ein wenig Übersichtlicher zu machen prüf doch einfach direkt die Variable "Editmode" auf den Wert..

Code: [AUSKLAPPEN]
Type Npc
   Field NpcX
   Field NpcY
End Type

Global Holz.Npc

Repeat

If KeyHit(2) Then   ;Bilder
   editmode = 1
   Tile = 0       
EndIf

If KeyHit(3) Then    ;Kollision-Tile
   editmode = 2
   Tile = 0
EndIf

If KeyHit(4) Then   ;Objekte
   editmode = 3   
   Tile = 0
EndIf

If KeyHit(5) Then   ;Lebewesen
   editmode = 4
   Tile = 0
EndIf


If MouseHit(1) Then
   If editmode = 1 Then
      map(MausX/tilesize, MausY/tilesize, 0) = tile         ;Bilder
   EndIf
   If editmode = 2 Then   
      map(MausX/tilesize, MausY/tilesize, 1) = 1            ;Kollision
   EndIf
   If editmode = 3 Then
      map(MausX/tilesize, MausY/tilesize, 2) = objects      ;Objekte
   EndIf     
   If editmode = 4 then 
      Holz.Npc = New Npc
      a = a+1
      x = MausX/tilesize
      y = MausY/tilesize
      Holz\NpcX = x*tilesize                                         
      Holz\NpcY = y*tilesize
   EndIf
EndIf
 
;---[Zeichnen]---

For x = 0 To mapx
   For y = 0 To mapy
      DrawImage tileset, x*tilesize-scrollx, y*tilesize-scrolly, map(x,y,0)
       
      If show2 = 1 And map(x,y,1) = 1 Then
         DrawImage Kollision, x*tilesize-scrollx, y*tilesize-scrolly
      EndIf
       
      If map(x,y,2) = objects Then
         DrawImage Baumstamm, x*tilesize-scrollx, y*tilesize-scrolly
      EndIf
       
      For Holz.Npc = Each Npc
         DrawImage npc, Holz\NpcX-scrollx, Holz\NpcY-scrolly
      Next
       
   Next
Next
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!
 

Bloxel93

BeitragMo, Jul 09, 2012 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
danke für die schnellen Antworten Smile
Also ich hab jetzt die for.each schleife aus der normalen forschleife rausgeholt und einfach so eingefügt und es geht und hab keinen fps verlust mehr danke dafür Very Happy war auch eig logisch dass das nicht dadrin sein muss ... hatte iwie gedacht alles was gezeichnet wird muss dadrin sein ^^
Zu den Vereinfachungen : Also ich weiß ich kann den code vereinfachen... eig bräuchte ich nicht mal zurzeit die show variablen und könnte alles mit editmode= 1,2,3 oder 4 beschreiben was ich auch erstma machen werde ... hatte gedacht das könnte ich später nochma gebrauchen aber dann kann ich das ja immernoch ändern. Den variablenamen vom npc bild werd auch mal ändern.
Danke für die Ratschläge

Edit : ToeB du hast natürlich Recht genau das meinte ich ^^ sieht natürlich jetzt komisch aus weil mein post später kam als deiner das liegt daran dass ich solange an meiner antwort gefeilt hab und immer zwischendruch am programm rumprobiert hab Smile

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group