屏幕截屏并保存方案实现
DionysosLai 2014-5-27
屏幕截屏思路大纲:
1. 通过 opengl 来实现屏幕截屏,这种方法可以完全复制你所看到的画面上的任何东西。
关键函数是:glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
2. 通过纹理对象来获取,可以获取当前对象的所有纹理信息。注意:如果某些对象是不属
于本对象,即使可以在屏幕上看到,但也无法获取下来。
关键函数是:
//渲染纹理开始捕捉
renderTexture->begin();
//绘制当前场景
pCurScene->visit();
//结束
renderTexture->end();
二者获取图片如下所示:
Opengl 方法 纹理对象方法
注意左下角的不同。
3. 二者的优劣对比:
a. 图片大小: 通过 opengl 方法,获取的图片大小小于通过纹理对象来获取,大概有 80k
差左右(我只测过过《球类分分看》这个游戏。),而实际上前者的元素更多。
b. 效率对比:两种效率对比,前者的效率略高于后者(不过可以忽略)
c. 灵活性比较:opengl 方法,只能很死板的复制像素信息;但通过纹理对象,可以做
到先将屏幕缩小,然后在获取下来(我们在玩游戏时,游戏截屏通常都是整个屏幕
的内容,但显示时,明显比较小-----就是通过这个方法来实现),同时也可以获取不
必要的元素,比如游戏中的广告信息等。
4. 二者的应用领域:
a. 如果想看到的是游戏画面的所有元素,那么建议使用 opengl,ios 的屏幕快照,应该
采用的就是这个方法(当然,ios 在屏幕快照时,会将小圆圈先消失掉。)。如果你不
想看到哪个元素,可以先让其消失,在截屏,最后又还原。
b. 如果是想看到游戏画面,诸如广告信息都不想看到,采用纹理方法,灵活性更强。
5. 使用屏幕截屏时注意点:
在使用屏幕截屏时,游戏的帧率会瞬间降低到很小,如果对于游戏帧率要求比较严格的
游戏,比如游戏中,如果加入了 box2d,那么在截屏瞬间会有世界失衡的感觉。
评论0