C++ OpenGL中的多线程功能

C++ OpenGL中的多线程功能,c++,opengl,C++,Opengl,我无法为我的OpenGL应用程序实现多线程功能。我正在尝试在不延迟应用程序中的视频帧的情况下同时渲染多个视频。我的代码如下 AppData data[4]; std::vector<VideoRender*>videolayer; VideoRender* videovector = NULL; Sprite_Renderer *Renderer; 您可以看到,在我的应用程序中渲染视频是一种序列功能,运行“播放视频”非常缓慢且效率低下。然而,视频帧质量

我无法为我的OpenGL应用程序实现多线程功能。我正在尝试在不延迟应用程序中的视频帧的情况下同时渲染多个视频。我的代码如下

   AppData data[4];
   std::vector<VideoRender*>videolayer;
   VideoRender* videovector = NULL;


   Sprite_Renderer  *Renderer;
您可以看到,在我的应用程序中渲染视频是一种序列功能,运行“播放视频”非常缓慢且效率低下。然而,视频帧质量和原始视频相同,但渲染速度比原始视频文件慢。如何为readFrame实现多线程处理,以快速渲染视频,而不延迟帧

我也很累

  std::thread first(&EVTVideo::paravideo, this);
first.join();

void EVTVideo::paravideo(){
    videovector->readFrame(&data[0]);
    Renderer->DrawSprite(* ResourceManager::GetTexture("MatchSideBackGrounds"),
                         glm::vec2(0, 0), glm::vec2(this->Width, this->Height), 0.0f
    );
    std::cout << "From Thread ID 1 : "<<std::this_thread::get_id() << "\n";
}
std::线程优先(&EVTVideo::paravideo,this);
首先,join();
void EVTVideo::paravideo(){
videovector->readFrame(&data[0]);
渲染器->DrawSprite(*ResourceManager::GetTexture(“MatchSideBackGrounds”),
glm::vec2(0,0),glm::vec2(此->宽度,此->高度),0.0f
);
标准::cout
CUDA是一个并行计算平台和应用程序编程
由Nvidia创建的接口模型。它允许软件开发人员和
软件工程师使用支持CUDA的图形处理单元
通用处理–一种称为GPGPU的方法

这是在OpenGL中并行渲染多个对象的解决方案。

一般来说,如果你想从多个线程使用OpenGL,你将不得不使用多个上下文。但是如果GPU性能是瓶颈,我高度怀疑多线程处理是否能获得更好的性能,因为GPU仍然是一个单一资源,如果从多个CPU线程使用,就不能做更多的工作。如果CPU是现在的问题是,你应该重新设计你的问题,以反映这一点,并显示出使用CPU太多的相关部分。你的问题太广泛了,无法真正给你一个有意义的答案。但除此之外,多线程和OpenGL并不是很好地工作。如果你想从多个线程调用OpenGL函数,每个线程都需要要拥有自己的上下文,您需要在它们之间共享数据。这会带来巨大的开销+复杂性的增加,因此在大多数情况下都不值得付出努力。大多数使用OpenGL的应用程序将所有api调用留给专用于它的一个线程。我建议您不要陷入兔子洞。@Eric这是一个错误令人失望的是,多线程和OpenGL并不能很好地工作。我如何能同时渲染多个视频?这很困难,但并非不可能做到。@Eric如果动态编程或缓存算法能够解决这个问题呢?
effect->BeginRender();

//video 1
 videovector->readFrame(&data[0]);
    Renderer->DrawSprite(* ResourceManager::GetTexture("MatchSideBackGrounds"),
                         glm::vec2(0, 0), glm::vec2(this->Width, this->Height), 0.0f
    );

//video 2
 videovector->readFrame(&data[1]);
    Renderer->DrawSprite(* ResourceManager::GetTexture("MatchSideBackGrounds"),
                         glm::vec2(0, 0), glm::vec2(this->Width, this->Height), 0.0f
    );

 effect->EndRender();
  std::thread first(&EVTVideo::paravideo, this);
first.join();

void EVTVideo::paravideo(){
    videovector->readFrame(&data[0]);
    Renderer->DrawSprite(* ResourceManager::GetTexture("MatchSideBackGrounds"),
                         glm::vec2(0, 0), glm::vec2(this->Width, this->Height), 0.0f
    );
    std::cout << "From Thread ID 1 : "<<std::this_thread::get_id() << "\n";
}