CreateSprite... Weitsicht in Spielen
Übersicht

onkelz89Betreff: CreateSprite... Weitsicht in Spielen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
onkelz89 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Info werde ich mal nach suchen - hab eben auf anhieb nix gefunden...
Danke euch für die schnelle Hilfe!!! |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group