Spritesystem zu lahm
Übersicht

![]() |
EPSBetreff: Spritesystem zu lahm |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi zusammen, ich stelle die Frage mal hier weil es sicher eher eine Anfängerfrage ist.
Also, ich habe ein Spritesystem (2 Tris = 1 Quad = mein Sprite). Dieses nutze ich um Tiles einer 2D Map auf dem Bildschirm anzuzeigen. Jedes Sprite ist somit ein Tile. Nun sind von der Map ja immer nur einige Tiles auf dem Bildschirm zu sehen (genau gesagt sind ca. 120 Sprites immer im Sichtbereich). Wenn die Map aber, sagen wir, 50x100 groß wird, dann bricht meine Framerate ein und das obwohl immer die gleiche Anzahl an Tiles auf dem Bildschirm zu sehen sind. Ok, bei 50x150 Sprites sind das immerhin 7500, sollte doch aber kein Thema sein da die nicht alle gleichzeitig sichtbar sind - oder? Daher die Frage(n): Wird bei RenderWorld in 3D nur berechnet was schlußendlich auf dem Bildschirm zu sehen ist oder werden alle Objekte berücksichtigt? Wenn letzteres der Fall ist, wie bitte macht man dann eine vernünftige Map, also auch wenn es eine richtige 3D Map ist? Ausserdem, was kann ich dagegen tun? Muß ich alle nichtsichtbaren Teile der Map verstecken (HideEntity), kann ja eigentlich nicht sein oder macht man das in einer 3D Map ebenfalls so? Ich danke euch schon einmal... |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
- Zuletzt bearbeitet von EPS am Do, Jun 01, 2006 10:54, insgesamt einmal bearbeitet
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hay ESP Habe gerade deine Frage gefunden und hoffe das ich dir vieleicht
weiter helfen kann. Dazu brauche ich allerdigs noch einige Daten zu dein PRG. Soll dieses PRG für ein 3D oder 2D Spiel (von Oben) sein? Kennst du das mit die FPS (Render tween#)? |
||
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also zunächst heißt es "EPS" nicht ESP ![]() Also ein RPG wird es nicht, es wird ein Autorennen. Das ganze ist mittels eines Spritesystems in 3D programmiert, ist in der Ansicht aber eine ISO Map. Jaja, ich weis, komplizierter gehts kaum, aber das hat schon seinen Sinn so, also nicht drauf rum reiten. Das ganze hat mit dem Problem an sich aber nix zu tun. Es geht lediglich darum warum BB so abkackt wenn ich einen Haufen Tris bzw. Meshes habe, diese aber gar nicht in der Bildschirmansicht sind. Wenn ich 200.000 Meshes hätte die alle gleichzeitig sichtbar wären würde ich es einsehen, aber wenn von diesen nur 100 auf dem Screen sind, sollte BB da nicht etwas schneller rendern? |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Vieleicht Hast du so viele Tris (also Daten) das der Speicher nicht mehr
reicht und Windows die Daten auf der Festplatte Auslagert Das Problem hatte ich schon mal weil ich auch zu viele texturen im Speicher hatte. Vieleicht kenst du den Rambooster damit kann man den Speicher kontrolieren lade ich schnell im Archiv hoch. |
||
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
naja, sagen wirs mal so:
Ich habe eine Map (50 x 150), aber alle Tiles benutzen nur eine Textur. Die Tiles bzw. Sprites sind per CopyEntity erstellt worden und wie ich letztens hier im Forum erfragt habe, werden bei CopyEntity die Texturen nicht mehrfach im Speicher abgelegt. Ergo sind es EINE TEXTUR und 7500 Sprites (zu je 2 Tris). Also eigentlich nicht so viel. Aber gegenüber einer Leerlaufframerate von ca. 500 FPS (bei Flip 0) kracht mir die Rate auf 11 FPS !!!! runter. Ach ja, und von den 7500 sind ca. 120 immer zu sehen. Die anderen sind dementsprechend ausserhalb des sichtbaren Bereichs. |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
Matthias |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Da Hast du recht mit den texturen ich dachte es sind alles verschiedene
also wenn ich richtig gerechnet habe 7500*2(Tri)*3(XYZ)*4Bytes=180KB ist doch echt wenig. Sorry kann ich dir leider nicht helfen. Tipp ziehe drozdem den RamBooster vieleicht hilft er dir später mal. |
||
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Jep, mach ich. Trotzdem danke | ||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm,
gehören die ganzen Tiles zu einem Mesh? Als ich sowas testweise machte, hab ich alle Vertexpunkte einem Mesh angefügt und dann feststellen können, dass das gesamte Mesh (also die ganze Map) gerendert wurde sobald auch nur ne kleine Ecke zu sehen war. Vielleicht hilft es wenn du die Anzahl der gerenderten Dreiecke anzeigen lässt: ql:TrisRendered. MfG D2006 |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, sind verschiedene Meshes und Trisrendered zeigt zwischen 300irgendwas und 400irgendwas an, bei ner beweglichen ISO Map schwankt das immer etwas. | ||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du für jedes Tile ein eigenes Sprite benützt, ist das der totale Surface-Overkill! Das zwingt jeden Rechner in die Knie.
Stelle alle Quads, die gerade auf dem Bildschirm sichtbar sind, in einem einzigen Mesh (Single Surface) dar, da sind 200 Objekte überhaupt kein Thema, das geht locker. Alle anderen Tiles (die nicht sichtbar sind) brauchst du überhaupt nicht zu zeichnen, die existieren dann eben nur im Speicher (als Type etc.). Das Tile-Mesh kannst du locker bei jedem Frame (oder eben nur, wenn sich etwas ändert) löschen und Neuzeichnen, das ist Performancemässig kein Problem, wenn man es richtig macht. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke x-pressive, ich glaube da liegt der Hase im Pfeffer...mal wieder ein phänomenaler Denkfehler meinerseits....ich Dödel ![]() |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du benutzt doch schon CopyEntity und das sollte kein Problem sein !?
Könnte mir vorstellen das falls du mit Sprite ein Mesh mit 4 Eckpunkten meinst diese einen gemeinsamen mittelpunkt haben im 3D Raum , also nur die Eckpunkte im Raum verteilt sind . Das bedeutet dann das BB alle darstellen möchte weil es ja den Mittelpunkt sieht . Alternativ könntest du beim Scrollen z.B. links welche anfügen und rechts löschen das du nicht alle 7500 im Speicher hast . |
||
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ach wenn ich mich doch nur auskennen würde ![]() Also ein Sprite ist bei mir das hier (so wird er erstellt): Code: [AUSKLAPPEN] Local tempmesh = CreateMesh()
Local tempsurface = CreateSurface(tempmesh) AddVertex tempsurface,-1,1,0 ,0,0 : AddVertex tempsurface,1,1,0 , 1,0 AddVertex tempsurface,-1,-1,0 ,0,1 : AddVertex tempsurface,1,-1,0 , 1,1 AddTriangle tempsurface,0,1,3 AddTriangle tempsurface,0,3,2 Local temptexture = CreateTexture(width,height,mode) Local size = TextureWidth(temptexture) EntityTexture tempmesh, temptexture EntityFX tempmesh,1 EntityParent tempmesh, spritecontrol also wie du schon sagst. Davon wird halt eine Kopie per CopyEntity gemacht. Wie in dem Codeschnipsel zu sehen ist, sind aber alle Sprites an das Pivot "spritecontrol" als Parent angebunden. Vielleicht ist dann das der Grund. Momentan hab ich es so gelöst das ich alle nicht sichtbaren Meshes einfach verstecke. Das geht zwar, scheint mir aber nicht die optimale Lösung zu sein. Ich muß mal etwas experimentieren. x-pressive's Beschreibung klingt zumindest einleuchtend. Im Zweifelsfall muß mein Spritesystem dran glauben und ich mach es halt anders ![]() |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
![]() |
Markus2 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
und wo steht das spritecontrol im Raum ? Haste mal versucht bei deinen "Sprite Meshes" das Parent zu löschen in dem du es auf 0 setzt ? Ich denke mal du hast deine "Sprite Meshes" mit PositionEntity an die richtige Stelle geschoben oder ? |
||
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
http://unrealsoftware.de/stuff..._bb_3dto2d
Dort gibts ein schönes tut zum positionieren von sprites, im zusammenhang mit SingleSurface technik, läuft das alles sehr gut. Also, anstatt einene sprite zu laden : Erstelle eine Funktion, die ein MEsh+Surface+Brush erstellt(zum beispiel, für Sand) Dann kannst du mit der Positionier Formal dort, 4Vertexe erstellen, die an dieses mesh angehängtr werden. (oder auch mehrere muste dann ne function schreib) Und schon is fertich und wenn man mit einzelnen sprites den screen füllt(640*480) ists bei mir auf 6-7FPS, wenn man das anwendet 60-85FPS, oder sogar mehr, kommt drauf an, was man noch so nebenbei laufen lässt(ich:seeehr viel^^) |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
EPS |
![]() Antworten mit Zitat ![]() |
---|---|---|
Na da sag ich ganz lieb DANKE ![]() |
||
mGUI - Graphical User Interface für Blitz3D...Informationen gibt es hier
Man kann sich öfter als zweimal im Leben halb tot lachen. |
![]() |
5k41 |
![]() Antworten mit Zitat ![]() |
---|---|---|
HI EPS!
Ich bin grad zum Thema SingleSurface an einer Engine dran... ist noch in den Kinderschuhen, aber vielleicht hilft dir der Anfang schonmal! Code: [AUSKLAPPEN] ;Drehen mit Pitch und Yaw ;Bei Position an drehwinkel denken Type Tmesh Field mesh Field surface Field x,y,z End Type Type Tsprite Field mesh Field v[3] Field pitch#,yaw#,roll# Field width#,height# Field centerx#,centery#,centerz# End Type Function sCreateMesh(x=0,y=0,z=0) mesh.Tmesh=New Tmesh mesh\mesh=CreateMesh() mesh\surface=CreateSurface(mesh\mesh) mesh\x=x mesh\y=y mesh\z=z Return Handle(mesh.Tmesh) End Function Function screateSprite(hndl,x=4,y=4,z=0) mesh.Tmesh=Object.Tmesh(hndl) sprite.Tsprite=New Tsprite sprite\mesh=hndl sprite\width=x sprite\height=y sprite\v[0]=AddVertex(mesh\surface,-x/2,y/2,z,0,0) sprite\v[1]=AddVertex(mesh\surface,x/2,y/2,z,1,0) sprite\v[2]=AddVertex(mesh\surface,x/2,-y/2,z,1,1) sprite\v[3]=AddVertex(mesh\surface,-x/2,-y/2,z,0,1) AddTriangle(mesh\surface,sprite\v[0],sprite\v[1],sprite\v[2]) AddTriangle(mesh\surface,sprite\v[0],sprite\v[2],sprite\v[3]) UpdateNormals mesh\mesh Return Handle(sprite.Tsprite) End Function Function sTranslateSprite(hndl,x,y,z) sprite.Tsprite=Object.Tsprite(hndl) mesh.Tmesh=Object.Tmesh(sprite\mesh) For i=0 To 3 VertexCoords mesh\surface,sprite\v[i],VertexX#(mesh\surface,sprite\v[i])+x,VertexY#(mesh\surface,sprite\v[i])+y,VertexZ#(mesh\surface,sprite\v[i])+z Next sprite\centerx=sprite\centerx+x sprite\centery=sprite\centery+y sprite\centerz=sprite\centerz+z End Function Function sPositionSprite(hndl,x,y,z) sprite.Tsprite=Object.Tsprite(hndl) mesh.Tmesh=Object.Tmesh(sprite\mesh) sprite\centerx=x sprite\centery=y sprite\centerz=z VertexCoords mesh\surface,sprite\v[0],sprite\centerx-sprite\width/2,sprite\centery+sprite\height/2,sprite\centerz VertexCoords mesh\surface,sprite\v[1],sprite\centerx+sprite\width/2,sprite\centery+sprite\height/2,sprite\centerz VertexCoords mesh\surface,sprite\v[2],sprite\centerx+sprite\width/2,sprite\centery-sprite\height/2,sprite\centerz VertexCoords mesh\surface,sprite\v[3],sprite\centerx-sprite\width/2,sprite\centery-sprite\height/2,sprite\centerz End Function Function sTurnSprite(hndl,pitch#,yaw#,roll#) sprite.Tsprite=Object.Tsprite(hndl) mesh.Tmesh=Object.Tmesh(sprite\mesh) sprite\pitch=(sprite\pitch-pitch) Mod 360 sprite\yaw =(sprite\yaw -yaw) Mod 360 sprite\roll =(sprite\roll -roll) Mod 360 winkel=315 For i=0 To 3 If yaw <>0 Then VertexCoords mesh\surface,sprite\v[i],sprite\centerx+(Sin((sprite\yaw+winkel))*(sprite\width/2*Sqr(2))),VertexY#(mesh\surface,sprite\v[i]),sprite\centerz+(Cos((sprite\yaw+winkel)));*(sprite\height/2*Sqr(2))) If roll <>0 Then VertexCoords mesh\surface,sprite\v[i],sprite\centerx+(Sin((sprite\roll+winkel))*(sprite\width/2*Sqr(2))),sprite\centery+(Cos((sprite\roll+winkel))*(sprite\height/2*Sqr(2))),VertexZ#(mesh\surface,sprite\v[i]) winkel=winkel+90 Next End Function die sachen oben sind die sachen, die noch nicht Funktionieren... wie gesagt, ist noch nicht weit und auch sehr unflexibel, aber man kann glaub ich daran erkennen wie man sowas machen könnte ![]() MfG |
||
Projekte:
For a better World - Gesellschaftsspiel ( 100%) User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group