Problem s SDL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problem s SDL – C / C++ – Fórum – Programujte.comProblem s SDL – C / C++ – Fórum – Programujte.com

 

Milan
~ Anonymní uživatel
282 příspěvků
9. 8. 2007   #1
-
0
-

Dobry den,

Mam program, casomieru, kde vykreslujem cisla z BMP obrazkov. Avsak po urcitom case mi program zmrzne. Skusal som zmenit pocet vykreslovanych cisel za sekundu a zistil som ze cim viac „cisel za sekundu“ je vykreslenych, tym driv mi program sekne. Takze predpokladam ze treba vyprazdnit Buffer alebo take nieco. Nic som ale nezistil.

Poprosil by som teda tymto o radu co s tym.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
9. 8. 2007   #2
-
0
-

Bez kódu ani ránu.

Nahlásit jako SPAM
IP: ...–
mephi0
Expert
10. 8. 2007   #3
-
0
-

najskor to bude zaplnenie pamate. Skontroluj či nemaš v nejakom cykle slovo "new" ;)

Nahlásit jako SPAM
IP: ...–
Program nemusi fungovat rychle, staci ze funguje dostatecne rychle.
Zelenáč0
Posthunter
10. 8. 2007   #4
-
0
-

Taky muze byt blbe chlazeny procesor :-)

Nahlásit jako SPAM
IP: ...–
Milan
~ Anonymní uživatel
282 příspěvků
10. 8. 2007   #5
-
0
-

To Jura:



#include <SDL/SDL.h>
#include <stdio.h>
#include <stdlib.h>

SDL_Surface *screen;
SDL_Surface *image;

void vytvor_okno(){
if(SDL_Init(SDL_INIT_VIDEO) < 0){
printf("Inicializace SDL se nezdařila: %s", SDL_GetError());
exit(1);
}

atexit(SDL_Quit);
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);

if (screen == NULL){
printf("Vytvoření okna se nezdařilo: %s", SDL_GetError());
exit(1);
}
}

void cas(Uint32 cas){
char subor[7];
int min,sec,hund;
min=cas/60000;
sec=(cas-min*60000)/1000;
hund=(cas-min*60000-sec*1000)/10;
SDL_Rect rect;
rect.x=195;
rect.y=100;
sprintf(subor,"%d.bmp",min/10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
rect.x=255;
sprintf(subor,"%d.bmp",min%10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
rect.x=345;
sprintf(subor,"%d.bmp",sec/10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
rect.x=405;
sprintf(subor,"%d.bmp",sec%10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
rect.x=495;
sprintf(subor,"%d.bmp",hund/10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
rect.x=555;
sprintf(subor,"%d.bmp",hund%10);
image = SDL_LoadBMP(subor);
SDL_BlitSurface(image, NULL, screen, &rect);
SDL_Flip(screen);
}

int main(int argc, char *argv[]){

vytvor_okno();

SDL_Init(SDL_INIT_TIMER);

Uint32 counts,start;

bool done=false;

start=SDL_GetTicks();

while(done == false){
SDL_Event event;
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) done=true;
}
counts=SDL_GetTicks();
cas(counts-start);
}
}

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
10. 8. 2007   #6
-
0
-

Njn, neuvolňuješ zdroje pomocí SDL_FreeSurface(...). Ale jinak doporučuju, než to pořád načítat si ty bimapy načíst do pole, a pak k nim přistupovat přes vypočtený index.

Nahlásit jako SPAM
IP: ...–
Milan
~ Anonymní uživatel
282 příspěvků
10. 8. 2007   #7
-
0
-

To Jura:
Diky moc. Vyskusam. A ako casto mam uvolnovat zdroje? Samozrejme to je este len verzia 0.0001 toho programu, takze to prejde este mnoha upravami. ;) Este raz diky.

Nahlásit jako SPAM
IP: ...–
Milan
~ Anonymní uživatel
282 příspěvků
10. 8. 2007   #8
-
0
-

Nejak neviem kam mam dat to uvolnovanie zdrojov. A ake zdroje? SDL_FreeSurface(screen) alebo SDL_FreeSurface(image). Pretoze mi to stale mrzne.

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
10. 8. 2007   #9
-
0
-

Až nebudou potřeba, nejpozději však s před koncem programu. Patrně děláš v C(v C++ by to bylo jednoušší). Ale můžeš to udělat třeba tak, ze si udelas nejakou strukturu reperezentujici obrayek sadu funcki pro praci s nim - nacteni, uvolneni a vykresleni,a pak pro pohodlnoist treba nejakeho managare. Jen nastíním...



typedef struct _sprite
{
/*char visible;*/
size_t x, y;
SDL_Surface* texture;
}sprite;

void RenderSprite(const sprite* pSprite, SDL_Surface *pScreen)
{ assert(pSprite && pSprite->texture && "neco je NULL");
SDL_Rect rect = {pSprite->x, pSprite->y};
SDL_BlitSurface(pSprite->texture, 0, pScreen, &rect);
}

void FreeSprite(sprite* pSPrite)
{ if(pSprite && pSprite->Texture)
SDL_FreeSurface(pSprite->Texture);
}

int InitSprite(sprite *pSprite,size_t x, size_t y, const char*path)
{ assert(pSprite && "sprite je NULL");
pSprite->x = x;
pSprite->y = y;
return (int)(pSprite->texture=SDL_LoadBitmap(path)) != NULL;
}

/*a pak nejaky ten manager a sadu funkci*/
typedef struct _manager
{ size_t count, size;
sprite *sprites; // pole ktere alokujes pri startu programu a dealokujes pri konci programu
}manager;
/*pak realizovat nejake to pridavani,odebirani, vzkresleovani atd..*/

Nahlásit jako SPAM
IP: ...–
Jura
~ Anonymní uživatel
637 příspěvků
11. 8. 2007   #10
-
0
-

Nezkouseno. Jinak myslim, ze myslenka je jasna.



#include "SDL/SDL.h"
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define NUM_OF_SPRITES /*DPOLN POCET BMP OBRAZKU, S KTERYMI PRACUJES*/

typedef struct _sprite
{
size_t x, y;
SDL_Surface *texture;
}sprite;

SDL_Surface *screen = 0;
sprite image[NUM_OF_SPRITES]={0};

void RenderSprite(const sprite* pSprite, SDL_Surface *pScreen);
void FreeSprite(sprite* pSprite);
int InitSprite(sprite *pSprite,size_t x, size_t y, const char*path);
int InitSprites();
void OnQuit();
void vytvor_okno();
void cas(Uint32 cas);



int main(int argc, char *argv[]){

vytvor_okno();

if(!InitSprites())
{ fprintf(stderr, "Nepovedlo se nacist potrebne textury,\nprogram bude ukoncen.");
exit(2);
}

SDL_Init(SDL_INIT_TIMER);

Uint32 counts,start;

bool done=false;

start=SDL_GetTicks();

while(done == false){
SDL_Event event;
while(SDL_PollEvent(&event)){
if(event.type == SDL_QUIT) done=true;
}
counts=SDL_GetTicks();
cas(counts-start);
}
return 0;
}


void RenderSprite(const sprite* pSprite, SDL_Surface *pScreen)
{ assert(pSprite && pSprite->texture && "neco je NULL");
SDL_Rect rect = {pSprite->x, pSprite->y};
SDL_BlitSurface(pSprite->texture, 0, pScreen, &rect);
}

void FreeSprite(sprite* pSprite)
{ if(pSprite && pSprite->texture)
SDL_FreeSurface(pSprite->texture);
}

int InitSprite(sprite *pSprite,size_t x, size_t y, const char*path)
{ assert(pSprite && "sprite je NULL");
pSprite->x = x;
pSprite->y = y;
return (int)((pSprite->texture=SDL_LoadBMP(path)) != NULL);
}

void OnQuit()
{ int i=0;
for(;i<NUM_OF_SPRITES; ++i)
FreeSprite(&image[i]);
SDL_Quit();
}

void vytvor_okno(){
if(SDL_Init(SDL_INIT_VIDEO) < 0){
fprintf(stderr,"Inicializace SDL se nezdařila: %s", SDL_GetError());
exit(1);
}

atexit(OnQuit);
screen = SDL_SetVideoMode(800, 600, 32, SDL_HWSURFACE|SDL_DOUBLEBUF);

if (screen == NULL){
fprintf(stderr,"Vytvoření okna se nezdařilo: %s", SDL_GetError());
exit(1);
}


}

int InitSprites()
{ if(!(InitSprite(&image[0], 195,100,"0.bmp"))) return 0;
if(!(InitSprite(&image[1], 255,100,"1.bmp"))) return 0;
if(!(InitSprite(&image[2], 345,100,"2.bmp"))) return 0;
if(!(InitSprite(&image[3], 405,100,"3.bmp"))) return 0;
if(!(InitSprite(&image[4], 495,100,"4.bmp"))) return 0;
if(!(InitSprite(&image[5], 555,100,"5.bmp"))) return 0;
if(!(InitSprite(&image[6], 345,100,"6.bmp"))) return 0;
/*atd..*/

return 1;
}

void cas(Uint32 cas){
char subor[7];
int min,sec,hund;
min=cas/60000;
sec=(cas-min*60000)/1000;
hund=(cas-min*60000-sec*1000)/10;
RenderSprite(&image[min/10], screen);
RenderSprite(&image[min%10], screen);
RenderSprite(&image[sec/10], screen);
RenderSprite(&image[sec%10], screen);
RenderSprite(&image[hund/10], screen);
RenderSprite(&image[hund%10], screen);
/*atd...*/
SDL_Flip(screen);
}

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 38 hostů

Podobná vlákna

Problém s SDL — založil Systém

Problem so SDL — založil entity

SDL problém — založil newbie

Problem s SDL — založil yaqwsx

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý