gpt4 book ai didi

c - sdl2 从 Linux 和 Windows 上的不同线程绘制

转载 作者:太空宇宙 更新时间:2023-11-04 04:27:58 26 4
gpt4 key购买 nike

我用 SDL2 进行了一些非常简单的绘图,这些绘图在 Windows 下运行得很好,但现在我已经将它移植到 Linux 上,而不是从我生成的不同线程中绘图。

我正在使用互斥量控制对渲染器的访问。

函数按预期处理和输出日志记录,唯一似乎不起作用的是渲染器从不更新 Linux 下的显示。

如果我注释掉线程,并从 main 运行函数,我会得到预期的结果。代码在 Linux 和 Windows 版本之间没有变化。

代码在 -wall 和 -pedantic 下编译时没有警告。自从我开始使用 Linux 进行编译以来,我添加了 -pthread 标志以备不时之需(没有任何区别)。

如果有人知道任何问题或者可能知道为什么这不起作用,那你就是帮了我一个大忙。

        static int thread_processing(void* data) 
{
srand(time(NULL)); //randomize

ThreadData *td = data;
Bucket *bucket;
int b_Id = -1;

Color threadColor;
//unique color for each respective thread
color_randomize(&threadColor);
threadColor.a = 255;

fprintf(stderr, "%d Buckets to process..\n", td->bArray->size);
while (1) {
//check there are buckets left to process
if (td->bArray->rendered >= td->bArray->size)
break;

//acquie/lock access to bucket array
SDL_LockMutex(td->b_mutex);

//retrieve buucket id to process
b_Id = td->bArray->rendered;
td->bArray->rendered++;

fprintf(stderr, "Rendering bucket: %d\n", b_Id);
//release access to bucket array
SDL_UnlockMutex(td->b_mutex);

//retrieve addr of bucket to process
bucket = &(td->bArray->buckets[b_Id]);

//lock access to renderer
SDL_LockMutex(td->r_mutex);

//draw rect on screen where bucket will be processed
draw_bucketOutline(td->renderer, bucket, &threadColor);
SDL_RenderPresent(td->renderer);

//release access to renderer object
SDL_UnlockMutex(td->r_mutex);

//process the bucket
process_bucket(td->scene, bucket);

//acquire/lock acess to renderer object
SDL_LockMutex(td->r_mutex);

//draw the processed data ot the screen
draw_bucket(td->renderer, bucket);
SDL_RenderPresent(td->renderer);

//release access to renderer object
SDL_UnlockMutex(td->r_mutex);
}

return 0;
}

void draw_bucketOutline(SDL_Renderer *renderer, Bucket *b, Color *color)
{
//set the colour of the outline
SDL_SetRenderDrawColor(renderer, 125, 125, 125, 255);

//set the outline position
SDL_Rect rect;
rect.w = b->resolution.width;
rect.h = b->resolution.height;
rect.x = b->start.x;
rect.y = b->start.y;

//draw the outline
SDL_RenderDrawRect(renderer, &rect);

//crop rectangle inwards for filling inside of outline
rect.w -= 2;
rect.h -= 2;
rect.x += 1;
rect.y += 1;

//set colour for fill area
SDL_SetRenderDrawColor(renderer, color->r, color->g, color->b, color->a);

//draw fill area
SDL_RenderFillRect(renderer, &rect);
}

主要.....

//iterate over threads, do the processing
int t;
for (t = 0; t < THREAD_COUNT; t++) {
threads[t] = SDL_CreateThread(thread_processing, NULL, &td);
}

//iterate over threads, clean them up
for (t = 0; t < THREAD_COUNT; t++) {
int status;
SDL_WaitThread(threads[t], &status);
}

编译

gcc -Wall -pedantic -lm -I/usr/include/SDL2 -D_REENTRANT -lX11 -pthread raytracer.c -lSDL2 -o raytracer

最佳答案

Linux 上的 SDL2 使用 OpenGL 加速渲染(它在 Windows 上默认为 d3d 加速),并且 OpenGL 具有线程本地上下文。您不能在不同的线程中使用相同的 GL 上下文。你必须在单线程中渲染,例如通过将渲染命令放入队列,然后在渲染线程中重播它们。还有你shouldn't have used multiple rendering threads首先。

关于c - sdl2 从 Linux 和 Windows 上的不同线程绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39641682/

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