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.
Fórum › C / C++
Problem s SDL
![](img/forum_vlakno_help_vyreseno.png)
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);
}
}
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..*/
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);
}
![](img/forum_nove_psp_new.png)
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žení videa
Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/1.gif)
![](/img/smile/2.gif)
![](/img/smile/3.gif)
![](/img/smile/4.gif)
![](/img/smile/5.gif)
![](/img/smile/6.gif)
![](/img/smile/7.gif)
![](/img/smile/8.gif)
![](/img/smile/9.gif)
![](/img/smile/10.gif)
![](/img/smile/11.gif)
![](/img/smile/12.gif)
![](/img/smile/13.gif)
![](/img/smile/14.gif)
![](/img/smile/15.gif)
![](/img/smile/16.gif)
![](/img/smile/17.gif)
![](/img/smile/18.gif)
![](/img/smile/19.gif)
![](/img/smile/20.gif)
![](/img/smile/21.gif)
![](/img/smile/22.gif)
![](/img/smile/23.gif)
![](/img/smile/24.gif)
![](/img/smile/25.gif)
![](/img/smile/26.gif)
![](/img/smile/27.gif)
![](/img/smile/28.gif)
![](/img/smile/29.gif)
![](/img/smile/30.gif)
![](/img/smile/31.gif)
![](/img/smile/32.gif)
Uživatelé prohlížející si toto vlákno
Uživatelé on-line: 0 registrovaných, 31 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
Problém s kompilací SDL — založil Adam
Moderátoři diskuze