c++ - 在两个不同的线程(解决方案中没有线程)中使用 SDL2-render 显示两个或多个不同的动画。 C++

标签 c++ linux multithreading animation

我试图展示用两个函数制作的两个不同的动画,一个渲染和两个线程。

我每次运行代码时都会遇到不同类型的错误。 如:刷新函数中的分段默认值(行SDL_RenderPresent(w1.renderer);)和其他奇怪的错误。每次都不一样。

我知道在两个不同的线程中使用渲染。但是我不知道如何解决这个问题。

当我只使用其中一个线程运行时,一切正常。但不是他们两个。

我只想显示在窗口周围播放的不同图形。 (总是使用 sdl2)。

这是我的代码:

窗口.h:

class Window
{
public:
SDL_Window *window1;
int background,windowWidth,windowHeight,windowXcoord,windowYcoord;
SDL_Renderer * renderer;
SDL_Renderer * renderer2;
Window();
};

void refresh();
extern Window w1;

窗口.cpp:

Window w1;
Window::Window()
{
window1=nullptr;
background = 0xffffff;
windowWidth=700;      windowHeight=500;
windowXcoord = 650;  windowYcoord = 0;

this->window1 = 
SDL_CreateWindow("Window",windowXcoord,windowYcoord, 
windowWidth,windowHeight, SDL_WINDOW_SHOWN);
  this->renderer =  SDL_CreateRenderer( this->window1, -1 ,  
SDL_RENDERER_ACCELERATED);

SDL_SetRenderDrawColor( this->renderer, 255, 255, 255, 255 );
SDL_RenderClear( this->renderer );
SDL_RenderPresent(this->renderer);
}

// this function is called everytime an object or function want to "refresh" the window.

void refresh(){

// clearing the window
  SDL_SetRenderDrawColor( w1.renderer, 255, 255, 255,0 );
  SDL_RenderClear( w1.renderer );

// r1, the first Rects object to animate.
  SDL_SetRenderDrawColor( w1.renderer,255,0,0,255);
  SDL_RenderFillRect( w1.renderer, &r1.rect );

// r2, the second Rects.
  SDL_SetRenderDrawColor( w1.renderer,255,0,255,255);
  SDL_RenderFillRect( w1.renderer, &r2.rect );
  SDL_RenderPresent(w1.renderer);
}

rects.h:

class Rects
{
public:
SDL_Rect rect;

Rects();
};
extern Rects r1, r2;

void moveR1();
void moveR2();

rect.cpp:

Rects::Rects()
{ }
Rects r1,r2;

// moveR1 and moveR2, (just some dumm animations-example)
void moveR1(){
r1.rect.x=400; r1.rect.y=100;
r1.rect.w =40; r1.rect.h =10;
SDL_SetRenderDrawColor( w1.renderer,255,0,0,255);
SDL_RenderFillRect( w1.renderer, &r1.rect );
{
for (int u = 1; u<=5;u++){
r1.rect.x=200; r1.rect.y=100;
r1.rect.w =50; r1.rect.h =50;
refresh();
for (int i = 1; i <=200; i++){

r1.rect.x-=1;
usleep (7000);
refresh();
}
}
}
}
void moveR2(){
  r2.rect.x=200; r2.rect.y=100;
  r2.rect.w =40; r2.rect.h =10;
  SDL_SetRenderDrawColor( w1.renderer,255,255,0,255);
  SDL_RenderFillRect( w1.renderer, &r2.rect );
  {
     for (int u = 1; u<=5;u++){
           check
           r2.rect.x=200; r2.rect.y=100;
           r2.rect.w =50; r2.rect.h =50;
           refresh();
           for (int i = 1; i <=200; i++){

                 r2.rect.x+=1; r2.rect.y+=1;
                 usleep (7000);
              refresh();
              }
        }
  }
}

和主要的:

int main()
{
  thread t1(moveR1);
  t1.detach();

  thread t2(moveR2);
  t2.detach();

  // sleep instead of showing a loop.

  sleep (10);

  return 0; 
}

欢迎任何礼貌的帮助,我是来学习的。

最佳答案

When i run with just one of the threads everything its ok. But not with the two of them.

根据documentation对于 2D 加速渲染(也称为 SDL_render.h,换句话说就是 SDL_RenderPresent 所在的位置):

This API is not designed to be used from multiple threads, see SDL bug #1995 for details.

您很快就无法做到这一点。通过查看错误的描述,它看起来像一个 UB,错误的链接可能为您提供了所有详细信息。

I just want to show different graphics playing around the window.

你不需要使用两个线程来做到这一点。
您可以只更新位置、动画和图形所需的任何内容,并从同一个线程中显示它们。没有什么能阻止您在调用 SDL_RenderPresent 之前多次调用相同的函数(例如 SDL_RenderCopy)。
如果每个图形都需要一个线程,那么视频中有数千个多边形的游戏呢?

关于c++ - 在两个不同的线程(解决方案中没有线程)中使用 SDL2-render 显示两个或多个不同的动画。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46230485/

相关文章:

c++ - 替代 C++ 编译器?

c++ - 如何在 ASCII 艺术中匹配 ASCII 艺术片段?

linux - 使用 ncftp 从远程 ftp 删除超过 7 天的备份

java - 我们应该如何在java多线程代码中使用JPMML评估器的modelEvaluator?

c++ - QObject::connect: 无法对类型为 'QVector<int>' 的参数进行排队

c++ - C++ : "expected primary-expression before ‘>’ token"中的两个模板

linux - Team City“最小构建代理” Docker镜像-“npm:未找到” Linux问题?

linux - Linux Red HAT 中可能的用户智能时区

javascript - 如何同时发布多个axios请求?

c++ - 如何检查系统上是否安装了特定的网络浏览器?