1.Tajusin vasta äskettäin että koodin {$R *.*} sisällyttää resurssitiedoston ohjelman EXE:en. Laajemmissa ohjelmissa EXE:n koko voi kasvaa liian suureksi, eli siis pystyykö resurssitiedostoja linkittämään dynaamisesti mukaan ohjelmaan?
2.Huomasin että jos funktion palautusarvona on Tbitmap, käytettäessä se vie ohjelman suorituksen ajan c: -aseman tilaa. Miten tässä tapauksessa pitää toimia vai pitäisikö vain välttää tällaisia tilanteita?
1. Siis... dynaamisesti...?
Voihan noita kuvia esimerkiksi ladata (TImage.Picture.LoadFromFile) ja kursorit ja ikonit eivät paljoa tilaa vie... Mitä muuta resursseihin voi vielä laittaa? Itse en ole koskaan laittanut kuin ikonin ja kursorit.
2. Eihän se kovalevylle sitä TBitmappia laita! Olet kyllä oudon ohjelman saanut aikaan... Ohjelmasi ei tallenna kovalevylle mitään jos sitä ei nimenomaisesti käsketä. Tuo TBitmap on muistissa. Tietenkin jos muisti loppuu kesken, käytetään virtuaalista muistia...
Miksi palautusarvo on TBitmap? Mitä funktio tekee?
1.Tarkoitus on että ohjelman käyttäjät eivät pääse käsiksi kuviin. Ikonit ja kursorit voi tietysti laittaa resurssitiedostoihin.
Tarkoitus on käyttää jotain LoadFromFile:a vastaavaa, joka lataisi resurssit tiedostosta. Tarkoitan dynaamisella juuri sitä että resurssitiedostot eivät sisältyisi EXE:een, eli ne olisivat erillisissä tiedostoista resurssimuodossa josta ne voisi ladata ohjelmaan.
2.Kun funktiota toistaa, c:n tila käy vähiin, ei ihme koska bittikartat voivat kooltaan olla 1000x1000 pixeliä. En sanonutkaan että ne tallentuisivat c:lle, mutta ohjelman suorituksen aikana tuli viesti Windowsilta 'levytila vähissä asemassa c'(ei ihme koska vapaata tilaa on 170mt).
Kun lopetin ohjelman levytila palautui ennalleen. En minä tiedä miksi näin mutta ei minun silmät valehtele.
Funktion tarkoitus on luoda pelikenttä taulukon pohjalta.
Niin ja minun ohjelma ei ole outo vaan minun kone on outo, kaikissa vähänkin isommissa peleissä käy levytila vähiin, ja pelin sulkemisen jälkeen levytila vapautuu. Varmaan asetuksissa vikaa.(Kone: 266Mhz,128mt,levytila: 3 Gt)
Muistaakseni ihan Delphin esimerkkiohjelmista löytyy ohjelma, jolla voi lukea EXE- ja DLL-tiedostoista niiden resurssit, joten tuo kuviasi suojaa...
Resurssitiedosto on vain tiedosto, jossa lukee suunnilleen, että "bmp1.bmp, alkaa tavusta XYZ ja päättyy tavuun ZYX" ja sitten siinä on ne kaikki kuvat ja muut aivan tavallisina kuvina. Lue Delphin ohjeet kohdasta "Resource DLLs" tms. En ole yhtäkään DLL:ää koskaan tehnyt, mutta se on ongelmasi ratkaisu. Toisaalta, jos jaksat väkertää, voit luoda oman classin joka lukee (ja kirjoittaa) omaa tiedostotyyppiäsi,jonka olet kryptannut sopivasti :D
Ymmärsinkö nyt oikein, että teet tileistä pelikentän (siis jostakin 32x32 palasista tms.), piirrät koko homman toiselle TBitmapille tms. joka on myös muistissa?
Joissain tapauksissa voi olla jopa kannattavaa piirtää koko lauta palasista uudestaan joka kerta...
Homma varmaankin ratkeaa osittain sillä, ettet palauta funktiosta TBitmappia vaan Pointterin , joka osoittaa siihen (PBitmap..?). En osaa tarkalleen neuvoa kun ei ole lähdekoodia edessä enkä välttämättä osaisi silloinkaan kun eivät nuo Pascalin pointterit ole ihan vahvin alani.
En tiedä kuinka ohjelmasi toimii, mutta jos luot uusia TBitmappeja joita et myöhemmin tuhoa, ne syövät muistia pala palalta.
Toisaalta muistia ei alun perinkään ole paljoa...
Joka tapauksessa muisti loppuu ja Windows alkaa käyttää kovalevya keskusmuistin jatkona, ja levytilaa ei ilmeisesti ole alun perinkään paljoa.
No virtuaalimuistiksihan se tuota levytilaa varaa.
Win9x:llä tuo löytyy tiedostosta c:\windows\win386.swp NT:eillä se on c:\pagefile.sys. Oletuksena Windows käyttää dynaamista swappitiedostoa, eli mikäli varattu tila käy pieneksi, sitä varataan lisää, josta voi seurata se, että kiintolevytila loppuu kesken. Tuon swappifileen koon voi määrittää kiinteäks (NT:llä Control Panel > System > Advanced > Performance > Advanced > Change ja sieltä Initial Sizeen ja Maximum Sizeen sama luku, 9x:llä Control Panel > System > Performance > Virtual Memory > Let me specify my own virtual memory settings ja molempiin laatikoihin sama luku), jolloin se syö aina saman verran, eikä typeriä "levytila loppuu!111" -ilmoituksia tule. Silloin tosin kun muisti loppuu, niin se tosiaan loppuu, eli ei kannata liian pieneksi säätää, tai saa olla resettiä hakkaamassa vähän väliä :) Omalle 512mb vehkeelle on hyvin riittänyt 512mb swappifilu.
Ilmeisesti pitää tehdä omat cryptaukset kuville.
Pelikenttä muodostuu viistosti kuvatuista tileistä, joilla on korkeusarvot. tulos näyttää jo aika paljon 3D-moottorin tekemältä, mutta koodi on hidas joten se on kannattavampaa piirtää kerralla Loading-screenin aikana.
Oikeastaan ratkaisin jo tämän muuttamalla funktion proceduuriksi, mutta tulevaisuuden varalta tämä olisi hyvä tietää.
Eikö bitmapit normaalisti tuhota Tbitmap.Free? Siksi bittikartaa palautusarvona on pieni ongelma.
Juu määritin swapin viemään d: -aseman tilaa, siellä on kuitenkin yli 600 mt tilaa.
Näköjään :D
procedure TObject.Free; begin if Self <> nil then Destroy; end;
En ole Pascalilla tällaista juurikaan tehnyt kun ei tuo Drag'n'Drop oikein innosta pelien tekoon...
Edit: Kun saat tuon pelin valmiiksi (beta-vaiheeseen), ilmoita ihmeessä! Olen aina halunnut nähdä Delphillä tehdyn pelin (muu kuin Tetris tms. Graafisesti olematon).
Metabolix kirjoitti:
Kun saat tuon pelin valmiiksi (beta-vaiheeseen), ilmoita ihmeessä!
Heh! Olet vanha karvainen ukko kun saan tuon valmiiksi. Aloitin pelkän maageneraattorin väsäämisen ennen kesäkuuta eikä vieläkään valmista.
Aihe on jo aika vanha, joten et voi enää vastata siihen.