SDL是一个轻量级的,用C语言开发的多媒体库。它包含了图像绘制、文字绘制、事件处理、声音播放等模块。因为SDL的易用以及它的扩展库的完整性,很多2D游戏都使用SDL开发,其中就包括这几年大热的移动平台上的游戏《愤怒的小鸟》。
然后说说从个人角度上看SDL的特点。
1.跨平台。确确实实是跨了N个平台,甚至包括NDS这种平台。有了SDL,你甚至可以在windows、linux、Android上任意移植你的游戏。当然,前提是你目标平台的编译器认识你的代码( ̄▽ ̄)”。有了SDL泥甚至可以只用c语言开发安卓游戏哟。
2.开源。3.SDL2.0绘图效率很高。事实上相较之SDL1.2我个人比较喜欢SDL2.0的原因也是在此。个人感觉(其实我没看过源码)SDL1.2应该是个跟当年的DirectDraw差不多的东西,像素填充什么的,有相当程度上是要磨CPU的。而SDL2.0从绘图方式上就革新了,抛弃了之前的surface与clip的模式,把实际绘制的东西改为了Texture,而把之前的surface改为了创建Texture的一个临时环节。而texure,顾名思义,其实就是DirectX、OpenGL这些底层的3D硬件加速API的贴图。
当下DirectX、OpenGL标准下的显卡的渲染管线无非就是:1.把顶点(可以理解成坐标)传给显卡 。2.把texture传给显卡。 3.告诉显卡怎么处理这些数据(shader)。 4.显卡把东西给你显示出来。而基于DirectX、OpenGL(移动平台是OpenGL ES)的SDL2.0,正是恰好地利用了当下显卡的能力。
4.SDL可以用作3D图像引擎和底层DirectX/OpenGL API的中间层。当然,其实如果把SDL这样用的话,那就真是很薄的一层了:)
5.易用。这是相对而言的,比如在windows上,你用了SDL这个库之后,基本就不用去理会Windows那些又臭又长用不着的参数又多的API了。我不是在讨论信仰问题也不是要诋毁windows,我是在客观陈述windows api那个要初始化一个窗口必须要堆100行代码的设定实在是打击初学者积极性的事实。
SDL_image、SDL_ttf、SDL_mixer、SDL_net 外部扩展库,也是不错的选择。性能没有测试,仅从写代码角度上来说,个人感觉2.0将操作给弄得复杂了。
1.2---------------------------------------
只有SDL_Surface的概念,屏幕是surface,图片,文字等都是surface,
只要将准备好的各种图片,贴到屏幕里去(SDL_BlitSurface);再刷一下屏幕(SDL_Flip全局的、或SDL_UpdateRect局部的)就ok了。。。
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
SDL_Surface* bmp = SDL_LoadBMP("back.bmp");
SDL_BlitSurface(bmp, 0, screen, 0);
SDL_Flip(screen);
while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();
2.0---------------------------------------
整出了SDL_Window,SDL_Renderer,SDL_Texture新的3个东西。
并且我要画一张图,先要得到surface,然后转换为texture,再临时贴到renderer,最后才刷屏。
SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window* window = SDL_CreateWindow("hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
SDL_Surface* surface = SDL_LoadBMP("back.bmp");
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, texture, 0, 0);
SDL_RenderPresent(renderer);
while(SDL_WaitEvent(&e)) {
switch(e.type) {
case SDL_QUIT:
return;
}
}
SDL_Quit();
其实,我真心不觉得提出SDL_Window,SDL_Renderer,SDL_Texture这些概念先进性在哪里?可能是与openGL的概念保持一致吧。
而且从维护的角度出发,不管sdl2.0性能提升了多少,如果接口本身不需要改动,不是更加好么?
---------------------------------------------
最后我发现,同样是渲染的窗口
1.2用SDL_Flip(screen);之后被其他窗口挡住之后,回来画面还是在的;
2.0用SDL_RenderPresent(renderer);之后被其他窗口挡住之后,回来画面就不在了;