Files
Radio/opengl架构设计.txt
T
2026-06-16 13:38:08 +08:00

61 lines
2.4 KiB
Plaintext

技术采用opengl es3.2
首先不是修改旧有的QWidget,而是兼容旧有的机制,弄新的。
新的机制使用QPainter和QWidget混用,有两种方式,
一是继续使用QWidget,使用opengl是opengl渲染完了之后,读取像素,最后还是通过QWidget的QPainter去绘制,
这个Qt有现成的实现,甚至opengl的代码都不用写,绘图设备换成opengl的绘图设备,参考QCustomplot的实现,
二是直接绘制在QWidget上,把QPainter的渲染结果给opengl,
所有图层给opengl去渲染
一的话Qt有现成的实现,二性能会更高,所以采用方式二
那样渲染的流程就变成了,首先cpu传用户数据给显卡,让显卡渲染数据,然后QPainter渲染数据,传输给GPU。这些操作全异步,
这些操作全部完成后,存在于GPU的各个纹理中,然后然后按照既定顺序,绘制到QWindow上,QWindow包上一层QWidget去给外部使用
同步问题
先把GPU图层需要的数据都传给GPU,使用glFlush异步GPU渲染,使用同步对象,紧接着CPU渲染完,传入给纹理 glFlush使用同步对象,然后两个同步对象都返回
就执行合并opengl指令glFlush
先把GPU图层需要的数据都传给GPU,使用glFlush异步GPU渲染,使用同步对象,紧接着CPU渲染完,Pixel Buffer Objects (PBOs) 用于异步传输像素数据
传入给纹理 glFlush使用同步对象,然后两个同步对象都返回 就执行合并opengl指令glFlush
一个图分为不同的图层,有两种,一种是GPU根据CPU传来的数据做渲染的叫GPU图层,一种是CPU渲染的通过纹理传进来的CPU图层
图层在混合时以纹理的形式混合。
我的方案是,CPU传纹理都是异步传输使用Pixel Buffer Objects (PBOs),传入给GPU端,这部分采用双缓冲,GPU渲染时把传来的纹理复制
到新的纹理上,这部分加锁(GPU层面上的),然后渲染自己所有的GPU图层,然后混合图层
延迟帧技术
工作流程 先写架构 整体采用纯函数的形式
void createTexture(int& textureId);
void giveToTexture(int textureId, int syncId, void* data, int w, int h);
RenderAble.draw(int textureId);
void wait(int syncId);
// 采用这种方案
先把GPU图层需要的数据都传给GPU,使用glFlush异步GPU渲染,使用同步对象,紧接着CPU渲染完,传入给纹理 glFlush使用同步对象,然后两个同步对象都返回
就执行合并opengl指令glFlush