我目前正在尝试为一个非常基本的游戏引擎实现“加载线程”,该线程负责在主线程继续渲染适当的消息/屏幕,直到操作完成或即使在后台加载较小对象时也要渲染常规游戏场景,例如纹理或音频等内容。
然而,我并不是OpenGL专家,但是当我实现这样一个“加载”机制时,我很快发现OGL不太喜欢从除了创建它的线程之外的线程访问渲染上下文。我搜索了一下,解决方案似乎是:
“在线程上创建第二个渲染上下文,并与主线程的上下文共享”
问题在于,我使用SDL来管理窗口和上下文创建,据我所知,从检查API中无法告诉SDL在它们之间共享上下文。
我得出结论,对于我的情况,最好的解决方案是:
方法A)修改SDL库以支持平台特定函数(wglShareLists()和glXCreateContext())之间的上下文共享
方法B)让“加载线程”仅将数据加载到内存中并处理为OpenGL友好格式,然后传递给主线程,例如负责将纹理上传到图形适配器。当然,这仅适用于需要有效的OpenGL上下文才能完成的数据。
第一个解决方案可能效率最低。我真的不想和SDL搞在一起,除此之外我还读到上下文共享不是高性能操作。所以到目前为止,我的下一步尝试就是第二种方法。
关于“高性能操作”:我读错了文章,它实际上并不那么消耗性能。文章建议将CPU密集型操作移至第二个具有第二个上下文的线程中。对此我表示抱歉。
在这个介绍之后,如果有人能给我以下问题一些提示和评论,我会非常感激:
1)是否有任何方法可以与SDL共享上下文,而且即使这样做是否有好处?
2)是否有其他更“优雅”的方式来在后台加载我的数据,我可能忽略或没有考虑?
3)我选择采用B方法的意图是否被认为是一个好选择?仍然会有OpenGL操作在我的主线程上产生轻微的开销,从而阻塞渲染,或者这很小,可以忽略不计?
然而,我并不是OpenGL专家,但是当我实现这样一个“加载”机制时,我很快发现OGL不太喜欢从除了创建它的线程之外的线程访问渲染上下文。我搜索了一下,解决方案似乎是:
“在线程上创建第二个渲染上下文,并与主线程的上下文共享”
问题在于,我使用SDL来管理窗口和上下文创建,据我所知,从检查API中无法告诉SDL在它们之间共享上下文。
我得出结论,对于我的情况,最好的解决方案是:
方法A)修改SDL库以支持平台特定函数(wglShareLists()和glXCreateContext())之间的上下文共享
方法B)让“加载线程”仅将数据加载到内存中并处理为OpenGL友好格式,然后传递给主线程,例如负责将纹理上传到图形适配器。当然,这仅适用于需要有效的OpenGL上下文才能完成的数据。
第一个解决方案可能效率最低。我真的不想和SDL搞在一起,除此之外我还读到上下文共享不是高性能操作。所以到目前为止,我的下一步尝试就是第二种方法。
关于“高性能操作”:我读错了文章,它实际上并不那么消耗性能。文章建议将CPU密集型操作移至第二个具有第二个上下文的线程中。对此我表示抱歉。
在这个介绍之后,如果有人能给我以下问题一些提示和评论,我会非常感激:
1)是否有任何方法可以与SDL共享上下文,而且即使这样做是否有好处?
2)是否有其他更“优雅”的方式来在后台加载我的数据,我可能忽略或没有考虑?
3)我选择采用B方法的意图是否被认为是一个好选择?仍然会有OpenGL操作在我的主线程上产生轻微的开销,从而阻塞渲染,或者这很小,可以忽略不计?