惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
S
Secure Thoughts
月光博客
月光博客
美团技术团队
雷峰网
雷峰网
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Forbes - Security
Forbes - Security
W
WeLiveSecurity
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志
爱范儿
爱范儿
G
GRAHAM CLULEY
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
AI
AI
Last Week in AI
Last Week in AI
Google Online Security Blog
Google Online Security Blog
Schneier on Security
Schneier on Security
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
N
News and Events Feed by Topic
罗磊的独立博客
The Register - Security
The Register - Security
Blog — PlanetScale
Blog — PlanetScale
T
Threat Research - Cisco Blogs
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理
T
The Exploit Database - CXSecurity.com
www.infosecurity-magazine.com
www.infosecurity-magazine.com
B
Blog
腾讯CDC
Microsoft Azure Blog
Microsoft Azure Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Engineering at Meta
Engineering at Meta
Latest news
Latest news
IT之家
IT之家
D
DataBreaches.Net
博客园 - 司徒正美
N
Netflix TechBlog - Medium
V
V2EX
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

元视角

.NET 生态下的 Agent 框架选型:从 ReAct 到原生推理 - 元视角 从「能用」到「好用」:LLM 流式响应实现方式的探索之路 - 元视角 当我用 2000 条聊天记录,让 AI 为我画一幅自画像 - 元视角 基于 Supabase 的 AI 应用开发探索 - 元视角 微博 × MCP:社交媒体新玩法解锁 - 元视角 四点钟海棠花未眠 - 元视角 Semantic Kernel × MCP:智能体的上下文增强探索 - 元视角 基于 K-Means 聚类分析实现人脸照片的快速分类 - 元视角 容器技术驱动下的代码沙箱实践与思考 - 元视角 温故而知新:后端通用查询方案的再思考 - 元视角 浅议 CancellationToken 在前后端协同取消场景中的应用 - 元视角 Semantic Kernel 视角下的 Text2SQL 实践与思考 - 元视角 关于 ChatGPT 的流式传输,你需要知道的一切 - 元视角 RAG 的是与非、Rewrite 和 Rerank - 元视角 使用 EFCore 和 PostgreSQL 实现向量存储及检索 - 元视角 基于 LLaMA 和 LangChain 实践本地 AI 知识库 - 元视角 使用 llama.cpp 在本地部署 AI 大模型的一次尝试 - 元视角 如何为 Git 配置多个 SSH Key - 元视角 C# 使用 LibUsbDotNet 实现 USB 设备检测 - 元视角 基于 C# 实现样式与数据分离的打印方案 - 元视角 基于 SVG 的图形交互方案实践 - 元视角 前端视频播放技术概览 - 元视角 温故而知新,再话 Python 动态导入 - 元视角 后 GPT 时代,NLP 不存在了? - 元视角 视频是不能 P 的系列:使用 Milvus 实现海量人脸快速检索 - 元视角 GDI+下字体大小自适应方案初探 - 元视角 小爱音箱集成 ChatGPT 的不完全教程 - 元视角 程序员视角下的三体世界随想 - 元视角 关于 Docker 容器配置信息的渐进式思考 - 元视角 在 Docker 容器内集成 Crontab 定时任务 - 元视角 为你的服务器集成 LDAP 认证 - 元视角 似花还似非花 - 元视角 视频是不能 P 的系列:使用 Dlib 实现人脸识别 - 元视角 浅议分布式链路追踪与日志的整合 - 元视角 关于 Git 大文件上传这件小事 - 元视角 .NET 进程内队列 Channel 的入门与应用 - 元视角 使用 Fody 实现 .NET 的静态编织 - 元视角 .NET Core + ELK 搭建可视化日志分析平台(下) - 元视角 聊一聊前端图片懒加载背后的故事 - 元视角 支持外部链接跳转的 Vue Router 扩展实现 - 元视角 视频是不能 P 的系列:OpenCV 和 Dlib 实现表情包 - 元视角 不得不说的 ASP.NET Core 集成测试 - 元视角 再议 DDD 视角下的 EFCore 与 领域事件 - 元视角 Vue.js 前端项目容器化部署实践极简教程 - 元视角 再见,人间四月天 - 元视角 Python 图像风格化迁移助力画家梦想 - 元视角 利用 ASP.NET Core 中的标头传播实现分布式链路追踪 - 元视角 利用 gRPC 实现文件的上传与下载 - 元视角 七种武器:延迟队列的原理和实现总结 - 元视角 gRPC 流式传输极简入门指南 - 元视角 Envoy 集成 Jaeger 实现分布式链路追踪 - 元视角 浅议非典型 Web 应用场景下的身份认证 - 元视角 gRPC 借助 Any 类型实现接口的泛化调用 - 元视角 分布式丛林探险系列之 Redis 集群模式 - 元视角 分布式丛林探险系列之 Redis 主从复制模式 - 元视角 通过 Python 预测 2021 年双十一交易额 - 元视角 gRPC 搭配 Swagger 实现微服务文档化 - 元视角 SSL/TLS 加密传输与数字证书的前世今生 - 元视角 使用 Python 自动识别防疫健康码 - 元视角 你不可不知的容器编排进阶技巧 - 元视角 ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理 - 元视角 再话 AOP,从简化缓存操作说起 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务身份认证(JWT) - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的监控预警 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的反向代理 - 元视角 ASP.NET Core gRPC 打通前端世界的尝试 - 元视角 EFCore 实体命名约定库:EFCore.NamingConventions - 元视角 ASP.NET Core gRPC 集成 Polly 实现优雅重试 - 元视角 ASP.NET Core gRPC 健康检查的探索与实现 - 元视角 ASP.NET Core gRPC 拦截器的使用技巧分享 - 元视角 SnowNLP 使用自定义语料进行模型训练 - 元视角 使用 HttpMessageHandler 实现 HttpClient 请求管道自定义 - 元视角 ABP vNext 的实体与服务扩展技巧分享 - 元视角 ABP vNext 对接 Ant Design Vue 实现分页查询 - 元视角 源代码探案系列之 .NET Core 跨域中间件 CORS - 元视角 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit - 元视角 源代码探案系列之 .NET Core 并发限制中间件 ConcurrencyLimiter - 元视角 通过 EmbededFileProvider 实现 Blazor 的静态文件访问 - 元视角 低代码,想说爱你不容易 - 元视角 记一次失败的 ThoughtWorks 面试经历 - 元视角 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览 - 元视角 通过 Python 分析 2020 年全年微博热搜数据 - 元视角 基于 Python 和 Selenium 实现 CSDN 一键三连自动化 - 元视角 使用多线程为你的 Python 爬虫提速的 N 种姿势,你会几种? - 元视角 实现网页长截图的常见思路总结 - 元视角 温故而知新,由 ADO.NET 与 Dapper 所联想到的 - 元视角 视频是不能 P 的系列:OpenCV 人脸检测 - 元视角 作为技术宅的我,是这样追鬼滅の刃的 - 元视角 使用 Python 抽取《半泽直树》原著小说人物关系 - 元视角 厉害了!打工人用 Python 分析西安市职位信息 - 元视角 使用 dotTrace 对 .NET 应用进行性能分析与优化 - 元视角 一道 HashSet 面试题引发的蝴蝶效应 - 元视角 基于选项模式实现.NET Core 的配置热更新 - 元视角 Dapper.Contrib 在 Oracle 环境下引发 ORA-00928 异常问题的解决 - 元视角 .NET Core 中对象池(Object Pool)的使用 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(下):EventBus 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(中):RabbitMQ 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(上):基础篇 - 元视角 记一次从已损坏的 Git 仓库中找回代码的经历 - 元视角 .NET Core 原生 DI 扩展之属性注入实现 - 元视角
SDL 游戏开发系列第一话:Hello SDL - 元视角
飞鸿踏雪 · 2015-07-25 · via 元视角

各位读者朋友大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是http://qinyuanpei.com。从今天起博主将带领大家一起走进 SDL 游戏开发的世界,如果说此前的 Unity3D 游戏开发系列文章让大家感受到的是游戏引擎工具化开发的方便与快捷,那么这一次就让我们以 SDL 库为基础,通过了解游戏开发中的底层图形渲染、输入事件响应等内容来全面认识游戏引擎,博主为 SDL 游戏开发系列文章建立了专栏,大家可以通过这里获取所有的系列文章,希望大家能够喜欢!好了,作为 SDL 游戏开发系列的第一篇文章,按照技术性文章写作的国际惯例这将是一篇介绍 SDL 入门内容的文章,因此这篇文章叫做:Hello SDL。

什么是 SDL

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用 C 语言写成。SDL 提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台如 Linux、Windows、Mac OS X 等的应用软件。目前 SDL 可用于游戏、模拟器、媒体播放器等多媒体应用领域的开发,SDL 最为著名的案例是曾赢得 Linux 组游戏开发大奖的游戏《文明:权利的召唤》。或许大家对这个游戏会感到陌生吧,可是如果我提到一个 Linux 下经典单机游戏《仙剑奇侠传》的开源实现SDLPal相信大家就没有不知道的了吧?这款经典的单机游戏所以能够移植到 Linux 平台下就是因为使用 SDL 。好了,在对 SDL 有了大概的认识后,我们来看看 SDL 有哪些值得我们去研究的优良特性吧!

  • SDL 提供了从图像、视频、音频、事件、线程、计时器的 API,功能特别强大。
  • SDL 具有良好的跨平台性能,支持 Windows、Linux 及 Android 和 IOS,是开发跨平台多媒体应用的神兵利器。
  • SDL 内置了 OpenGL 相关函数,使 SDL 开发 3D 应用成为可能,因此 SDL 是一个同时支持 2D 和 3D 开发的强力工具。
  • 通过使用 SDL_image、SDL_ttf、SDL_mixer、SDL_net 等外部扩展库,可以轻松实现 JPG、PNG、TIFF 图像的加载使用,TrueType 字体的使用,MP3 文件的使用、网络相关的使用等。
  • SDL 支持 C++、C#、Java、 Lisp、Lua、Objective C、Pascal、Perl、 PHP、Python、Ruby 等近 20 种编程语言。
  • SDL 是 GNU LGPL 2 开源协议下发布的开源软件,该协议允许用户将 SDL 以动态链接库的形式免费地用于商业游戏软件的开发。

SDL的下载、安装和配置

SDL 开发相关的资源都可以从 http://www.libsdl.org/ 来获取。目前 SDL 存在 1.2 和 2.0 两个版本,从效率上来说 SDL 2.0 支持硬件加速效率较 SDL 1.2 有了较好的提升,从稳定性上来讲 SDL2.0 尚处于发展阶段,因此可能其中的 Bug 较 SDL1.2 可能会多些。博主这里选择的 SDL 2.0,下面是相关的下载链接:

博主选择的开发环境是 Visual Studio 2012,因此下载 VC++ 的 SDL 开发包。我们将下载得到的 SDL 开发包解压到本地,可以发现 SDL 开发包中已经为我们准备好了相关的 include 文件夹和 lib 文件夹。其中 include 文件夹下存放的是 SDL 的各种头文件,lib 文件夹下存放的是编译好的动态链接库(.dll)和依赖库(.lib),如果读者朋友有能力或是希望自行编译 SDL 源代码的,请先去编译源代码。这里我们为了节省时间,就直接使用编译好的文件了,请大家不要鄙视我啊,哈哈。好了,下面我们来以一个 VC++ 项目为例来讲解 SDL 的配置:

  • 1、使用 Visual Studio 创建一个空的 VC++ 项目
  • 2、右键单击项目【属性】打开项目属性页找到【配置属性】->【VC++目录】然后将包含目录和库目录分别定位到 SDL 开发包中的 include 目录和 lib 目(x86 和 x64 视系统情况而定)
  • 3、在【配置属性】->【链接器】->【输入】->【附加依赖项】中增加 SDL2.lib 和 SDL2main.lib
  • 4、将【配置属性】->【链接器】->【系统】->【子系统】设置为窗口 (/SUBSYSTEM:WINDOWS)
  • 5、将 SDL2.dll 复制到项目的 Debug 目录中

SDL 游戏开发的基本流程

SDL 游戏开发的一般流程是:

  • 1、使用 SDL_Init() 方法对 SDL 进行初始化。其中该初始化方法的参数类型为 int 类型,可以从 SDL_INIT_HAPTIC、SDL_INIT_AUDIO、SDL_INIT_VIDEO、SDL_INIT_TIMER、SDL_INIT_JOYSTICK、SDL_INIT_EVERYTHING、SDL_INIT_NOPARACHUTE 七个类型中选择,分别表示力反馈子系统、音频子系统、视频子系统、计时器子系统、摇杆子系统、全部和忽略致命信号。
  • 2、在 SDL 初始化成功后使用 SDL_CreateWindow() 方法创建一个 SDL 窗口(SDL_Window)。在这里我们可以设置窗口的名称、对齐方式、窗口宽度和窗口高度。
  • 3、在 SDL 窗口创建成功后使用 SDL_CreateRenderer() 方法创建一个 SDL 渲染器(SDL_Renderer)。其中 SDL 渲染器有 SDL_RENDERER_SOFTWARE、SDL_RENDERER_ACCELERATED、SDL_RENDERER_PRESENTVSYNC、SDL_RENDERER_TARGETTEXTURE 四种类型分别表示软件渲染、硬件加速、屏幕同步刷新渲染和支持渲染纹理。
  • 4、使用 SDL_RenderClear() 方法清空 SDL 渲染器、使用 SDL_RenderPresent() 方法将渲染的结果显示出来

工程示例

下面以一个简单的示例来向大家演示 SDL 游戏开发的一般流程:

/* 添加对SDL的引用*/
#include<SDL.h>

/* 声明SDL_Window */
SDL_Window *g_pWindow;

/* 声明SDL_Renderer */
SDL_Renderer *g_pRenderer;

/* 定义入口函数main */
int main(int argc,char *args[])
{
	/* SDL三部曲——1:初始化SDL */
	int sdlInit=SDL_Init(SDL_INIT_EVERYTHING);
	if(sdlInit>=0){
		/* 当SDL初始化完成后创建一个标题为"SDL Game Development——01" */
		/* 窗口对齐方式为居中对齐,窗口大小为640*480的窗口 */
		g_pWindow=SDL_CreateWindow("SDL Game Development——01",
			SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,
			640,480,SDL_WINDOW_SHOWN);
		/* SDL三部曲——2:初始化SDL渲染 */
		if(g_pWindow!=0){
			g_pRenderer=SDL_CreateRenderer(g_pWindow,-1,0);
		}
	}

	/* SDL三部曲——3:绘制窗口 */
	SDL_SetRenderDrawColor(g_pRenderer,0,0,0,255);
	SDL_RenderClear(g_pRenderer);
	SDL_RenderPresent(g_pRenderer);
	
	SDL_Quit();
	return 0;
}

在以上代码中我们基本遵循了 SDL 游戏开发的一般流程,即首先对 SDL 进行初始化,当 SDL 初始化完成后,我们创建一个标题为"SDL学习示例1",窗口对齐方式为居中对齐,窗口大小为 640 * 480 的窗口,然后创建了模式为软件渲染的 SDL 渲染器,并设置渲染器的背景色为黑色。作为第一个项目,它简单到纯粹,当我们运行项目,会发现一个黑色的窗口一闪而过,这是因为我们这里在渲染了一次后就使用 SDL_Quit() 方法退出了,第一篇文章并不会有太复杂的内容,因为它的意义在于让我们对 SDL 游戏开发有个基本的认识和了解。关于 SDL 绘制图片、文字以及处理渲染循环等问题我们放到后面的文章中去讲,这篇文章的内容就是这样啦,谢谢大家!