Iso Map-Engine 30 Mio Tiles

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Trust

Betreff: Iso Map-Engine 30 Mio Tiles

BeitragSa, Mai 05, 2012 4:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey,

habt ihr schonmal eine Iso-Map Engine gesehen die über 30 Millionen Tiles auf einmal, und ohne Geschwindigkeitseinbrüche handeln kann?
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Hubsi

BeitragSa, Mai 05, 2012 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Solange nur die Tiles gezeichnet werden die man auch sieht ist es ein reines Speicher"problem".
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

BladeRunner

Moderator

BeitragSa, Mai 05, 2012 9:14
Antworten mit Zitat
Benutzer-Profile anzeigen
30 Millionen Tiles wären bei geringstmöglicher Platznutzung auch 30 Millionen Byte, also knapp 30 MB - kein Problem für moderne Rechner. Und mit intelligenter Zeichenroutine auch technisch kein Problem.
Aber: Was will man mit derart riesiger Map. Das überfordert doch jeden Spieler.
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

ZaP

BeitragSa, Mai 05, 2012 11:10
Antworten mit Zitat
Benutzer-Profile anzeigen
BR: Kann ja sein, dass die Tiles nur 2x2 Pixel sind Razz

Du kannst eigentlich beliebig viele Tiles benutzen, wichtig ist halt, dass nicht immer gleich alles im Speicher sein muss (Wobei wie BR ja schon meinte, 30M da nicht so das Problem sind...). Du kannst ja einfach Regionen, die wahrscheinlich bald vom Spieler betreten werden, von der Festplatte nachladen.
Starfare: Worklog, Website (download)

DerHase

BeitragSa, Mai 05, 2012 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe es mit Blitz Plus und 20 Millionen Kacheln getestet, keine Iso map, aber zum scrollen, sollte auch in ISO genauso gut gehn, hehe.
Code: [AUSKLAPPEN]
;Grafikmodus etc. initialisieren
Graphics 640, 480, 0,2
HidePointer
ClsColor 100,150,100


;Kachel erstellen
Global kachel = CreateImage(32,32)
SetBuffer ImageBuffer(kachel)
Color 50,50,200
Rect 0,0,32,32,1
Color 120,120,250
Line 0,0,0,30
Line 0,0,30,0
Color 10,10,100
Line 31,31,31,1
Line 31,31,1,31
SetBuffer BackBuffer()

;Variablen der "Kamere"
Global cam_x
Global cam_y
Global cam_speed = 4

;Die Tilemap wird hier erstellt
Dim tilemap(4500,4500)
For x = 0 To 4499
   For y = 0 To 4499
      tilemap(x,y) = 1
   Next
Next

For x = 2 To 4497
   For y = 2 To 4497
      tilemap(x,y) = 0
   Next
Next

For x = 6 To 4493
   For y = 6 To 4493
      tilemap(x,y) = Rand(0,1)
   Next
Next


;Die Hauptschleife
While Not KeyHit(1)
   
   Cam_Control()
   
   DrawTileMap()
   
   Flip:Cls
   
Wend

;Die Sichtbaren Tile werden gezeichnet
Function DrawTileMap()
   cam_x_div = cam_x / 32
   cam_y_div = cam_y / 32

   ;Malt 21*16 Tiles statt 100*100 Tiles
   For x = cam_x_div  To cam_x_div + 20
      For y = cam_y_div  To cam_y_div + 15

         If tilemap(x,y) = 1
            DrawImage kachel,x*32-cam_x,y*32-cam_y
         End If
      Next
   Next

End Function


Function Cam_Control()
   ;Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed
   If KeyDown(203) Then cam_x = cam_x - cam_speed
   If KeyDown(205) Then cam_x = cam_x + cam_speed
   If KeyDown(200) Then cam_y = cam_y - cam_speed
   If KeyDown(208) Then cam_y = cam_y + cam_speed
   If KeyHit(16) And cam_speed < 10 Then cam_speed = cam_speed + 1
   If KeyHit(30) And cam_speed > 1 Then cam_speed = cam_speed - 1
   
   ;Hier wird verhindert, dass die Kamera ausserhalb der Map gerät
   If cam_x < 0 Then cam_x = 0
   If cam_y < 0 Then cam_y = 0
   If cam_x > 143360 Then cam_x =143360
   If cam_y > 143520 Then cam_y =143520
   
End Function


Aber ergibt ne ziemliche große Welt die befüllt und dann begangen werden muss, damit es sinn macht Razz
Play Satyr!

Trust

BeitragSa, Mai 05, 2012 14:38
Antworten mit Zitat
Benutzer-Profile anzeigen
Nur die zu zeichnen wo auf dem Bildschirm sind reicht da nicht, es dürfen komplett nur die berechnet/beachtet werden wo auf dem Bildschirm sind.
Die Tiles habe ich zum testen 128*63 Pixel gross gemacht.
Ok also ist es nix besonderes, schade Smile.

Habe, weil ich zur Zeit an einem Problem hänge und nicht zu einer zufriedenstellenden Lösung komme (ein anderer Beitrag in der BMax allgemein sektion) mal ein bissl mit der Engine "gespielt" und versucht sie auszureizen (man meint garnicht was da einem für Sachen auffallen, die man optimieren kann) und musste feststellen, dass Maps wo 5000*8000 Tiles gross sind, so ziemlich das Maximum ist was man erstellen kann. Alles was so über 30 Mio Tiles geht stürzt das Programm ab. Denke liegt daran, dass zu "wenig" Arbeitsspeicher vorhanden ist.
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Xeres

Moderator

BeitragSa, Mai 05, 2012 14:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht solltest du dann nicht alles gleichzeitig in den Speicher stopfen, sondern nachladen, wenn es nötig wird... Und ich behaupte einfach mal, du machst irgendwas falsch, wenn es abstürzt...
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)

Trust

BeitragSa, Mai 05, 2012 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Map die 5000*7000 Tiles gross ist, hat 35 Mio Tiles. Ein Tile benötigt mit allen informationen ca. 25 Bytes speicherplatz. 25 Bytes * 35 Mio sind 875 MB. Ich habe nur 2GB Arbeitsspeicher, und andere Programme brauchen ja auch Speicher
Glaube, ich hab da nix falsch gemacht, sondern einfach nur zu "wenig" Arbeitspeicher ;-D
Denn eine Map mit 5000*7000 Tiles (35 Mio) klappt ja noch wunderbar. Aber eine Map wo 5000*8000 Tiles hat (40 Mio) benötigt genau 1GB Speicherplatz. Und da stürzt es ab.
Und abgesehen davon brauch kein Mensch eine Map mit diesen ausmaßen. Also spare ich mir einfach das Teilweise laden in den Arbeitsspeicher. Smile
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
  • Zuletzt bearbeitet von Trust am Sa, Mai 05, 2012 15:25, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Mai 05, 2012 15:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst erklärst du, dass man so viele Daten, wie du postulierst, gar nicht im Speicher halten kann und dann brauchst das ja auch keiner.
Was zum Teufel ist dann hier der Punkt?
Ja, du machst was falsch, wenn du es so umsetzt, wenn es in dieser Form unmöglich ist. Man sollte immer weniger als das absolute Maximum an Ressourcen belegen (zumal Windows einer Anwendung auch nicht den gesamten RAM Abtritt).
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)

DerHase

BeitragSa, Mai 05, 2012 15:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Scroll-Ding das ich geschrieben hab geht auch super mit über 65 Millionen Tiles, was speicherst Du pro Tile ab, vielleicht kann man ads irgendwie geschickt reduzieren?
Play Satyr!

Trust

BeitragSa, Mai 05, 2012 15:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Das hier ist doch ein Beitrag in der "Smalltalk" sektion.
Ich habe nie gesagt das ich solch riesige Maps brauch, wollte nur mal diskutieren und Meinungen hören bezüglich "übergrossen" Iso-Maps.
Wenn ich solche brauchen würde, würde ich wie du schon sagtest (Xeres), diese Teilweise in den Speicher laden.
Wollte hier eigentlich nicht Streiten, eher Meinungen hören wie andere das sehen. ( Man lernt nie aus )


@ DerHase
Code: [AUSKLAPPEN]
Function Create:MF_Ttile(x:Int, y:Int, width:Int, height:Int, groundHeight:Int, mat:Int = 0, walkable:Byte = 1, full:Byte = 0) Final

sind
6x 32 bit signed integer = 24 byte
2X 8 bit unsigned integer = 2 byte
26 Byte insgesammt.

Man könnte hier statt int, short nehmen
Code: [AUSKLAPPEN]
width:Int, height:Int, groundHeight:Int, mat:Int = 0


2x 32 bit signed integer = 8 Byte
4x 16 bit unsigned integer = 8 Byte
2x 8 bit unsigned integer = 2 Byte
18 Byte insgesammt.

Und schon wieder was zum Optimieren Smile
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Xeres

Moderator

BeitragSa, Mai 05, 2012 15:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum sollte ein Tile seine Koordinaten oder Breite & Höhe enthalten?
Und ich bin mir fast sicher, Byte nimmt bei BlitzMax den selben Platz ein wie ein Integer (im RAM) da Ints schneller verarbeitet werden; könnte also sein, dass man an der Stelle nicht zu viel spart.
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)

Trust

BeitragSa, Mai 05, 2012 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Warum sollte ein Tile seine Koordinaten oder Breite & Höhe enthalten?

Eine gute Frage!

Habe es bis jetzt so gelöst, dass es eine Klasse Ttile gibt, wo jedes Tile alle wichtigen Infos über sich selbst hat.
Zusätzlich gibt es eine Klasse Tmap, welche unter anderem als Eigenschafft ein Array Ttile hat, und die Tiles managed und organisiert.
So muss der Benutzer sich nicht mit Arrays rumschlagen, sondern kann einfach map.Create() map.Draw() map.Update() benutzen und das wars.

Aber jetzt wo du es sagst, wäre es tatsächlich besser, Breite und Höhe in der Klasse Tmap zu speichern. Da diese Info für jedes Tile immer gleich bleibt. Danke für den Tip!


Ok, bin von der BMax referenz ausgegangen, und da steht Byte = 8 Bits, Int = 32 Bits, Short = 16 Bits
Also arbeitet BMax bei Byte intern mit 32 Bit, reserviert also Speicher für 32 Bits, benutzt aber nur die letzten 8 Bits, und die ersten 24 Bits sind 0...?
Also ists grad wurscht, wenn man immer Int benutzt.... gut zu wissen!
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.

Noobody

BeitragSa, Mai 05, 2012 17:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Xeres hat Folgendes geschrieben:
Und ich bin mir fast sicher, Byte nimmt bei BlitzMax den selben Platz ein wie ein Integer (im RAM) da Ints schneller verarbeitet werden

Nope.

BlitzMax: [AUSKLAPPEN]
Type Foo
Field A:Int, B:Int, C:Int
End Type

Type Bar
Field A:Byte, B:Byte, C:Byte
End Type

Local WithInts :Foo = New Foo
Local WithBytes:Bar = New Bar

Print SizeOf(WithInts)
Print SizeOf(WithBytes)


Bytes werden übrigens gleich schnell verarbeitet wie Ints, da muss man sich keine Sorgen machen. (okay, kommt stark aufs Alignment drauf an. Aber ein Int mit schlechtem Alignment ist mindestens so langsam wie ein Byte mit schlechtem Alignment)
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Trust

BeitragSa, Mai 05, 2012 17:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, war auch grade am testen und bin zum selben Entschluss gekommen.
War schon am zweifeln!

Code: [AUSKLAPPEN]
Type byteType
   Field b:Byte
End Type

Type shortType
   Field sh:Short
End Type

Type intType
   Field i:Int
End Type

Type longType
   Field l:Long
End Type

Type floatType
   Field f:Float
End Type

Type doubleType
   Field d:Double
End Type

Local myByte:byteType = New byteType
Local myShort:shortType = New shortType
Local myInt:intType = New intType
Local myLong:longType = New longType
Local myFloat:floatType = New floatType
Local myDouble:doubleType = New doubleType

Print ""
Print "Size of byte (8 bit): " + SizeOf(myByte.b) + " byte"
Print "Size of short (16 bit): " + SizeOf(myShort.sh) + " byte"
Print "Size of int (32 bit): " + SizeOf(myInt.i) + " byte"
Print "Size of long (64 bit): " + SizeOf(mylong.l) + " byte"
Print "Size of float(32 bit): " + SizeOf(myFloat.f) + " byte"
Print "Size of double(64 bit): " + SizeOf(myDouble.d) + " byte"



[EDIT]

Dank Xeres sind nun 60 Mio Tiles kein Problem mehr Smile

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group