﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Daywei0123-随笔分类-SDL</title><link>http://www.cppblog.com/Daywei0123/category/21227.html</link><description>技术追求卓越 梦想创造未来</description><language>zh-cn</language><lastBuildDate>Sun, 11 Sep 2016 16:32:36 GMT</lastBuildDate><pubDate>Sun, 11 Sep 2016 16:32:36 GMT</pubDate><ttl>60</ttl><item><title>SDL认识</title><link>http://www.cppblog.com/Daywei0123/archive/2016/06/28/213813.html</link><dc:creator>Daywei</dc:creator><author>Daywei</author><pubDate>Mon, 27 Jun 2016 16:17:00 GMT</pubDate><guid>http://www.cppblog.com/Daywei0123/archive/2016/06/28/213813.html</guid><wfw:comment>http://www.cppblog.com/Daywei0123/comments/213813.html</wfw:comment><comments>http://www.cppblog.com/Daywei0123/archive/2016/06/28/213813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Daywei0123/comments/commentRss/213813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Daywei0123/services/trackbacks/213813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; SDL是一个轻量级的，用C语言开发的多媒体库。它包含了图像绘制、文字绘制、事件处理、声音播放等模块。因为SDL的易用以及它的扩展库的完整性，很多2D游戏都使用SDL开发，其中就包括这几年大热的移动平台上的游戏《愤怒的小鸟》。<br /><br />然后说说从个人角度上看SDL的特点。<br /><br /><strong>1.跨平台。</strong>确确实实是跨了N个平台，甚至包括NDS这种平台。有了SDL，你甚至可以在windows、linux、Android上任意移植你的游戏。当然，前提是你目标平台的编译器认识你的代码(￣&#9661;￣)&#8221;。有了SDL泥甚至可以只用c语言开发安卓游戏哟。<br /><br /><strong>2.开源。</strong><br /><br /><strong>3.SDL2.0绘图效率很高</strong>。事实上相较之SDL1.2我个人比较喜欢SDL2.0的原因也是在此。个人感觉（其实我没看过源码）SDL1.2应该是个跟当年的DirectDraw差不多的东西，像素填充什么的，有相当程度上是要磨CPU的。而SDL2.0从绘图方式上就革新了，抛弃了之前的surface与clip的模式，把实际绘制的东西改为了Texture，而把之前的surface改为了创建Texture的一个临时环节。而texure，顾名思义，其实就是DirectX、OpenGL这些底层的3D硬件加速API的贴图。<br /><br />当下DirectX、OpenGL标准下的显卡的渲染管线无非就是：1.把顶点（可以理解成坐标）传给显卡 。2.把texture传给显卡。 3.告诉显卡怎么处理这些数据（shader）。 4.显卡把东西给你显示出来。而基于DirectX、OpenGL(移动平台是OpenGL ES)的SDL2.0，正是恰好地利用了当下显卡的能力。<br /><br /><strong>4.SDL可以用作3D图像引擎和底层DirectX/OpenGL API的中间层</strong>。当然，其实如果把SDL这样用的话，那就真是很薄的一层了：）<br /><br /><strong>5.易用</strong>。这是相对而言的，比如在windows上，你用了SDL这个库之后，基本就不用去理会Windows那些又臭又长用不着的参数又多的API了。我不是在讨论信仰问题也不是要诋毁windows，我是在客观陈述windows api那个要初始化一个窗口必须要堆100行代码的设定实在是打击初学者积极性的事实。<br /><br /><span style="white-space: normal; word-spacing: 0px; text-transform: none; float: none; color: rgb(155,171,177); text-align: left; font: 16px/28px 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; widows: 1; display: inline !important; letter-spacing: normal; background-color: rgb(47,48,60); text-indent: 32px; -webkit-text-stroke-width: 0px">SDL_image、SDL_ttf、SDL_mixer、SDL_net 外部扩展库，也是不错的选择。</span><br /><br />性能没有测试，仅从写代码角度上来说，个人感觉2.0将操作给弄得复杂了。<br /><br />1.2---------------------------------------<br />只有SDL_Surface的概念，屏幕是surface，图片，文字等都是surface，<br />只要将准备好的各种图片，贴到屏幕里去(SDL_BlitSurface)；再刷一下屏幕(SDL_Flip全局的、或SDL_UpdateRect局部的)就ok了。。。<br /><br />SDL_Init(SDL_INIT_EVERYTHING);<br /><br />SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);<br />SDL_Surface* bmp = SDL_LoadBMP("back.bmp");<br />SDL_BlitSurface(bmp, 0, screen, 0);<br />SDL_Flip(screen);<br /><br />while(SDL_WaitEvent(&amp;e)) {<br />switch(e.type) {<br />case SDL_QUIT:<br />return;<br />}<br />}<br />SDL_Quit();<br />2.0---------------------------------------<br />整出了SDL_Window,SDL_Renderer,SDL_Texture新的3个东西。<br />并且我要画一张图，先要得到surface，然后转换为texture，再临时贴到renderer，最后才刷屏。<br /><br />SDL_Init(SDL_INIT_EVERYTHING);<br /><br />SDL_Window* window = SDL_CreateWindow("hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);<br />SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);<br />SDL_Surface* surface = SDL_LoadBMP("back.bmp");<br />SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);<br />SDL_RenderClear(renderer);<br />SDL_RenderCopy(renderer, texture, 0, 0);<br />SDL_RenderPresent(renderer);<br /><br />while(SDL_WaitEvent(&amp;e)) {<br />switch(e.type) {<br />case SDL_QUIT:<br />return;<br />}<br />}<br />SDL_Quit();<br /><br />其实，我真心不觉得提出SDL_Window,SDL_Renderer,SDL_Texture这些概念先进性在哪里？可能是与openGL的概念保持一致吧。<br />而且从维护的角度出发，不管sdl2.0性能提升了多少，如果接口本身不需要改动，不是更加好么？<br /><br />---------------------------------------------<br />最后我发现，同样是渲染的窗口<br />1.2用SDL_Flip(screen);之后被其他窗口挡住之后，回来画面还是在的；<br />2.0用SDL_RenderPresent(renderer);之后被其他窗口挡住之后，回来画面就不在了； <img src ="http://www.cppblog.com/Daywei0123/aggbug/213813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Daywei0123/" target="_blank">Daywei</a> 2016-06-28 00:17 <a href="http://www.cppblog.com/Daywei0123/archive/2016/06/28/213813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>