Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 20.09.2014
Сообщений: 3
1

Падение производительности

20.09.2014, 01:43. Показов 728. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Проблема заключается в том, что моя программа стала сильно "тормозить" на моем компьютере. Последний кусок написал вечером, запустил, работала как надо, днем обнаружил, что работает некорректно, а именно фпс держится на уровне 10 - 30, хотя вечером 80 стабильно держала. Можно подумать, что дело в коде, но запустив jar на другом пк, обнаружил, что на нем работает как надо, пробовал переустанавливать jre, jdk, ничего не помогает, буду рад если кто-нибудь объяснит, что все это значит.

Вот код основного класса, остальные роли не играют(комментил инициализацию)

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 
public class CatMain extends JPanel implements Runnable, Constants{
    
    private Thread animator;
    private long startTime = System.nanoTime();
    private int[] fpsStore = new int[60];
    private int freeCellIndex = 0;
    private volatile boolean running = false;
    private JFrame mainFrame;
    private static final int FPS = GAME_FPS;
    private long period = 1000000000L/FPS;
    private static final int NO_DELAYS_PER_YIELD = 15;
    private static final int MAX_FRAME_SKIPS = 5;
    private boolean isUpdating = true;
    private int currentFps;
    
    private LevelManager levelManager;
    
    private BufferedImage buffImage;
    private int[] pixels;
    
    public CatMain(){
        super();
        initFullScreenFrame();
        startEngine();
    }
 
 
    /*initialize a full screen JFrame */
    private void initFullScreenFrame(){
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        
        mainFrame = new JFrame("CAT2D");
        mainFrame.getContentPane().add(this);
        setBackground(Color.green);
        
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setResizable(false);
        mainFrame.setIgnoreRepaint(true);
        mainFrame.setUndecorated(true);
        mainFrame.setVisible(true);
 
        
        gd.setFullScreenWindow(mainFrame);
        
    }
 
    public static void main(String[] args){
        new CatMain();
    }
 
    public void run() {
        long beforeTime, afterTime, sleepTime, timeDiff;
        long fpsTime;
        long overSleepTime = 0L;
        long excess = 0L;
        int noDelays = 0;
        int fps = 0;
    
        fpsTime = System.nanoTime();
        running = true;
        
        while(running){
            beforeTime = System.nanoTime();
            fps++;
            
            if(System.nanoTime() - fpsTime >= 1000000000L){
                storeFps(fps);
                currentFps = fps;
                fps = 0;
                fpsTime = System.nanoTime();
                correctFPS();
                System.out.println("Now fps is: "+currentFps);
            }
                        
            update();
            render();
            paintScreen();
            
            afterTime = System.nanoTime();
            timeDiff = afterTime - beforeTime;
                        
            sleepTime = (period - timeDiff) - overSleepTime;
            
            if(sleepTime>0){
                try {
                    Thread.sleep(sleepTime/1000000L);
                } catch (InterruptedException e) {
                    System.out.println("thread cannot sleep =(");
                }
                overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
            }else{
                excess -= sleepTime;
                overSleepTime = 0;
                
                if(noDelays++ >= NO_DELAYS_PER_YIELD){
                    Thread.yield();     //give another thread chance to run
                    noDelays = 0;
                }
            }
            
            
            int skips = 0;
            while(excess >= period && skips < MAX_FRAME_SKIPS){
                excess -= period;
                update();
                skips++;
            }
            
            
            
            
        }
        
    }
    
    private void storeFps(int fps2) {
        if(freeCellIndex==fpsStore.length){
            freeCellIndex = 0;
            for(int i=0;i<fpsStore.length;i++)
                fpsStore[i] = 0;
            startTime = System.nanoTime();
        }
        
        fpsStore[freeCellIndex] = fps2;
        
        long sum = 0;
        long time = 0;
        
        for(int i=0;i<fpsStore.length;i++){
            sum+=fpsStore[i];
        }
        
        time = System.nanoTime() - startTime;
                
        if(time>=1000000000L)
            System.out.println("Average FPS is: "+sum/(time/1000000000L));
        else
            System.out.println("Average FPS is currently unavalible");
        freeCellIndex++;
        
    }
 
 
    private void correctFPS() {
        if(GAME_FPS>currentFps){
            period-=100000;
        }else if(GAME_FPS<currentFps){
            period+=100000;
        }
        System.out.println("Period now is: "+period/100000L);
    }
 
 
    public void stopEngine(){running = false;}
    
    public void pauseEngine(){};
    
    public void startEngine(){
        if(animator == null || !running){
            initWorld();
            animator = new Thread(this);
            animator.start();
        }
    }
    
    private void initWorld() {
        
        levelManager = new LevelManager("levels");
 
    }
 
 
    private void update(){
        if(isUpdating){
            
        }
    }
    
    private void render(){
        if(buffImage == null){
            
            buffImage = new BufferedImage(SCREEN_WIDTH,SCREEN_HEIGHT,BufferedImage.TYPE_INT_RGB);
            
            if(buffImage == null){
                System.out.println("Buffer create fail!");
            }else
                pixels = ((DataBufferInt) buffImage.getRaster().getDataBuffer()).getData();
        }
        
        //Do something with buffer
        if(levelManager.isReady()){
            levelManager.render(pixels);
        }
        
        //end 
    }
    
    private void paintScreen(){
        Graphics g;
        try{
            g = this.getGraphics();
            if((g != null) && (buffImage != null))
                g.drawImage(buffImage, 0, 0, null);
                g.setColor(Color.green);
                g.drawString("Now FPS is: "+ currentFps,100,40);
            g.dispose();
        }catch(Exception e){
            System.out.println("Graphics context error: "+e);
        }
    }
    
    public void setUpdateActive(boolean mode){
        isUpdating = mode;
    }
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2014, 01:43
Ответы с готовыми решениями:

Чудеса производительности
Здравствуйте. Тестировал потоки, и наткнулся на удивительную вещь, которая работает только в моем...

Оценка производительности алгоритма
пожскажите, как можно оценить производительность написанных алгоритмов??? я пытался получить время...

Тестирование производительности сервиса
Есть небольшой RESTful веб сервис оформленный в виде сервлета и запущенный на glassfish. Сервис...

Сравнение производительности графики
Скажите какой код будет быстрее работать? Визуально трудно определить, а с точки зрения технлогии...

4
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
20.09.2014, 12:20 2
Во первых исходников недостаточно (а я то хотел посмотреть где это ты fps мерять задумал, сдаётся мне что хрень там у тебя, но не буду делать поспешные выводы ), а во вторых интерфейс Constants который реализует класс CatMain это бред какой-то, static import для таких целей есть, хотя у тебя там всего-то пара констант, можно и без него обойтись явно указав.
0
0 / 0 / 0
Регистрация: 20.09.2014
Сообщений: 3
20.09.2014, 13:01  [ТС] 3
Убрал имплементирование Сonstants, убрал все другие классы, остался только CatMain, который просто считает фпс, ничего не делает, фпс всеравно 30, когда сворачиваешь окно вообще 7, на другом компьютере работает как надо. При переключении видеокарты ноута на встроенную, работает в 2 раза быстрее.
0
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
20.09.2014, 13:03 4
Цитата Сообщение от ArtemPopov Посмотреть сообщение
Убрал имплементирование Сonstants, убрал все другие классы, остался только CatMain
Я по прежнему не вижу собирающихся исходников,а общество гадания на кофейной гущи где-то за углом.
0
0 / 0 / 0
Регистрация: 20.09.2014
Сообщений: 3
21.09.2014, 00:06  [ТС] 5
Повторюсь, ничего не менял в коде, но работать она стала по другому после перезагрузки, другие все приложения не тормозят, только это.

Добавлено через 2 минуты
Пардон, вот код, который можно собрать:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
 
public class CatMain extends JPanel implements Runnable{
    
    private Thread animator;
    private long startTime = System.nanoTime();
    private int[] fpsStore = new int[60];
    private int freeCellIndex = 0;
    private volatile boolean running = false;
    private JFrame mainFrame;
    private static final int FPS = 80;
    private long period = 1000000000L/FPS;
    private static final int NO_DELAYS_PER_YIELD = 15;
    private static final int MAX_FRAME_SKIPS = 5;
    private boolean isUpdating = true;
    private int currentFps;
    
//  private LevelManager levelManager;
    
    private BufferedImage buffImage;
    private int[] pixels;
    
    public CatMain(){
        super();
        initFullScreenFrame();
        startEngine();
    }
 
 
    /*initialize a full screen JFrame */
    private void initFullScreenFrame(){
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        
        mainFrame = new JFrame("CAT2D");
        mainFrame.getContentPane().add(this);
        setBackground(Color.green);
        
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainFrame.setResizable(false);
        mainFrame.setIgnoreRepaint(true);
        mainFrame.setUndecorated(true);
        mainFrame.setVisible(true);
 
        
        gd.setFullScreenWindow(mainFrame);
        
    }
 
    public static void main(String[] args){
        new CatMain();
    }
 
    public void run() {
        long beforeTime, afterTime, sleepTime, timeDiff;
        long fpsTime;
        long overSleepTime = 0L;
        long excess = 0L;
        int noDelays = 0;
        int fps = 0;
    
        fpsTime = System.nanoTime();
        running = true;
        
        while(running){
            beforeTime = System.nanoTime();
            fps++;
            
            if(System.nanoTime() - fpsTime >= 1000000000L){
                storeFps(fps);
                currentFps = fps;
                fps = 0;
                fpsTime = System.nanoTime();
                correctFPS();
                System.out.println("Now fps is: "+currentFps);
            }
                        
            update();
            render();
            paintScreen();
            
            afterTime = System.nanoTime();
            timeDiff = afterTime - beforeTime;
                        
            sleepTime = (period - timeDiff) - overSleepTime;
            
            if(sleepTime>0){
                try {
                    Thread.sleep(sleepTime/1000000L);
                } catch (InterruptedException e) {
                    System.out.println("thread cannot sleep =(");
                }
                overSleepTime = (System.nanoTime() - afterTime) - sleepTime;
            }else{
                excess -= sleepTime;
                overSleepTime = 0;
                
                if(noDelays++ >= NO_DELAYS_PER_YIELD){
                    Thread.yield();     //give another thread chance to run
                    noDelays = 0;
                }
            }
            
            
            int skips = 0;
            while(excess >= period && skips < MAX_FRAME_SKIPS){
                excess -= period;
                update();
                skips++;
            }
            
            
            
            
        }
        
    }
    
    private void storeFps(int fps2) {
        if(freeCellIndex==fpsStore.length){
            freeCellIndex = 0;
            for(int i=0;i<fpsStore.length;i++)
                fpsStore[i] = 0;
            startTime = System.nanoTime();
        }
        
        fpsStore[freeCellIndex] = fps2;
        
        long sum = 0;
        long time = 0;
        
        for(int i=0;i<fpsStore.length;i++){
            sum+=fpsStore[i];
        }
        
        time = System.nanoTime() - startTime;
                
        if(time>=1000000000L)
            System.out.println("Average FPS is: "+sum/(time/1000000000L));
        else
            System.out.println("Average FPS is currently unavalible");
        freeCellIndex++;
        
    }
 
 
    private void correctFPS() {
        if(80>currentFps){
            period-=100000;
        }else if(80<currentFps){
            period+=100000;
        }
        System.out.println("Period now is: "+period/100000L);
    }
 
 
    public void stopEngine(){running = false;}
    
    public void pauseEngine(){};
    
    public void startEngine(){
        if(animator == null || !running){
            initWorld();
            animator = new Thread(this);
            animator.start();
        }
    }
    
    private void initWorld() {
        
        //levelManager = new LevelManager("levels");
 
    }
 
 
    private void update(){
        if(isUpdating){
            
        }
    }
    
    private void render(){
        if(buffImage == null){
            
            buffImage = new BufferedImage(1366,768,BufferedImage.TYPE_INT_RGB);
            
            if(buffImage == null){
                System.out.println("Buffer create fail!");
            }else
                pixels = ((DataBufferInt) buffImage.getRaster().getDataBuffer()).getData();
        }
        
        //Do something with buffer
        //if(levelManager.isReady()){
        //  levelManager.render(pixels);
        //}
        
        //end 
    }
    
    private void paintScreen(){
        Graphics g;
        try{
            g = this.getGraphics();
            if((g != null) && (buffImage != null)){
                g.drawImage(buffImage, 0, 0, null);
                Toolkit.getDefaultToolkit().sync();
            }
            g.dispose();
        }catch(Exception e){
            System.out.println("Graphics context error: "+e);
        }
    }
    
    public void setUpdateActive(boolean mode){
        isUpdating = mode;
    }
 
}
Добавлено через 10 часов 59 минут
Может быть это связанно с системный таймером??
0
21.09.2014, 00:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2014, 00:06
Помогаю со студенческими работами здесь

Падение производительности
Здравствуйте, купил ноутбук месяцев 5 назад, ноутбук работает, но его производительность упала...

Падение производительности
Добрый день! Последнее время при игре в Watch Dogs столкнулся с проблемой, когда в какой-то...

Падение производительности
Доброе время суток уважаемые эксперты. Вчера поймал доселе неизвестный мне вид гадости. ...

Периодическое падение производительности
Стоит проц Phenom II X4 Black 965. Последние пару дней стала периодически падать производительность...

Резкое падение производительности PC
Не так давно я купил себе видеокарту и по началу она стабильно работала.Но спустя неделю у меня...

Резкое падение производительности
Здравствуйте, уважаемы форумчане, у меня эйсер 7750джи, недавно поставил игру GTA San Andreas и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru