Linux之SDL2+OpenGL(1),大佬整理

本文介绍了使用EGL库进行OpenGL渲染时的配置过程,包括EGL参数设置和窗口创建,同时提及了Linux运维中的相关知识,如面试题集锦涵盖的技术栈,包括K8s、MySQL、Redis等。

EGL_DEPTH_SIZE, 16,

EGL_STENCIL_SIZE, 0,

EGL_SURFACE_TYPE,

EGL_WINDOW_BIT,

EGL_NONE

};

EGLint numConfigs, majorVersion, minorVersion;

glesWindow = SDL_CreateWindow(“LOR_GLES_DEMO”, 0, 0, screenwidth, screenheight,fullscreen ? (SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN) : SDL_WINDOW_OPENGL);

glDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);

eglInitialize(glDisplay, &majorVersion, &minorVersion);

eglChooseConfig(glDisplay, egl_config_attr, &glConfig, 1, &numConfigs);

SDL_SysWMinfo sysInfo;

SDL_VERSION(&sysInfo.version); // Set SDL version

SDL_GetWindowWMInfo(glesWindow, &sysInfo);

glContext = eglCreateContext(glDisplay, glConfig, EGL_NO_CONTEXT, NULL);

glSurface = eglCreateWindowSurface(glDisplay, glConfig,

(EGLNativeWindowType)sysInfo.info.x11.window, 0); // X11?

eglMakeCurrent(glDisplay, glSurface, glSurface, glContext);

eglSwapInterval(glDisplay, 1);

glClearColor(0.0f, 0.0f, 0.0f, 0.5f);

glClearDepthf(1.0f);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LEQUAL);

glHint(GL_RELATIVE_MOVE_TO_NV, GL_NICEST);

glViewport(0, 0, screenwidth, screenheight);

glMatrixMode(GL_RECT_NV);

glLoadIdentity();

emulateGLUperspective(45.0f, (float) screenwidth / (float) screenheight, 0.1f,

100.0f);

glViewport(0, 0, screenwidth, screenheight);

glMatrixMode(GL_NEVER);

glLoadIdentity();

}

void draw_frame(){

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0.0f, 0.0f, -10.0f);

glRotatef(mCubeRotation, 1.0f, 1.0f, 1.0f);

glFrontFace(GL_CW);

glVertexPointer(3, GL_FLOAT, 0, vertices);

glColorPointer(4, GL_FLOAT, 0, colors);

glEnableClientState(GL_VERTEX_ARRAY_KHR);

glEnableClientState(GL_COLOR_EXT);

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);

glDisableClientState(GL_VERTEX_ARRAY_KHR);

glDisableClientState(GL_COLOR_EXT);

glLoadIdentity();

mCubeRotation -= 0.50f;

}

int main(void){

int loop = 1;

SDL_Event event;

init_GLES();

while (loop) {

while (SDL_PollEvent(&event)) {

switch (event.type) {

case SDL_QUIT: {

loop = 0;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
img

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

l的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-elmg72jZ-1712515617638)]

<think>嗯,我现在要比较SDL2+OpenGL和Qt这两个框架,主要是想了解它们各自的优缺点,以及适用场景。首先,我需要分别了解一下这两个技术栈的基本情况。 SDL2是一个跨平台的多媒体库,主要用于游戏开发、模拟器和多媒体应用程序。它提供了对音频、键盘、鼠标、游戏手柄和图形硬件的低级访问,适合需要直接控制硬件的情况。而OpenGL是一个跨平台的图形API,用于渲染2D和3D图形,通常与SDL2结合使用来处理窗口创建和输入,同时利用OpenGL进行高效的图形渲染。 Qt则是一个跨平台的应用程序开发框架,不仅包含图形用户界面(GUI)工具,还提供了网络、数据库、多线程等模块。Qt的GUI部分基于OpenGL或其他后端(如DirectX),但开发者通常使用Qt提供的高级抽象,而不需要直接处理底层的图形API。 接下来,我需要对比它们的几个关键方面: 1. **图形渲染能力**: - SDL2+OpenGLOpenGL作为底层图形API,提供了极高的灵活性和性能,适合需要复杂图形渲染的应用,比如游戏或3D可视化。开发者可以直接控制渲染管线,优化性能。 - Qt:虽然Qt内部可能使用OpenGL,但提供了更高级的QWidgets和QML,适合传统的GUI应用。对于复杂的3D渲染,Qt Quick 3D模块可能不够灵活,但足够应对一般的需求。 2. **开发复杂度**: - SDL2+OpenGL:需要自己处理窗口管理、输入事件和渲染循环,这对开发者来说需要更多的底层知识,学习曲线较陡峭。 - Qt:提供了信号槽机制、布局管理、现成的UI组件,简化了开发流程,适合快速开发应用,尤其是业务导向的软件。 3. **跨平台支持**: - 两者都支持跨平台,但SDL2+OpenGL可能需要更多平台特定的代码处理,而Qt通过抽象层隐藏了平台差异,使得移植更简单。 4. **功能范围**: - SDL2主要专注于媒体和输入,其他功能如网络可能需要第三方库。而Qt内置了大量模块,适合需要多种功能的应用程序,减少了依赖。 5. **性能考量**: - 在需要极致图形性能的场景下,SDL2+OpenGL可能更优,因为可以更直接地控制渲染细节。Qt的高级抽象虽然方便,但可能会有额外的性能开销。 6. **应用场景**: - SDL2+OpenGL更适合游戏、图形密集型应用,或者需要定制渲染管线的项目。 - Qt适合企业应用、工具软件、需要丰富UI和快速开发的项目。 不过,我可能忽略了一些细节,比如Qt是否允许混合使用OpenGL和其高级组件,或者SDL2与其他库的整合难度。例如,Qt确实有Qt OpenGL模块,允许开发者直接使用OpenGL进行渲染,这可能在需要时提供更多的灵活性。同时,SDL2虽然需要自己管理更多底层细节,但社区中有许多库和工具可以辅助开发,比如物理引擎、音频处理库等。 另外,对于维护和社区支持,Qt作为成熟的商业框架,拥有广泛的文档和企业支持,而SDL2虽然社区活跃,但可能更多依赖于开源社区的支持。这对于长期项目的维护可能是一个考虑因素。 最后,性能测试可能会有不同结果,具体取决于应用的具体需求。例如,如果应用需要复杂的UI动画,Qt的QML可能更高效;而如果是实时渲染大量3D对象,SDL2+OpenGL的组合可能更合适。</think>### SDL2 + OpenGL 与 Qt 对比分析 #### 1. **核心定位与功能** - **SDL2 + OpenGL** - **定位**:专注于底层硬件控制和图形渲染。 - **功能**: - SDL2 提供窗口管理、输入事件处理、音频播放等基础功能。 - OpenGL 负责高性能图形渲染(2D/3D),支持直接操作 GPU 管线。 - **适用场景**:游戏引擎、实时仿真、科学可视化等对性能要求极高的领域。 - **Qt** - **定位**:全栈式应用开发框架,强调快速构建跨平台 GUI 应用。 - **功能**: - 提供 UI 组件(QWidgets、QML)、网络、数据库、多线程等模块。 - 内置 OpenGL 抽象层(如 `QOpenGLWidget`),可通过高级 API 间接使用图形硬件。 - **适用场景**:企业级软件、工业控制界面、嵌入式系统 UI 等。 --- #### 2. **开发复杂度对比** - **SDL2 + OpenGL** - **优点**: - 完全掌控渲染流程,可深度优化性能(例如批处理、自定义着色器)。 - 适合需要手动管理内存、线程、事件循环的硬核项目。 - **缺点**: - 需自行实现 UI 组件(按钮、文本框等),开发效率低。 - 学习曲线陡峭,需熟悉 OpenGL 管线、GLSL 语言及图形学基础。 - **Qt** - **优点**: - 声明式 UI 设计(QML)与可视化工具(Qt Designer)大幅提升开发速度。 - 信号槽机制简化事件处理,避免回调地狱。 - **缺点**: - 高级抽象可能限制底层优化(如无法绕过 Qt 的事件循环)。 - 若需定制渲染逻辑,需深入理解 Qt 的 OpenGL 封装层。 --- #### 3. **性能与灵活性** - **渲染性能** - **SDL2 + OpenGL**: - 直接调用 OpenGL/DX/Vulkan API,可榨取硬件极限性能。 - 例:实时渲染百万级多边形场景时,帧率显著优于 Qt。 - **Qt**: - 默认使用平台原生绘图后端(如 Core Graphics on macOS),若需高性能需依赖 `QOpenGLWidget`。 - 复杂 UI 动画可能因渲染层级叠加导致性能下降。 - **灵活性** - **SDL2 + OpenGL**: - 可自由集成第三方库(如 Bullet 物理引擎、FFmpeg 视频解码)。 - 支持多窗口、多上下文,适合复杂应用架构。 - **Qt**: - 强耦合的模块设计(如必须使用 Qt 的网络模块),可能增加技术债。 - 若需突破框架限制(如自定义窗口管理器),需修改 Qt 源码或绕过其 API。 --- #### 4. **跨平台支持** - **SDL2 + OpenGL** - **一致性**:需处理不同平台下 OpenGL 驱动差异(如 macOS 仅支持 OpenGL 4.1)。 - **移植成本**:输入、音频等模块可能需要条件编译(`#ifdef __linux__`)。 - **Qt** - **抽象层**:通过 `QPA`(Qt Platform Abstraction)隐藏平台细节,一套代码适配多平台。 - **痛点**:部分平台特性(如 Windows 的 DirectManipulation)可能未完全封装。 --- #### 5. **典型应用案例** - **SDL2 + OpenGL** - 游戏:《Hollow Knight》(2D 像素游戏)、《Dolphin 模拟器》(3D 图形)。 - 工具:OBS Studio(视频采集与渲染)。 - **Qt** - 工业软件:Autodesk Maya(插件 UI)、Wireshark(网络协议分析)。 - 消费级应用:Spotify 桌面客户端、VirtualBox 管理界面。 --- #### 6. **选型建议** - **选择 SDL2 + OpenGL 若**: - 项目是图形密集型应用(如游戏、CAD)。 - 需要绝对控制权(如自定义内存分配、多线程渲染)。 - 团队具备图形学开发经验。 - **选择 Qt 若**: - 需求以业务逻辑和 UI 交互为主(如数据管理软件)。 - 追求快速迭代和跨平台一致性。 - 需减少第三方依赖(Qt 已集成数据库、网络等模块)。 --- #### 7. **混合使用方案** - **Qt 为主 + OpenGL 增强**: 使用 `QOpenGLWidget` 嵌入自定义渲染代码,兼顾 UI 效率与图形性能。 ```cpp class MyGLWidget : public QOpenGLWidget { protected: void initializeGL() override { /* 初始化 OpenGL */ } void paintGL() override { /* 渲染代码 */ } }; ``` - **SDL2 窗口嵌入 Qt**: 通过 `QWindow::fromWinId()` 将 SDL2 窗口句柄植入 Qt 界面,但可能引发事件循环冲突。 --- ### 总结 - **SDL2 + OpenGL** 是“从零造轮子”的利器,适合追求极致性能或特殊需求的项目。 - **Qt** 是“开箱即用”的全能框架,显著降低开发成本,适合大多数 GUI 应用。 - **关键取舍**:性能控制权 vs 开发效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值