Probleme mit ner kleinen TileEngine
-
Wenn du eine begrenzte Auswahl von 50x50-Tiles hast, mit denen du deine Spielwelt zusammensetzt, muust du nur die Indexes von diesen speichern. Ohne Zusatzinformationen kommst du also auf ~40 KB für die Spielwelt (bei einem 16 bit-Typ für den Index).
Beim Anzeigen kommen noch ~10 KB für jedes unterschiedliche Tile dazu.Falls jedes deiner Tiles wirklich einzigartig ist, solltest du immer nur den sichtbaren Teil der Spielwelt (und ein bisschen Rand, damit keine Verzögerungen beim Scrollen auftreten) im RAM halten.
-
Ich kann mir immer noch nicht vorstellen, dass da keine redundanten Informationen gespeichert werden. Versuch wie gesagt, eine Reduktion auf die unmittelbar relevanten Daten vorzunehmen. Sprites nimmst du dann nur für die aktuell gezeichneten Tiles. So sind die meisten Tiles leichtgewichtig.
-
du kannst die menge der Tiles die du im speicher halten musst durch Space Partitioning Algorithmen ganz gut unter kontrolle halten
BSP oder Quadtree sind für zweidimensionelle karten gedacht (karteninfos in 2 dimensionen, 3d karten mit heightmaps sind da z.b. auch enthalten)
Das prinzip von den dingern ist eigentlich sehr simpel, man teilt die karte immer wieder in 2 bzw 4 teile auf bis man eine mindestgröße erreicht hat (oder ein anderes kriterium greift) damit kann man dann ganz leicht die zu ladenden Bereiche minimieren, Kollisionsabfragen machen usw.
Zumindest würde mir jetzt spontan so ein ansatz einfallen
Wiki Quelle:
http://de.wikipedia.org/wiki/Quadtree
http://de.wikipedia.org/wiki/BSP_Tree
-
wenn es nur 5000*5000 pixel sind und er auf 4.8GB kam, hat er sich vermutlich einfach nur verrechnet.
-
5000 mal 5000 = 100 mal 100 Tiles - 10000 Tiles, pro Tile 512 KB macht 4,8GB
Ich hab jetzt mal mit der Engine aus dem Buch von Christian Rousselle ein Sprite erstellt, mit einem Pixel als Textur: 512 KB hatte das Sprite
-
Dann wird den Mist weg und such Dir ne vernünftige Engine. Welche Information an diesem Pixel benötigt denn bitte schön ein halbes Megabyte???
-
512 KB hatte das Sprite
Wie hast Du das festgestellt?
-
ich wuerde mal tippen: taskmanager
-
ich vermute mal stark, dass er für jedes tile eine bitmap, png oder sonstwas neu läd, anstatt nen resource manager zu verwenden.
edit: achso, du hast das gar nich ausprobiert, sondern nur aus diesem einem tile geschlussfolgert? nunja, wenn die engine nicht total stümperhaft ist, verwaltet die iwie, welche bilddateien schon geladen wurden und benutzt nur eine für alle sprites / tiles, die die selbe brauchen. das reduziert die tilemapgröße drastisch.
-
OK, jetzt hab ich das Sprite per "Hand" erstellt, ebenfalls 512 KB
Und es gibt einen Resource Manager
-
kannst du vielleicht hellihjb's frage beantworten?
-
Wenn es einen ResourceManager gibt was ist denn dann alles in deinem Sprite drin? Und vor allem bist du dir sicher das die 500kb nur der Sprite ist und nicht andere Programmteilen davon das eine doer andere Stück gehört?
-
Du hast sie schon erraten, rapso
Ich lad euch morgen mal den Code hoch, dann könnt ihr nachschauen, was da schiefgeht, wenn ihr wollt.
Hab den Code jetzt leider nicht, bin gerade nicht daheim
-
Also wenn er mit Task Manager richtig lag wieso haste dann nicht ein paar Hundert Sprites erstellt und dann mal ne Hochrechnung gemacht wieviel es wirklich ist?
-
je nach api werden sprites garnicht im taskmanager angezeigt und selbst wenn, es... mir fehlen die worte.
und 60L Diesel wiegen 1.2T
-
Hier bitte, 30 MB braucht die exe bei mir.
Der Quellcode ist jetzt direkt der aus dem Buch, nur dass ich 50 Sprites erstellt habe
Ich hab die Dinger jetzt per "Hand" erstellt (CSprite* Sprite1, CSprite* Sprite2, ...), und ohne Liste, weil man so auch leichter die Texturen verändern kann.
http://rapidshare.com/files/253727011/SpriteClass.rar.html
-
CSprite Sprite1; CSprite Sprite2; CSprite Sprite3; CSprite Sprite4; CSprite Sprite5; ... CSprite Sprite59;
Wtf!? Sagt dir Array was?
Sprite1.Create(Direct3D.GetDevice(), FILE_NAME); Sprite2.Create(Direct3D.GetDevice(), FILE_NAME); Sprite3.Create(Direct3D.GetDevice(), FILE_NAME); Sprite4.Create(Direct3D.GetDevice(), FILE_NAME); Sprite5.Create(Direct3D.GetDevice(), FILE_NAME); ... Sprite49.Create(Direct3D.GetDevice(), FILE_NAME);
Oh man...
Sprite1.Draw(); Sprite2.Draw(); Sprite3.Draw(); Sprite4.Draw(); Sprite5.Draw(); ... Sprite49.Draw();
Und dann wundert dich noch, das etwas nciht funktioniert?
-
Bitte lies meinen oberen Beitrag, ich habe hier gesagt, dass ich die extra so reinkopiert hab - ohne Array oder Liste.
Vor allem ist das nicht meine Engine, das ist die aus dem Buch.Hier, das ist mein MapManager, der die voreingestellten Maps "malt":
for (it = MapSprites.begin(); it!=MapSprites.end(); it++) { (*it)->Draw(); }
Die haben dann auch einen ResourceManager
-
Arr0ws schrieb:
Die haben dann auch einen ResourceManager
Da sagt dein Quellcode aber was ganz anderes.
Dein Sprite::Create ruft D3DXCreateTextureFromFileEx auf. Ich gehe mal davon aus das jeder Sprite den du irgendwo erstellst via Create initalisiert wird, heist also das du für jeden Sprite die Textur neu lädst.
-
Vor allem ist das nicht meine Engine, das ist die aus dem Buch.