`静态`和非静态`字段可在java Android中获得更好的性能
我在Android上用openGL 2D开发游戏 因为我的视图很复杂,同时包含300-400个对象(游戏循环),所以获得性能级别是非常重要的 我非常了解java中的`静态`和非静态`字段可在java Android中获得更好的性能,java,android,Java,Android,我在Android上用openGL 2D开发游戏 因为我的视图很复杂,同时包含300-400个对象(游戏循环),所以获得性能级别是非常重要的 我非常了解java中的静态和非静态字段: private final static int NUMBER = 10; 及 我的问题不是封装(作为OO),而是性能 性能方面最好使用的是,静态或非静态字段 其思想是,对于我的大多数逻辑,我使用诸如float/int之类的原语 我为我的所有“视图”创建了泛型超类,该类必须在性能范围内更有效: 下面是一个例子:
静态
和非静态
字段:
private final static int NUMBER = 10;
及
我的问题不是封装(作为OO),而是性能
性能方面最好使用的是,静态
或非静态
字段
其思想是,对于我的大多数逻辑,我使用诸如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可以在编译器级别提供一些优化可能性。另一方面,通常静态对象可能不“接近”内存中的实例数据,这对缓存性能不利
一般来说,这不是你应该花时间的地方,除非你已经用尽了所有的算法优化,只有在您知道这实际上是您浪费时间的地方之后,我建议您避免重复进行会使您的设计更糟糕的优化,除非您分析了应用程序并发现问题依赖于对该字段的访问。静态与性能无关。如果字段属于实例,则它不能是静态的。如果它属于一个类,它必须是静态的。你指的是静态/非静态的还是最终/非最终的?在您的示例中,这两个字段都是静态的。示例中的两个变量都是静态的
@adenoyelle,抱歉,已修复
/** 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};