Android 仅在libgdx中缩放图像一次

Android 仅在libgdx中缩放图像一次,android,image,textures,libgdx,render,Android,Image,Textures,Libgdx,Render,在我的android游戏中,我使用的是固定分辨率的图像,比如说256x256。现在,对于不同的设备屏幕,我通过计算适合该设备的宽度和高度来渲染它们 假设在galaxy note2上,我计算了宽度=128,高度=128。。。同样,对于不同的设备,宽度和高度也会有所不同 这就是我创建纹理的方式 .... imageTexture = new Texture(...); .... 在render()中 所以,每次我调用draw()方法时,libgdx/opengl是否会将图像从256x256缩放到1

在我的android游戏中,我使用的是固定分辨率的图像,比如说256x256。现在,对于不同的设备屏幕,我通过计算适合该设备的宽度和高度来渲染它们

假设在galaxy note2上,我计算了宽度=128,高度=128。。。同样,对于不同的设备,宽度和高度也会有所不同

这就是我创建纹理的方式

....
imageTexture = new Texture(...);
....
在render()中

所以,每次我调用draw()方法时,libgdx/opengl是否会将图像从256x256缩放到128x128,我想是的

有没有办法告诉opengl/libgdx只计算一次所有的缩放

我不知道图像是如何呈现的?载入内存?缩放等


libgdx中的Sprite是如何工作的?我试着理解Sprite的代码,在我看来,他们也在获取图像的宽度和高度,然后每次都进行缩放,即使他们有setScale()方法。

优化的第一条规则:获取一些数字。过早优化是许多问题的根源。尽管如此,仍有一些好的经验法则需要了解

当您调用
new texture
时,libgdx/OpenGL将纹理数据上传到GPU。当您实际使用spriteBatch绘制纹理时,OpenGL会将绘制指令上载到GPU,告诉硬件使用现有纹理并使其适合边界。
draw
调用只上传坐标(定义精灵的框的角)和指向纹理的指针。未上载实际纹理数据

因此,在实践中,您的图像在每一帧上都是“缩放”的。然而,这并不是那么糟糕,因为这正是GPU设计得非常非常好的目的。你只需要担心上传如此多的纹理,以至于GPU无法跟踪它们,你不需要担心事先缩放纹理

与向GPU发送数据和刷新屏幕的成本相比,缩放和转换sprite四个角的成本相对较小,因此它们可能不值得担心太多。
SpriteBatch
中的“批处理”都是关于“批处理”(或收集)大量坐标,以便一次发送到GPU,因为粗略地说,每次调用GPU都会很昂贵。因此,在单个批次的
开始
/
结束
中尽可能多地完成工作总是很好的


尽管如此,现代机器的速度还是非常快,你应该能够做任何最容易让你的应用程序首先运行的事情。然后,一旦你有了正确的工作方式,你就可以找出哪些部分实际上是慢的,并修复它们。那些“效率低下”但实际上对您的应用程序没有明显影响的部分可以忽略不计。

优化的第一条规则:获取一些数字。过早优化是许多问题的根源。尽管如此,仍有一些好的经验法则需要了解

当您调用
new texture
时,libgdx/OpenGL将纹理数据上传到GPU。当您实际使用spriteBatch绘制纹理时,OpenGL会将绘制指令上载到GPU,告诉硬件使用现有纹理并使其适合边界。
draw
调用只上传坐标(定义精灵的框的角)和指向纹理的指针。未上载实际纹理数据

因此,在实践中,您的图像在每一帧上都是“缩放”的。然而,这并不是那么糟糕,因为这正是GPU设计得非常非常好的目的。你只需要担心上传如此多的纹理,以至于GPU无法跟踪它们,你不需要担心事先缩放纹理

与向GPU发送数据和刷新屏幕的成本相比,缩放和转换sprite四个角的成本相对较小,因此它们可能不值得担心太多。
SpriteBatch
中的“批处理”都是关于“批处理”(或收集)大量坐标,以便一次发送到GPU,因为粗略地说,每次调用GPU都会很昂贵。因此,在单个批次的
开始
/
结束
中尽可能多地完成工作总是很好的

尽管如此,现代机器的速度还是非常快,你应该能够做任何最容易让你的应用程序首先运行的事情。然后,一旦你有了正确的工作方式,你就可以找出哪些部分实际上是慢的,并修复它们。那些“低效”但实际上对应用程序影响不大的部分可以单独处理

.... 
spriteBatch.draw(imageTexture,x,y,width,height);
....