您的位置:首页 > 其它

Libdgx专题系列:对象篇源码分析 SpriteBatch

2013-12-05 19:08 253 查看
声明:

本系列文章使用的Libgdx版本均为0.99版本

Libgdx游戏开发交流群 323876830



在Libgdx中,使用比较多的就有SpriteBatch,字面的意思就是精灵组。

文档的具体解释为:

1.SpriteBatch用来绘制2D的带有纹理或纹理区域的矩形的。 他可以把绘制的一些命令捆绑起来,然后一起发给GPU来处理。

2.在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘制完了,需要调用end方法,来真正的绘制指定的内容。

3.SpriteBatch操作的所有的绘制命令都是在屏幕坐标系统上的,屏幕坐标系统是一个右手坐标系, x轴向右,y轴向上,原点

在屏幕左下角,如果我们想做的话,也可以提供模型视口矩阵和投影矩阵给他。

4.SpriteBatch也被管理着,在某些情况下, OpenGL上下文丢失了SpriteBatch使用的所有OpenGL资源,例如我们切换到其

他应用,或者接电话,当OpenGL的上下文恢复的时候,SpriteBatch将会自动下载资源。

5.SpriteBatch是一个相对比较大的对象,所以我们最好在程序中,只是用一个。

6.SpriteBatch可以在OpenGL ES 1.x 和 2.0使用, 在2.0中,我们可以提供一个自己的着色器绘制精灵。

7.另外,SpriteBatch实现了disposed接口 , 所以不使用的时候,别忘了销毁资源。

下面我们一条条解读看看都是怎么做的。



1.SpriteBatch用来绘制2D的带有纹理或纹理区域的矩形的。 他可以把绘制的一些命令捆绑起来,然后一起发给GPU来处理。

SpriteBatch是一个Libgdx提供的专门对于2D面板的一个类, 这点大家应该都知道, 那么他是怎么捆绑起来,分组提交给GPU的呢?

首先我们需要知道组的概念, 组就是每次发送给GPU的数据就是一组, 那么每组的数据量是多大呢,SpriteBatch的构造方法有个size

的参数

public SpriteBatch (int size)

可以指定矩形面板的数量多少,默认是1000个,这里他是有最大值限制的。

// 32767 is max index, so 32767 / 6 - (32767 / 6 % 3) = 5460.
		if (size > 5460) throw new IllegalArgumentException("Can't have more than 5460 sprites per batch: " + size);

当绘制的时候他是有两种情况发送数据到GPU的, 一种情况是纹理改变的时候, 还有一种是达到了最大的顶点值最大值,

if (texture != lastTexture)
			switchTexture(texture);
		else if (idx == vertices.length) //
			flush();


flush方法就是具体绘制的方法了, 纹理绑定,把顶点数据值传给Mesh图元, 让他进行绘制,方法的最后把顶点计数值清零等操作,以便下次操作使用。



2.在绘制之前首先要调用begin方法,去开启想对应的绘制状态,当绘制完了,需要调用end方法,来真正的绘制指定的内容。

使用SpriteBatch的时候,begin和end是成对出现的。 绘制前必须调用begin,绘制后调用end,这是因为begin执行了状态的开启,着色器的开启,矩阵信息填充,提交给GPU

的大小初始化等操作

public void begin () {
		if (drawing) throw new IllegalStateException("SpriteBatch.end must be called before begin.");
		renderCalls = 0;

		Gdx.gl.glDepthMask(false);
		if (Gdx.graphics.isGL20Available()) {
			if (customShader != null)
				customShader.begin();
			else
				shader.begin();
		} else {
			Gdx.gl.glEnable(GL10.GL_TEXTURE_2D);
		}
		setupMatrices();

		drawing = true;
	}



3.SpriteBatch操作的所有的绘制命令都是在屏幕坐标系统上的,屏幕坐标系统是一个右手坐标系, x轴向右,y轴向上,原点

在屏幕左下角,如果我们想做的话,也可以提供模型视口矩阵和投影矩阵给他。

在Opengl中有很多坐标系, SpriteBatch操作的是屏幕坐标, 使用的右手坐标系,就是攥紧右手, 拇指朝上, 中指伸直。在begin的时候,调整投影矩阵

和模型视口矩阵,并且初始为单位矩阵。

gl.glMatrixMode(GL10.GL_PROJECTION);
			gl.glLoadMatrixf(projectionMatrix.val, 0);
			gl.glMatrixMode(GL10.GL_MODELVIEW);
			gl.glLoadMatrixf(transformMatrix.val, 0);

这个一定要在绘制之前来做这些事,系统才知道是在什么模式下的绘制。



4.SpriteBatch也被管理着,在某些情况下, OpenGL上下文丢失了SpriteBatch使用的所有OpenGL资源,例如我们切换到其

他应用,或者接电话,当OpenGL的上下文恢复的时候,SpriteBatch将会自动下载资源。

5.SpriteBatch是一个相对比较大的对象,所以我们最好在程序中,只是用一个。

SpriteBatch在构造的时候,做了很多的事情, 如果有多个的话, 会很浪费内存的, 他保存了很多顶点数据信息,所以最好项目中绘制的时候都使用同一个

SpriteBatch.



6.SpriteBatch可以在OpenGL ES 1.x 和 2.0使用, 在2.0中,我们可以提供一个自己的着色器绘制精灵。

大家在使用SpriteBatch的时候,并不需要考虑里面的Opengl是1.x或者是2.0的,在类的内部已经对他进行了区别处理, 当然2.0的也可以设置着色器。



7.另外,SpriteBatch实现了disposed接口 , 所以不使用的时候,别忘了销毁资源。

在Libgdx中凡是实现了Disposable接口的,在销毁的时候都要调用dispose方法, 这一点不要忘了。



转载请链接原文地址 http://blog.csdn.net/wu928320442/article/details/17142929
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: