簡體   English   中英

在libgdx opengl中優化交替紋理

[英]Optimizing alternating textures in libgdx opengl

我正在使用libgdx制作游戲,並且在繪制成千上萬個這樣的紋理時,屏幕上的每個字符都由兩個紋理(身體和頭部圖像)組成,渲染調用的次數非常高,因為紋理需要保持重新綁定的交替性繪制紋理。 如果我先繪制所有頭部,那么我僅會進行2次渲染調用,並且幀速率非常好。 但是,這樣做會使z順序錯誤,當字符彼此經過時很容易看到。 無論如何,有沒有優化或緩存這些紋理的方法,以便可以正確的順序繪制它們並最小化opengl綁定?

使用紋理填充減少opengl重新綁定的數量。 見:

https://github.com/libgdx/libgdx/wiki/Texture-packer

您應該為對象保留z索引,並使用Comparator類按所需順序對它們進行排序,然后將它們批量繪制

讓我們假設您有一個DisplayObject類,該實例是您的可視對象,該對象具有getZ()函數以檢索對象的z索引,將顯示對象存儲在數組中

Array<DisplayObject> displayObjects

declare a comparator one time

comparator = new Comparator<DisplayObject>() {
        @Override
        public int compare(DisplayObject object1, DisplayObject object2) {
            return (int) Math.signum(object1.getZ() -
                    object2.getZ());
        }
    };

...

在渲染函數中,使用比較器對對象進行排序

  displayObjects.sort(comparator);

繪制所有對象

for(DisplayObject displayObject : displayObjects) {
       batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
       batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}

有關Comparator的更多信息,您可以打開此鏈接

https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html

您需要拆分循環:

for(DisplayObject displayObject : displayObjects) {
    batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
    batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}

如果頭部和身體放置在不同的TextureAtlasses上,則為2個循環,因為每個Texture切換都調用flush():

for(DisplayObject displayObject : displayObjects) {
    batch.draw(displayObject.body, displayObject.getX(), displayObject.getY());
}

for(DisplayObject displayObject : displayObjects) {
    batch.draw(displayObject.head, displayObject.getX(), displayObject.getY());
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM