在我的安卓游戏中,我使用固定分辨率的图像让我们说256x256。现在,对于不同的设备屏幕,我通过计算适合该设备的宽度和高度来渲染它们。
假设在galaxy note2上我计算了width = 128和height = 128 ......对于不同的设备,宽度和高度也会有所不同。
这就是我创建纹理的方法..
....
imageTexture = new Texture(...);
....
在render()..
中....
spriteBatch.draw(imageTexture,x,y,width,height);
....
所以,每当我调用draw()方法时,libgdx / opengl会将图像从256x256缩放到128x128,我想是的,是的!
有没有办法告诉opengl / libgdx只计算一次所有缩放?
我不知道图像是如何渲染的?加载到内存?缩放等?
libgdx中的Sprite如何工作?我试着理解Sprite的代码并且看起来像他们也获得了图像的宽度和高度,然后每次都进行缩放,即使他们有setScale()方法。
答案 0 :(得分:4)
优化的第一条规则:得到一些数字。过早优化是许多问题的根源。也就是说,仍然有一些好的经验法则可以知道。
当您调用new Texture
时,纹理数据将由libgdx / OpenGL上传到GPU。实际使用spriteBatch.draw
绘制纹理时,OpenGL将指令上传到GPU,告诉硬件使用现有纹理并使其适合边界。 draw
调用只上传坐标(定义Sprite的方框的角)和指向纹理的指针。实际纹理数据未上传。
因此,在实践中,您的图像会在每一帧上“缩放”。然而,这并不是那么糟糕,因为这正是GPU非常非常好地设计的。你只需要担心上传如此多的纹理,以至于GPU无法跟踪它们,你不必担心预先缩放纹理。
除了将数据发送到GPU的成本和刷新屏幕的成本之外,缩放和转换精灵的四个角落的成本相对微不足道,因此它们可能不值得担心太多。 SpriteBatch
中的“批处理”是关于“批量”(或聚集在一起)大量坐标以立即发送到GPU,粗略地说,每次调用GPU都很昂贵。因此,尽可能在单个批次begin
/ end
内完成尽可能多的工作。
尽管如此,现代机器的速度非常愚蠢,您应该能够做最简单的事情,让您的应用程序首先运行。然后,一旦你有正确的工作,你可以找出哪些部分实际上很慢并修复它们。 “低效”但实际上不会对您的应用产生重大影响的部分可以单独使用。