SDL2从OSX上的不同线程创建纹理

多诺万

我正在尝试在用于加载屏幕的单独线程中加载SDL2程序的纹理。我的代码看起来像这样

int batchLoad(void *ptr) {
loop through resources
    SDL_LockMutex(renderMutex);

        SDL_Texture *texture = NULL;

    SDL_Surface *surface = IMG_Load(("../resources/" + fileName).c_str());
    if (surface) {
    texture = SDL_CreateTextureFromSurface(renderer, surface);
    SDL_FreeSurface(surface);
    }
    SDL_UnlockMutex(renderMutex);

        // store texture

return 0;
}

void LoadingScreen::loadResources() {
// do some stuff

renderMutex = SDL_CreateMutex();

ScreenMap screenMap;
    // init with data
    SDL_Thread* load = SDL_CreateThread(batchLoad, "batchLoad", &screenMap);

while loading {
    // do work

    SDL_LockMutex(renderMutex);

    SDL_RenderClear(renderer);
    SDL_RenderCopy(renderer, white, NULL, NULL);

    // draw stuff

    SDL_RenderPresent(renderer);
    SDL_UnlockMutex(renderMutex);
}

SDL_WaitThread(load, NULL);
SDL_DestroyMutex(renderMutex);
SDL_DestroyMutex(satMutex);

在Windows上,这工作得很好,但是在OSX上,CreateTextureFromSurface调用出现错误。它使用空指针错误进行段错误处理。这是osx问题报告。

Thread 10 Crashed:: batchLoad
0   libGL.dylib                     0x00007fff885ead32 glGenTextures + 18

Thread 10 crashed with X86 Thread State (64-bit):
rax: 0x0000000000000000  rbx: 0x00007ff913c37ad0  rcx: 0x0000000000000001  rdx: 0x00007ff913c37b50
rdi: 0x0000000000000001  rsi: 0x00007ff913c37b50  rbp: 0x00000001157ae4d0  rsp: 0x00000001157ae4d0
r8: 0x0000000000000004   r9: 0x00007ff913c00000  r10: 0x0000000023f4e094  r11: 0x000000000abea012
r12: 0x00007ff913d1e3b0  r13: 0x00007ff913d1e3b0  r14: 0x000000000000001a  r15: 0x0000000000000022
rip: 0x00007fff885ead32  rfl: 0x0000000000010246  cr2: 0x0000000000000000

和lldb

* thread #9: tid = 0xee08, 0x00007fff885ead32 libGL.dylib`glGenTextures + 18, name = 'batchLoad', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00007fff885ead32 libGL.dylib`glGenTextures + 18
libGL.dylib`glGenTextures + 18:
-> 0x7fff885ead32:  movq   (%rax), %rdi
   0x7fff885ead35:  movq   0x318(%rax), %rax
   0x7fff885ead3c:  movl   %ecx, %esi
   0x7fff885ead3e:  popq   %rbp

当我注释掉所有线程内容并正常调用批处理加载时,没有错误,因此我认为必须存在一些并发问题。但是我对所有的渲染器调用都使用了互斥锁,所以我不确定可能是什么问题。然后我也不知道为什么它在Windows上可以正常工作,但在OSX上却不能正常工作

闪光熊

由于OpenGL与多线程相关的规则,因此渲染器API不能从多个线程中调用(无论是否进行了任何锁定)。在CategoryRender页面上提到了此警告,并且有指向错误报告的链接,您可以在其中阅读有关为什么这样做以及如何解决它的更多详细信息。

最简单的解决方法是将表面加载到某些背景线程上,然后将其移交给渲染器线程以加载到纹理中。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SDL2 /表面/纹理/渲染

来自分类Dev

在Linux上安装SDL2

来自分类Dev

从概念上讲,SDL2中的渲染器和纹理是什么?

来自分类Dev

SDL2不同线程中的两个窗口

来自分类Dev

SDL2不使用纹理绘制图像

来自分类Dev

SDL2是否自动创建线程?

来自分类Dev

从SDL2表面创建OpenGL纹理-奇怪的像素值

来自分类Dev

重新着色SDL2纹理

来自分类Dev

Rx在不同线程上产生和消耗

来自分类Dev

(Py)SDL2:绘制带纹理的多边形

来自分类Dev

如何在不同线程上同步部分方法

来自分类Dev

SDL2:SDL_GetMouseState()线程安全吗?

来自分类Dev

链接SDL2在OSX上发出无数个链接错误

来自分类Dev

SDL2 2D纹理分配/池化

来自分类Dev

如何在MacOS上使用SDL2创建窗口

来自分类Dev

如何在SDL2中显示OpenGL纹理

来自分类Dev

在xCode上安装SDL2

来自分类Dev

不同对象,不同线程上的同步方法

来自分类Dev

从概念上讲,SDL2中的“渲染器和纹理”是什么?

来自分类Dev

SDL2不同线程中的两个窗口

来自分类Dev

在不同线程上的accept()错误10093

来自分类Dev

如何在SDL2中旋转纹理?

来自分类Dev

是文件系统在javascript中的不同线程上运行

来自分类Dev

在不同线程上完成NSOperation

来自分类Dev

链接SDL2在OSX上发出无数个链接错误

来自分类Dev

SDL2纹理更新速度

来自分类Dev

iOS SDL2 OpenGL ES无法绘制纹理

来自分类Dev

无法使用SDL_PIXELFORMAT_NV12像素格式创建SDL2纹理

来自分类Dev

在 Raspberry Pi 2 上使用多线程进行 SDL2 渲染