2014-04-04 65 views
0

在我的Android遊戲中,我使用的固定分辨率的圖片讓說256×256。現在針對不同的設備屏幕,我通過針對該設備計算它們的寬度和高度來渲染它們。在libgdx縮放圖像只有一次

假設在銀河注2上我計算了width = 128和height = 128 ...對於不同的設備,類似的寬度和高度也會有所不同。

我這是怎麼創造的質感..

.... 
imageTexture = new Texture(...); 
.... 

在渲染()..

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

所以,每次當我打電話draw()方法時,確實libgdx/OpenGL的規模圖像從256x256到128x128,我想是的!

有沒有什麼辦法告訴opengl/libgdx只計算一次所有的縮放比例?

我不知道圖像的方式呈現?加載到內存中?縮放等?

libgdx中的Sprite如何工作?我試着理解Sprite的代碼,並且看起來像他們也獲得圖像的寬度和高度,然後每次調整它,即使他們有setScale()方法。

回答

3

優化的第一條規則:獲得一些數字。不成熟的優化是許多問題的根源。也就是說,還有一些很好的經驗法則可以知道。

當您調用new Texture時,紋理數據將由libgdx/OpenGL上傳到GPU。當你真正繪製紋理spriteBatch.draw指令上傳到由OpenGL的GPU的告訴硬件使用現有的質地和它適合的範圍。該draw通話剛剛上傳座標(定義雪碧盒子的角落)和指針質感。實際的紋理數據沒有上傳。

因此,在實踐中,您的圖像在每一幀都「縮放」。然而,這並不是那麼糟糕,因爲這正是GPU非常非常好的設計。您只需要擔心上傳太多紋理以至於GPU無法全面跟蹤這些紋理,您無需事先對紋理進行縮放操作。

除了將數據發送到GPU的成本和刷新屏幕的成本之外,縮放和變換精靈四角的成本相對較小,所以它們可能不值得擔心太多。 SpriteBatch中的「批處理」全部是關於「批處理」(或聚集在一起)的大量座標,以便一次發送到GPU,就像粗略地一樣,每個調用GPU的代價都很昂貴。因此,儘可能在單個批次的begin/end之內完成儘可能多的工作。

儘管如此,現代化的機器速度非常快,而且您應該能夠做任何最簡單的操作,讓您的應用程序首先運行。然後,一旦你有正確的工作,你可以找出哪些部分實際上是緩慢的,並修復這些。 「效率低下」但實際上並沒有顯着影響應用程序的部分可以單獨使用。