Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/47: Рейтинг темы: голосов - 47, средняя оценка - 4.94
 Аватар для Sergeev Fedor
6 / 5 / 1
Регистрация: 22.01.2016
Сообщений: 100

Как подсчитать FPS (OpenGL/C++) ?

24.12.2017, 21:10. Показов 10775. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, само задание звучит так: В программе нужно генерировать случайный набор точек с тремя характеристиками: 1)цвет; 2)размер; 3)положение. Должно быть 3 режима вывода: 1) непосредственное; 2) в дисплейный список; 3) массив вершин. В интерфейсе должно быть измерение количества точек, её регенерация, измерение производится в кадрах в секунду. Подскажите пожалуйста, какие строчки добавить для подсчета fps ?

C++
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
#include <GL/glut.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <gl/glaux.h>
using namespace std;
 
#pragma comment(lib, "glaux.lib")
unsigned int textures[1];
 
bool  keys[256];
float trX=0.0;
float trY=0.0;
float trZ=-1.0;
float x,y,z;
int n, p;
 
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glDisable(GL_TEXTURE_2D);
  glNewList(1,GL_COMPILE);
  cout << "Kolichestvo tochek = ";
  cin >> n;
  cout << "For obnovlenia - '8': ";
  cin >> p;
  if (p==8) {
    for (int i=0; i<=n; ++i)
    {
    glColor3f((float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX);
    glPointSize(1 + rand() % 7);
    glEnable(GL_POINT_SMOOTH);
    glBegin(GL_POINTS);
    x=0.0002*((rand() % 10001)-5000);
    y=0.0002*((rand() % 10001)-5000);
    z=0.0002*((rand() % 10001)-5000);
    glVertex3f(x, y, z);
    glEnd();
  glFinish();
    //glutSwapBuffers();
  }
  glEndList();
  glCallList(1);
  glEnable(GL_TEXTURE_2D);
    glFinish();
    glutSwapBuffers();
  p=0;
  }
    glutPostRedisplay();
}
int main(int argc, char **argv)
{
    srand(time(NULL));
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(852, 480);
    glutInitWindowPosition(0, 86);
    glutCreateWindow("Point");
  glEnable(GL_TEXTURE_2D);
    glClearColor(0, 0, 0, 1.0);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1, 0, 100);
    glTranslatef(trX,trY,trZ);
    glutDisplayFunc(display);
    glutMainLoop();
}
Добавлено через 21 минуту
Подскажите наиболее простой способ
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2017, 21:10
Ответы с готовыми решениями:

Как подсчитать FPS и вывести на экран?
Загрузила 15625 консервных банок и мой движок начал тормозить. Вот хотелось бы узнать сколько у меня FPS будет при этом. Если кто...

OpenGL и FPS
Пустое окно, в котором нарисованы две линии, выдает 420 FPS, это нормально или должно быть больше?

FPS в Delphi с использованием OpenGL (dglOpenGL)
Читал в гайде по OpenGL, что есть возможность регулировки FPS, но как, не объяснялось Можно ли узнать как это вообще делается, потому...

21
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
26.12.2017, 10:07
Студворк — интернет-сервис помощи студентам
Sergeev Fedor,
предполагаю, что кол-во точек нужно вводить только в момент инициализации.
Короче, избавься от всех cin внутри display, они блокируют выполнение программы. Вместо этого можешь попробовать нубскую связку из kbhit и getch, или функцию GetKeyState().

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

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

Как я понимаю, задача у тебя сравнить скорость работы этих трех способов?
Сделай 3 функции: display1, display2, display3 для каждого из режимов. При запуске программы вводишь n и номер режима. У тебя генерируется набор случайных точек, который выводится на экран одним из заданных способов.
1
 Аватар для Sergeev Fedor
6 / 5 / 1
Регистрация: 22.01.2016
Сообщений: 100
26.12.2017, 13:56  [ТС]
nonedark2008, да вы совершенно правы задача как раз и есть в том, чтобы сравнить скорость работы этих трёх способов (fps).

Добавлено через 25 минут
nonedark2008, первый режим я правильно реализовал по вашей задумке?

C++
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
#include <GL/glut.h>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <gl/glaux.h>
using namespace std;
 
#pragma comment(lib, "glaux.lib")
#pragma comment(lib, "winmm.lib")
int FPS;
unsigned int textures[1];
 
bool  keys[256];
float trX=0.0;
float trY=0.0;
float trZ=-1.0;
float x,y,z;
int n, p;
float NowTickCount=0;
float LastTickCount=0;
 
int myFPS()
{
    static int start = GetTickCount();
    static int frames = 0;
    static int fps = 0;
 
    int timer = GetTickCount()-start;
    frames++;
 
    if((timer) >= 1000)
    {
        fps = frames; 
        frames = 0;
        timer = 0;
        start = GetTickCount();
    }
    return fps;
}
 
void display1()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //cout << "Kolichestvo tochek = ";
    //cin >> n;
    for (int i=0; i<=n; ++i)
    {
    glColor3f((float)rand() / RAND_MAX, (float)rand() / RAND_MAX, (float)rand() / RAND_MAX);
    glPointSize(1 + rand() % 7);
    glEnable(GL_POINT_SMOOTH);
    glBegin(GL_POINTS);
    x=0.0002*((rand() % 10001)-5000);
    y=0.0002*((rand() % 10001)-5000);
    z=0.0002*((rand() % 10001)-5000);
    glVertex3f(x, y, z);
    glEnd();
    glFinish();
    }
    glutSwapBuffers();
    cout << "FPS = " << myFPS() << "\n";
    //glutPostRedisplay();
}
int main(int argc, char **argv)
{
    srand(time(NULL));
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(852, 480);
    glutInitWindowPosition(0, 86);
    glutCreateWindow("Point");
    glEnable(GL_TEXTURE_2D);
    glClearColor(0, 0, 0, 1.0);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1, 0, 100);
    glTranslatef(trX,trY,trZ);
    cout << "Kolichestvo tochek = ";
    cin >> n;
    cout << "Choose regim = ";
    cin >> p;
    if (p==1)
    glutDisplayFunc(display1);
    glutMainLoop();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.12.2017, 13:56

Как подключить OpenGL под C# и как потом пользоваться функциями OpenGL
Уже неодонкратно поднималась тема о том, как подключить OpenGL под C# и как потом пользоваться функциями OpenGL. Я понимаю, что есть...

Perl + OpenGL Как избавиться от повторного подключения библиотеки OpenGL в модулях
Доброго времени суток! Сегодня решил заняться программированием на языке Perl, используя библиотеку OpenGL :D Возникли вопросы: ...

Создаю игру с научным уколоном на C++/opengl. Как подключить openGL и добиться кроссплатформенности
Я читал про opengl - для его инициализации нужно создавать windows - окно. Для linux видимо инициализация происходить по другому. как мне...

Микрофризы , падения фпс , низкий 1% FPS и 0.1% fps
MSI Z370 A-PRO Intel i5-8600K ( Thermalright Macho Rev.A (BW) ) DDR4 2666 apecer 2 плашки по 8gb / разогнан до 3000 MSI rtx 2080...

Сильно отличаются OpenGL ES и OpenGL и как?
Сильно отличаются OpenGL ES и OpenGL и как?


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

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru