CreateSprite... Weitsicht in Spielen

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

onkelz89

Betreff: CreateSprite... Weitsicht in Spielen

BeitragSa, Feb 02, 2008 12:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe eine Frage zum CreateSprite Befehl...

wollt folgendes machen:

In meinem aktuellen großen Projekt habe ich eine ziemlich große Welt. Es ist mir klar das man die nicht in Realtime rendern kann.
Aber ich dachte mir wie machen es denn die großen Games...

Dann kam ich auf die Idee das ganze mit Sprites zu regeln. Halt wenn man eine bestimmte Entfernung erreicht wird einmal alles (nicht wirklich alles) gerendet und davon ein "Foto" gemacht - das möchte ich nun als Sprite (wegen der Transparenz (Wettereffekte usw)) an die passende Position setzten.

Weil alle X "Meter" sowas gemacht wird und die schon vorhandenen Sprites mitgerendert werden - dürfte man nachher ziemlich weit schauen können...

Akutalisiert würde das Ganze wenn man wieder in einem Bereich ist.

Sorry wegen dem längeren Text - ist nur falls Jemand ne bessere Idee für die Weitsicht haben sollte, bitte ich ihn das zu posten.

###

So jetzt die eigentliche Frage:

Kann ich einen Buffer als ein gerendertes Bild mit CreateSprite laden? Mit LoadSprite würde es gehen, nur müsste ich das Bild ja erst auf der HDD abspeichern, was wiederum viel Performance zieht - denke ich...

Hoffe einer weiß ne bessere Methode oder einen Lösungsvorschlag.

Vielen Dank im Vorraus


MfG Onkelz
 

Dreamora

BeitragSa, Feb 02, 2008 13:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Imposters sind mit Blitz ohnehin nicht möglich.
In "echtzeit" ein Bild von einem Objekt zu machen um es als Textur zu verwenden kostet nicht unerheblich viel Zeit, da es kein Render2Texture geschweige denn RenderTargets gibt (-> DX9 Shader Feature)
Das andere Problem ist der massive VRAM verbrauch den du so hättest.

Wenn du einen projizierten LoD Level willst, so würd ich vorschlagen, den prinzipiell ins Model mitzuintegrieren, wie die regulären LoD Level auch, die du drin hast, sofern du wirklich optimieren willst.
Ein Model würd dann zb so aussehen von der hierarchie her

root
- HighDetail
- MediumDetail
- LowDetail
- NullDetail (das wär dann dein "sprite" bzw. 3 gekreuzte ebenen mit entsprechenden Texturen. Damit kann man recht effizient ganze bäume faken aus der distanz Smile )

du würdest dann je nach bedarf halt ein anderes child von root anzeigen / hiden

alternativ kannst du das auch mit verschiedenen Modellen machen und zb _high _medium _low _null zwischen namen und b3d packen um sie beim laden einem type gescheit zuweisen zu können. Vorteil davon wär das du zwischen den LoD Leveln entityautofade nutzen könntest. damit ersparst du es dir es potentiell manuell machen zu müssen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

maximilian

BeitragSa, Feb 02, 2008 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Also alle Spiele mit großen Welten, die ich kenne (GTA, WoW...) benutzten Streaming... (laden ständig nach) was mit Blitz nicht unbedingt einfach zu realisieren ist!
Variety is the spice of life. One day ignore people, next day annoy them.
 

Dreamora

BeitragSa, Feb 02, 2008 13:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Streaming ändert nichts daran, dass du Level of Detail basierendes Rendering brauchst um gescheit Detail und Performance zu verbinden.
Streaming erlaubt nur grössere Welten ohne dabei übermässig RAM zu verschleissen. Bestätigt dir jeder WoW Spieler mit 512MB RAM, wo das Streaming dann nämlich bei grösseren Switches -> Ironforge / Stormwind dafür sorgt das das system glei ma einige Momente stehen bleibt Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragSa, Feb 02, 2008 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Erstmal vielen Dank für die Antworten.

Habe aber eine Frage zur Ersten:


Ich habe in der großen Welt natürlich auch viele Objekte - wenn ich diese nun per EntityAutoFade verschwinden lasse würden sie ja doch immer noch gerendert nicht wie mit HideEntity oder?

Was wiederum zu einer Ruckelparty ab ka. ca. 8000 Objekten führen würde.

Noch ne Andere Sache - diesen massiven VRam würde ich nicht brauchen, da immer gleichzeitig nur 4 Bilder (Sprites) aktiv wären - die anderen die "dahinter" lägen wären auf denen ja auch wieder "drauf gerendert"...

Und wenn ich für alle Objekte 3 Modelle mache (sind glaub bei mir eh schon alle low poly ^^ ) dann brauche ich ja auch wieder mehr Ram oder?
 

onkelz89

BeitragSa, Feb 02, 2008 14:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry wegen Doppelpost habe aber mal gerade was probiert...

naja die Problematik wird die dauer von dem rendern sein wobei das Beispiel ist mit viel zu vielen Objekten so wird es ja nich sein...

Code: [AUSKLAPPEN]
Graphics3D 800,600,32,2
SetBuffer BackBuffer()


AmbientLight 200,200,200

cam=CreateCamera()
PositionEntity cam,0,50,0
cam2=CreateCube()

Global spritecam[4]

For i=1 To 4
   spritecam[i]=CreateCamera()
   CameraProjMode spritecam[i],0
Next

block=CreateCube()

Type testing
 Field obj
 Field r
 Field g
 Field b
 Field x
 Field z
 Field y;höhe
End Type


size=300
For xx=-size To size Step 2
For zz=-size To size Step 2

testing.testing = New testing
testing\obj = CopyEntity(block)
testing\r = Rand (255)
testing\g = Rand (255)
testing\b = Rand (255)
testing\x = xx
testing\z = zz
If Rand(150)=1 Then testing\y=10:ScaleEntity testing\obj,1,10,1 Else testing\y=1
PositionEntity testing\obj,testing\x,testing\y/2,testing\z
EntityColor testing\obj,testing\r,testing\g,testing\b
;If xx>50 Or xx<-50 Or zz>50 Or zz<-50 Then HideEntity testing\obj

Next
Next


Global hoch=50 ; kommt drauf an wo die kamera nachher ist
PositionEntity spritecam[1],0,hoch,50  ;  0°

PositionEntity spritecam[2],0,hoch,-50 ;180°
TurnEntity spritecam[2],0,180,0

PositionEntity spritecam[3],-50,hoch,0 ; 90°
TurnEntity spritecam[3],0,90,0

PositionEntity spritecam[4],50,hoch,0  ;-90°
TurnEntity spritecam[4],0,-90,0


PositionEntity spritecam[1],0,hoch,0 ;  0°
PositionEntity spritecam[2],0,hoch,0 ;180°
PositionEntity spritecam[3],0,hoch,0 ; 90°
PositionEntity spritecam[4],0,hoch,0 ;-90°

For testing.testing = Each testing
   If testing\x<50 And testing\x>-50 And testing\z<50 And testing\z>-50 Then HideEntity testing\obj   
Next
CameraProjMode cam,0

If a<>23423 Then
   For i=1 To 4
      CameraProjMode spritecam[i],1
      RenderWorld
      SaveBuffer (BackBuffer(),i+".bmp")
      CameraProjMode spritecam[i],0
   Next
EndIf

CameraProjMode cam,1

sprite1=LoadSprite("1.bmp")
sprite2=LoadSprite("2.bmp")
sprite3=LoadSprite("3.bmp")
sprite4=LoadSprite("4.bmp")

SpriteViewMode sprite1,2
SpriteViewMode sprite2,2
SpriteViewMode sprite3,2
SpriteViewMode sprite4,2

big=50
ScaleSprite sprite1,big,big
ScaleSprite sprite2,big,big
ScaleSprite sprite3,big,big
ScaleSprite sprite4,big,big

PositionEntity sprite1,0,hoch,50
PositionEntity sprite2,0,hoch,-50
PositionEntity sprite3,-50,hoch,0
PositionEntity sprite4,50,hoch,0

TurnEntity sprite2,0,180,0
TurnEntity sprite3,0,90,0
TurnEntity sprite4,0,-90,0

For testing.testing = Each testing
   HideEntity testing\obj
   If testing\x<50 And testing\x>-50 And testing\z<50 And testing\z>-50 Then ShowEntity testing\obj   
Next


Global timer=CreateTimer(60)
While Not KeyHit(1)


mxs#=-MouseXSpeed()
mys#=MouseYSpeed()
If mxs#<>0 Then RotateEntity cam2,EntityPitch(cam2),EntityYaw(cam2)+mxs#,EntityRoll(cam2):RotateEntity cam,EntityPitch(cam),EntityYaw(cam)+mxs#,EntityRoll(cam)
   If mys#<>0 Then
      If mys#>0 Then
         If EntityPitch(cam)+mys#>70
            mys#=70-EntityPitch(cam)
         EndIf
     RotateEntity cam,EntityPitch(cam)+mys#,EntityYaw(cam),EntityRoll(cam)
   ElseIf mys#<0 Then
      If EntityPitch(cam)+mys#<-70
         mys#=-70-EntityPitch(cam)
      EndIf
   RotateEntity cam,EntityPitch(cam)+mys#,EntityYaw(cam),EntityRoll(cam)
   EndIf
EndIf
MoveMouse 400,300

camspeed#=3
If KeyDown( 32 ) Then MoveEntity cam,camspeed#,0,0
If KeyDown( 30 ) Then MoveEntity cam,-camspeed#,0,0
If KeyDown( 31 ) Then MoveEntity cam,0,0,-camspeed#
If KeyDown( 17 ) Then MoveEntity cam,0,0,camspeed#




;UpdateWorld
RenderWorld

Text 10,30,EntityX(cam)+" / "+EntityY(cam)+" / "+EntityZ(cam)
Text 10,50,EntityYaw(cam)

WaitTimer(timer)
Flip
Wend



schauts euch bitte mal an...
 

Dreamora

BeitragSa, Feb 02, 2008 14:36
Antworten mit Zitat
Benutzer-Profile anzeigen
ach du willst nur 4 rendern?
Ging davon aus, dass du das wie es normalerweise standard ist, auf "per objekt" oder "per objekt cluster" basis machst, damit du es nicht jedes Frame aktualisieren musst, denn das geht nicht.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragSa, Feb 02, 2008 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
gibt es denn eine Möglichkeit die Bilder direkt in den Ram zu speichern - das wäre ja schonmal um einiges schneller.

Und naja ich muss eigentlich alle X Frames wenn ich näher an die "Wände" komme rendern oder bei einem Höhenunterschied der Spielerkamera...

dürft doch irgendwie machbar sein - hoffe ich zumindest
 

Dreamora

BeitragSa, Feb 02, 2008 15:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Würd nix bringen etwas in den ram zu speichern, da du es von da nicht laden kannst.
Aber du kannst CreateSprite und EntityTexture nehmen um direkt mit Texturen die du via CopyRect ausm "Backbuffer fütterst" zu texturieren.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

onkelz89

BeitragSa, Feb 02, 2008 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy Das ist auf jeden Fall um einiges schneller!!!

Code: [AUSKLAPPEN]
CameraProjMode cam,0

Global spritetex[4]

If a<>23423 Then
   For i=1 To 4
      CameraProjMode spritecam[i],1
      spritetex[i]=CreateTexture(800,600) ; Bei 500,500 geht es
      CopyRect 0,0,800,600,0,0,BackBuffer(),TextureBuffer(spritetex[i])
      ;SetBuffer TextureBuffer(spritetex[i])
      RenderWorld
      ;SaveBuffer (BackBuffer(),i+".bmp")
      CameraProjMode spritecam[i],0
   Next
EndIf
;SetBuffer BackBuffer()

CameraProjMode cam,1

;sprite1=LoadSprite("1.bmp")
;sprite2=LoadSprite("2.bmp")
;sprite3=LoadSprite("3.bmp")
;sprite4=LoadSprite("4.bmp")

sprite1=CreateSprite()
sprite2=CreateSprite()
sprite3=CreateSprite()
sprite4=CreateSprite()
EntityTexture sprite1,spritetex[1]
EntityTexture sprite2,spritetex[2]
EntityTexture sprite3,spritetex[3]
EntityTexture sprite4,spritetex[4]


Das habe ich verändert... Allerdings habe ich jetzt einen der 4 Sprites "verloren" der ist einfach weg wenn ich das Prog starte... und die Sprites sind voll verschoben ich hab bisher nur flüchtig drüber geschaut, werd mich auch gleich wieder dran setzten.

Aber Grundlegend denkst du das diese Methode funktioniert "egal" wie groß das Game werden sollte?
 

ChristianK

BeitragSa, Feb 02, 2008 16:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Render2Texture und RenderTargets sind das gleiche und kein DirectX 9 Feature. Im Forum auf bb.com gibt es eine Userlib für solche RenderTargets. Im Prinzip machen die das gleiche wie die Methode mit CopyRect, nur mit deutlich weniger Aufwand.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

onkelz89

BeitragSa, Feb 02, 2008 16:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Info werde ich mal nach suchen - hab eben auf anhieb nix gefunden...

Danke euch für die schnelle Hilfe!!!
 

Dreamora

BeitragSa, Feb 02, 2008 16:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ChristianK hat Folgendes geschrieben:
Render2Texture und RenderTargets sind das gleiche und kein DirectX 9 Feature. Im Forum auf bb.com gibt es eine Userlib für solche RenderTargets. Im Prinzip machen die das gleiche wie die Methode mit CopyRect, nur mit deutlich weniger Aufwand.


Wär schön.
Aber RenderTargets sind ein DX9 Feature.
Wie MRTs auch.


Render2Texture nicht, das stimmt. Die gehen mit Toms dx7test.dll wenn man die richtige hat. Allerdings soll es Systeme geben wo der Spass Probleme macht.
Aber ja, es ist ohne Frage einiges schneller als Render -> copy Ansätze
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

ChristianK

BeitragSa, Feb 02, 2008 17:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt keinen Unterschied zwischen RenderTargets und Render2Texture! Genau genommen gibt es gar kein "Render2Texture". In DirectX wird das als RenderTarget bezeichnet, egal ob es eine Textur oder ein Surface ( = BackBuffer ) ist.
Worin sollten sich die beiden Dinge deiner Meinung nach unterscheiden?

PS: Genau, die dx7test.dll hab ich gemeint. Smile
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group