Iso Map-Engine 30 Mio Tiles
Übersicht

![]() |
TrustBetreff: Iso Map-Engine 30 Mio Tiles |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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... |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
BR: Kann ja sein, dass die Tiles nur 2x2 Pixel sind ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Play Satyr! |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() |
||
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
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
DerHase |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen. |
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
![]() |
Trust |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group