9 / 0 / 0
Регистрация: 01.06.2013
Сообщений: 28
1

интересная головоломка

04.07.2013, 14:20. Показов 810. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Стал изучать lwjgl(движок ява для создания игр) и столкнулся с проблемой снижения fps(частота обновления экрана) из-за небольшой как мне казалось нагрузки приложения, я создал плоскость состоящую из 50-60 кубов что снизило fps со 100 до 20, и прыжки и передвижение в этой плоскости сталb заметно замедленнымb... Подумал, подумал и решил, что программа перегружается по следующей схеме: класс в котором описывается создание куба(6 плоскостей и загрузка текстур) состоит из 180 строк
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
import java.util.Random; 
 
 import org.lwjgl.opengl.GL11; 
 
 public class Quad { 
 
     float x1, y1, z1, x2, y2, z2, centerX, centerY, centerZ; 
     float width, height, length; 
     float yTop2; 
     float yTop, yBottom; 
     int num; 
     float cX2, cY2, cZ2; 
     float texSize; 
     boolean top, bottom, front, back, left_side, right_side; 
 
     Random r = new Random(); 
 
     public Quad(float startX, float startY, float startZ, float endX, 
       float endY, float endZ, int number, float gh, float hj, float yu, 
       float jop, boolean oko, boolean gyo, boolean dfu, boolean qrt, 
       boolean bnjf, boolean ghiop) { 
      x1 = startX; 
      y1 = startY; 
      z1 = startZ; 
      x2 = endX; 
      y2 = endY; 
      z2 = endZ; 
      width = x2 - x1; 
      height = y2 - y1; 
      length = z2 - z1; 
      centerX = x1 + (width / 2); 
      centerY = y2 + (height / 2); 
      centerZ = z1 + (length / 2); 
      yTop = Math.abs(y2 - y1); 
      yBottom = y1 + yTop - height; 
      num = number; 
      cX2 = gh; 
      cY2 = hj; 
      cZ2 = yu; 
      texSize = jop; 
      top = oko; 
      bottom = gyo; 
      front = dfu; 
      back = qrt; 
      left_side = bnjf; 
      right_side = ghiop; 
     } 
 
     public Quad() { 
 
     } 
 
     public void texNum() { 
      if (num >= 1) { 
       TexLoad.wood.bind(); 
      } 
      if (num == 2) { 
       TexLoad.box.bind(); 
      }
     } 
 
     public void render() { 
      GL11.glColor3f(cX2, cY2, cZ2); 
     
      if (top) {
          texNum(); 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1, y1, z1);
       GL11.glVertex3f(x1, y1, z1); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1 + width, y1, z1); 
       GL11.glVertex3f(x1 + width, y1, z1); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1 + width, y1, z1 + length); 
       GL11.glVertex3f(x1 + width, y1, z1 + length); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1, y1, z1 + length); 
       GL11.glVertex3f(x1, y1, z1 + length); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // GL11.glColor3f(0.2f, 0.2f, 0.2f); 
      if (bottom) { 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1, y1 + height, z1); 
       GL11.glVertex3f(x1, y1 + height, z1); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1 + width, y1 + height, z1); 
       GL11.glVertex3f(x1 + width, y1 + height, z1); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1 + width, y1 + height, z1 + length); 
       GL11.glVertex3f(x1 + width, y1 + height, z1 + length); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1, y1 + height, z1 + length); 
       GL11.glVertex3f(x1, y1 + height, z1 + length); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // GL11.glColor3f(0.4f, 0.4f, 0.4f); 
      if (front) { 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1, y1, z1); 
       GL11.glVertex3f(x1, y1, z1); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1 + width, y1, z1); 
       GL11.glVertex3f(x1 + width, y1, z1); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1 + width, y1 + height, z1); 
       GL11.glVertex3f(x1 + width, y1 + height, z1); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1, y1 + height, z1); 
       GL11.glVertex3f(x1, y1 + height, z1); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // GL11.glColor3f(0.4f, 0.4f, 0.4f); 
      if (back) { 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1, y1, z1 + length); 
       GL11.glVertex3f(x1, y1, z1 + length); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1 + width, y1, z1 + length); 
       GL11.glVertex3f(x1 + width, y1, z1 + length); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1 + width, y1 + height, z1 + length); 
       GL11.glVertex3f(x1 + width, y1 + height, z1 + length); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1, y1 + height, z1 + length); 
       GL11.glVertex3f(x1, y1 + height, z1 + length); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // GL11.glColor3f(1.0f, 1.0f, 1.0f); 
      if (left_side) { 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1, y1, z1); 
       GL11.glVertex3f(x1, y1, z1); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1, y1, z1 + length); 
       GL11.glVertex3f(x1, y1, z1 + length); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1, y1 + height, z1 + length); 
       GL11.glVertex3f(x1, y1 + height, z1 + length); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1, y1 + height, z1); 
       GL11.glVertex3f(x1, y1 + height, z1); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // GL11.glColor3f(1.0f, 1.0f, 1.0f); 
      if (right_side) { 
       GL11.glPushMatrix(); 
       GL11.glBegin(GL11.GL_QUADS); 
       GL11.glTexCoord2f(0, 0); 
       GL11.glNormal3f(x1 + width, y1, z1); 
       GL11.glVertex3f(x1 + width, y1, z1); 
       GL11.glTexCoord2f(texSize, 0); 
       GL11.glNormal3f(x1 + width, y1, z1 + length); 
       GL11.glVertex3f(x1 + width, y1, z1 + length); 
       GL11.glTexCoord2f(texSize, texSize); 
       GL11.glNormal3f(x1 + width, y1 + height, z1 + length); 
       GL11.glVertex3f(x1 + width, y1 + height, z1 + length); 
       GL11.glTexCoord2f(0, texSize); 
       GL11.glNormal3f(x1 + width, y1 + height, z1); 
       GL11.glVertex3f(x1 + width, y1 + height, z1); 
       GL11.glEnd(); 
       GL11.glPopMatrix(); 
      } 
      // создание цвета по умолчанию 
      GL11.glColor3f(1.0f, 1.0f, 10.0f); 
     } 
 }
, чтобы создать в пространстве куб нужно в массив Arraylist<quad> quad добавить новый элемент quad с характеристиками расположения в пространстве (x y z) и прочей лабудой в скобках в массив quad
Java
1
2
3
List<Quad> quad = new ArrayList<Quad>();
quad.add(new Quad(d, e + a2, f, d + a1, e + 2 * a2, f - a3, 1, 1, 1, 1, 1, true, true, 
       true, true, true, true));
... и что мы получаем уважаемый программист?? компьютер вынуждается нами 100 раз в секунду перечитывать класс Quad каждого элемента quad[i], и сбрасывает скорость до 20, а что будет с компьютером если на прийдется строить по такому алгоритмы мир? вот именно ничего.. поэтому я решил обратиться к вам коллега, для наглядности ( так как не многие программисты и сисадмины обременяют себя изучением графических движков) покажу на пальцах какую головоломку мне надо решить... допустим мы имеем простейшую программу для занесения людей (работников) в базу данных...
если лень разбирать мой быдлокод листайте ниже
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
import java.util.*;
public class No0012_Employee_test {
    public static void main(String[] args) {
        //zapolnenije massiva staff tremia objektami
        Employee6[] staff = new Employee6[3];
        staff[0] = new Employee6("Carl Cracker", 75000,
                1987, 12, 15);
        staff[1] = new Employee6("Harry Hacker", 50000,
                1989, 10, 1);
        staff[2] = new Employee6("Tony Tester", 40000,
                1990, 3, 15);
        //uvelichenije zarplati na 5%
        for (Employee6 e : staff)
            e.raiseSalary(5);
        //vivod informacii o vsech objektach Employee
        for (Employee6 e : staff)
            System.out.println("name=" + e.getName()
                    + ",salary" + e.getSalary()
                    + ",hireDay=" + e.getHireDay());
    }
}
class Employee6
{
    public Employee6(String n, double s,
            int year, int month, int day)
    {
        name = n;
        salary = s;
        GregorianCalendar calendar = new
                GregorianCalendar(year, month - 1, day);
        //v klasse GregorianCalendar janvaru sootvetstvujet 0.
        hireDay = calendar.getTime();
    }
    public String getName()
    {
        return name;
    }
    public double getSalary()
    {
        return salary;
    }
    public Date getHireDay()
    {
        return hireDay;
    }
    public void raiseSalary(double byPercent)
    {
        double raise = salary * byPercent / 100;
        salary += raise;
    }
    private String name;
    private double salary;
    private Date hireDay;
}
здесь мы создаем класс Работник в котором описываем имя, зарплату, дату найма сотрудника, и пару методов для увеличения зарплаты сотрудника и получения вышеуказанных данных, далее в классе main мы создаем массив(ничего не напоминает) в который заносим новый объект - нового сотрудника, итак , есть ли какой нибудь способ, что бы можно было бы переиспользовать объект класса Работник, тоесть внести в массив не одного сотрудника а несольких, чтобы программа читала класс Работник не один 3 раза а 1, если вы напрягете свои нейрончики и поможете мне я буду на седьмом небе, вам то конечно с этого ничего кроме морального удовлетворения если вы из таких... но тем не менее всем спасибо, обновляю страницу каждые 50-60 минут
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.07.2013, 14:20
Ответы с готовыми решениями:

Интерессная головоломка
Начал изучать Java. Выбрал книгу для обучения (очень популярная, как я понял, среди новичков), а...

Головоломка для сообразительных
Вчитываемся внимательно. Есть массив из цифр типа int. Нужно подсчитать количество разностей всех...

Интересная задача. Работа со строкой
В параметры метода вы получаете длинный текст который необходимо разбить на серию сообщений....

Интересная задача про Тараканчиков
Всем добрый день!:) Помогите, пожалуйста, найти ошибку в коде(у меня уже глаз замылился, видимо)...

1
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.07.2013, 02:35 2
пробегитесь по документу и его методам
http://commons.apache.org/prop... index.html
http://commons.apache.org/prop... tPool.html
можно также выкачать исходники и глянуть как организовано.

С работниками дело скорее всего не выгорит, так как класс простой и затраты на его переинициализацию сетерами, примерно равны созданию нового. Пулы оправданы в случае когда класс тяжелы в создании и при этом его легко переконфигурировать для использования в другом месте, а также когда класс вообще не требует переинициализации.

если ваш кубик тормозит, обратите внимание на математику внутри него, например деление на 2 можно ускорить операцией сдвига и тд. Не стоит создавать в каждом кубике рандом, передавайте в него инстанс 1го существующего или одного из уже готовых в пуле объектов. Вообще кубик можно переработать так, чтобы он получал инстанс класса хелпера, который будет генерить для него математику, а сам он при этом становится более легковесным, по возможности старайтесь выполнять операции над целыми числами, так как плавающяя запятая более ресурсоёмкая.

Если вы обратите внимание на спрайтовые игры, то увидите что многие обьекты ведут себя одинаково, но со смещением во времени и рандомно раскиданы по игровому пространству, а выглядят при этом как независимые - подумайте над этой идеей.
1
05.07.2013, 02:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2013, 02:35
Помогаю со студенческими работами здесь

Head First Java. Глава 4 стр 121 Задание "Головоломка у бассейна"
Может ли кто попроще объяснить, что происходит? Никак не могу понять до конца...package puzzle4; ...

Интересная информация, почитайте.
http://ricn.ru/humour/material/4966/

Интересная программа из С на Java
Собственно,долго мучался, но все таки получилось выполнить данное задание на С, но как на зло,...

Интересная головоломка
1.С помощью текстового редактора создать файл который содержит текст.Длина ряда с текстом не должна...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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