【问题标题】:SDL image disappears after 15 secondsSDL 图像在 15 秒后消失
【发布时间】:2015-06-10 23:21:42
【问题描述】:

我正在学习 SDL,但遇到了一个令人沮丧的问题。代码如下。

即使有一个循环使程序保持活动状态,但当我加载图像并将源矩形的 x 值更改为动画时,加载的图像会在 15 秒后消失。静态图像不会发生这种情况。只有动画。我确定我缺少一个简单的东西,但我看不到它。

void update(){
    rect1.x = 62 * int ( (SDL_GetTicks() / 100) % 12); 
    /* 62 is the width of a frame, 12 is the number of frames */
}

void shark(){

    surface = IMG_Load("s1.png");
    if (surface != 0){
        texture = SDL_CreateTextureFromSurface(renderer,surface);
            SDL_FreeSurface(surface);
    }

    rect1.y = 0;

    rect1.h = 90;
    rect1.w = 60;

    rect2.x = 0;
    rect2.y = 0;

    rect2.h = rect1.h+30; // enlarging the image
    rect2.w = rect1.w+30;

    SDL_RenderCopy(renderer,texture,&rect1,&rect2);
}

void render(){
    SDL_SetRenderDrawColor(renderer, 0, 0, 100, 150);
    SDL_RenderPresent(renderer);
    SDL_RenderClear(renderer);
}

和主要的

   update();
   shark();
   render();

SDL_image 标头已包含、链接、dll 存在。会不会是dll坏了?

为了简单起见,我省略了程序的其余部分。如果这还不够,我可以发布整个内容。

【问题讨论】:

  • 至少展示你的整个循环。

标签: c++ visual-studio sdl


【解决方案1】:

每次调用shark 函数时,它都会加载另一个纹理副本。像你这样在循环中使用它,你将很快耗尽视频内存(除非你在每一帧之后都调用SDL_DestroyTexture,你没有指出)。此时,您将无法再加载纹理。显然,这对您来说大约需要 15 秒。

如果您要一遍又一遍地使用相同的图像,那么只需在主循环之前加载一次。

【讨论】:

  • 谢谢,添加销毁功能解决了!!我不明白为什么它不只是覆盖变量..
  • @DanaaMograine:它确实覆盖了变量。但在这种情况下,变量只是一个指针。覆盖指针对它指向的东西(在这种情况下是纹理)没有影响,因为可能有其他指针持有相同的地址。
  • 所以函数CreateTextureFromSurface在堆上返回一个SDL_Texture,并且每次父函数运行时,它都有不同的地址?
  • @DanaaMograine:类似的东西,虽然它不返回SDL_Texture,只是一个指向它的指针。是的,这个指针每次都会存储一个不同的地址,因为它指向一个不同的、新分配的SDL_Texture
【解决方案2】:

这一行 int ((SDL_GetTicks() / 100) % 12);

SDL_GetTicks() 返回自 lib 初始化 (https://wiki.libsdl.org/SDL_GetTicks) 以来经过的毫秒数。因此,您更新的是自应用程序启动以来的总时间,而不是自上一帧以来的时间。

您应该记录上次的时间,并根据自上次更新以来经过的时间来更新应用程序。

Uint32 currentTime=SDL_GetTicks();
int deltaTime = (int)( currentTime-lastTime );
lastTime=currentTime; //declared previously

update( deltaTime );
shark();
render();

编辑:本杰明是对的,更新行工作正常。 仍然使用 deltaTime 是一个很好的建议。例如,在游戏中,您不会使用自应用程序开始以来的总时间,您可能需要保留自己的计数器来计算已过去的时间(从开始动画开始)。

但是无论如何,对于您的程序而言,该行没有任何问题。

【讨论】:

  • 我明白你的意思,但奇怪的是它在固定时间后停止工作。
  • 看看本杰明的回答,那可能是内存问题。
  • "这将是一个介于 0 和 11 之间的随机值,具体取决于帧速率。" -- 不,它会给出一个取决于时间量的值那已经过去了。该值将每 100 毫秒递增一次,并每 1.2 秒重置为 0。这条线对我来说似乎是正确的。
猜你喜欢
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多