gpt4 book ai didi

c++ - 加载图形内容的线程

转载 作者:太空狗 更新时间:2023-10-29 12:34:22 25 4
gpt4 key购买 nike

我正在创建游戏引擎。在 Windows 上,我有两个线程和两个共享的上下文(使用 wglShareLists)。它运作良好。当一个线程加载资源时,另一个线程正在渲染简单的加载屏幕。在 Linux 上没有 WGL,只有 glX。我不知道如何正确使用它。目前我的线程代码如下所示:

LinuxThread::LinuxThread() :
handle_(0),
running_(false),
task_(0),
useGraphicsContext_(0),
threadContext_(0),
threadDrawable_(0),
dsp_(0)
{
}

LinuxThread::~LinuxThread() {
finishTask();
running_ = false;
glXDestroyContext(dsp_, threadContext_);
}

ULONG LinuxThread::getId() {
return static_cast<ULONG>(handle_);
}

void LinuxThread::start() {
running_ = true;
pthread_create(&handle_, 0, &LinuxThread::staticRun, (void*) this);
}

bool LinuxThread::isRunning() {
return running_;
}

void LinuxThread::setGraphicsContext(bool state) {
if (state) {
Display* dsp = XOpenDisplay(0);
threadDrawable_ = glXGetCurrentDrawable();
GLint att[] = { GLX_RGBA, None };
XVisualInfo* vi = glXChooseVisual(dsp, 0, att);
GLXContext glc = glXGetCurrentContext();
bool directlyToScreen = true; // False for x-server display.
threadContext_ = glXCreateContext(dsp, vi, glc, directlyToScreen);
}
useGraphicsContext_ = state;
}

void LinuxThread::setTask(Task* task) {
// if (useGraphicsContext_) {
// task->run();
// delete task;
// return;
// }
finishTask();
task_ = task;
}

bool LinuxThread::hasTask() {
return task_ != 0;
}

void LinuxThread::finishTask() {
while (task_ != 0) {
usleep(1000);
}
}

void LinuxThread::stop() {
running_ = false;
}

void* LinuxThread::staticRun(void* thread) {
return (void*) ((LinuxThread*) thread)->run();
}

int LinuxThread::run() {
while (running_) {
usleep(10000);
if (task_ != 0) {
if (useGraphicsContext_) {
glXMakeCurrent(dsp_, threadDrawable_, threadContext_);
}
task_->run();
if (useGraphicsContext_) {
glFinish();
glXMakeCurrent(dsp_, 0, 0);
}
delete task_;
task_ = 0;
}
}
return 1;
}

它崩溃并显示如下错误消息:

nouveau: kernel rejected pushbuf: No such file or directory
nouveau: ch6: krec 0 pushes 1 bufs 14 relocs 0
nouveau: ch6: buf 00000000 00000002 00000006 00000006 00000000
nouveau: ch6: buf 00000001 00000010 00000002 00000002 00000000
nouveau: ch6: buf 00000002 0000000f 00000002 00000002 00000002
nouveau: ch6: buf 00000003 0000000e 00000002 00000000 00000002
nouveau: ch6: buf 00000004 00000007 00000002 00000002 00000002
nouveau: ch6: buf 00000005 0000000a 00000002 00000002 00000000
nouveau: ch6: buf 00000006 0000000b 00000002 00000002 00000000

我做错了什么?

最佳答案

我看不到具体的问题根源,但线程代码使事情变得很复杂。站在你的立场上,我会:

  1. 尝试在运行前设置 LIBGL_ALWAYS_SOFTWARE=y,以确保您没有在 nouveau 驱动程序中遇到问题。 (这将使用内部 Mesa 软件渲染器。)
  2. 将您的共享代码提取到一个线程中,确保它可以正常工作,然后尽可能简单地将已知的工作代码移回多个线程。

关于c++ - 加载图形内容的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com