2013-07-19 32 views
3

我用Android上的openGL 2D開發遊戲。`static`和`non-static`字段在java中有更好的性能Android

這是非常無能獲得的性能水平,因爲我的看法是複雜的,包含在同一時間300-400對象(遊戲循環)。

我知道在java中staticnon-static領域相當不錯:

private final static int NUMBER = 10; 

private final int NUMBER = 10; 

我的問題不是封裝(如OO),但性能。

什麼是更好的使用性能,staticnon-static領域。

的想法是,對於大多數我的邏輯我用像元float/int

我創造了我所有的「意見」通用超類和這個類必須是在性能範圍內更有效:

這裏是例子:

/** Sprite sheet definition */ 
private final int SPRITE_WIDTH = 4; 
private final int SPRITE_HEIGHT = 4; 

private float mScreenWidth, mScreenHeight, wRatio, hRatio; 
private int mFrame = 0; 
private int mSwitcher = 0; 
private final int TEXTURE_COUNT = 1; // for sprite sheet we use 1 image all the time. 
private int[] textures = new int[TEXTURE_COUNT]; // frame animation 

protected FloatBuffer vertexBuffer; 

private final ESpriteDirection mDirection = ESpriteDirection.TOP_TO_DOWN_LEFT_TO_RIGHT; 


public float x, y, initPos, finalPos, initSpeed, currentPos; 

private ByteBuffer bb1; 

private final int TOTAL_IMAGE_COUNT_IN_SPRITE = SPRITE_WIDTH * SPRITE_HEIGHT; 

private FloatBuffer[] floatBufferArray = new FloatBuffer[TOTAL_IMAGE_COUNT_IN_SPRITE]; 

private float xOffset = 1.0f/SPRITE_WIDTH; 
private float yOffset = 1.0f/SPRITE_HEIGHT; 




private float vertices[] = {    
     0.0f,3.0f,0.0f, 
     0.0f,0.0f,0.0f,     
     3.0f,3.0f,0.0f, 
     3.0f,0.0f,0.0f 
}; 


private float storage[][] = new float[TOTAL_IMAGE_COUNT_IN_SPRITE][]; 
private int[] sprite_X_Indexes = new int[SPRITE_WIDTH];//{1,2,3,4}; 
private int[] sprite_Y_Indexes = new int[SPRITE_WIDTH];//{1,2,3,4}; 

我可以猜測,爲多個啓動同一類static場比較好,嗯

謝謝

+6

我建議你避免重複到優化是將會使您的設計更糟糕,除非你異形你的應用程序,並發現該問題在訪問該領域的依賴。 – mariosangiorgio

+4

靜態與性能無關。如果該字段屬於某個實例,則該字段不能是靜態的。如果它屬於一個類,它必須是靜態的。 –

+2

你的意思是靜態/非靜態還是最終/非最終?在你的例子中,這兩個字段都是靜態的。 –

回答

9

從性能POV,一旦你的代碼編譯應該幾乎沒有區別,因爲你的靜態和一個(單個)非靜態字段已經被轉換成了一個內存位置。

聲明領域靜態可提供在編譯器級別的一些優化的可能性。另一方面,通常靜態對象可能不會「接近」您內存中的實例數據,這對您的緩存性能不利。

在一般情況下,這是不是你應該花時間,直到/除非你已經用盡了所有的算法最優化的,然後你只知道經過這其實是你失去的時間。