Russian Qt Forum
Апрель 29, 2024, 11:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: заточка кода под быстродействие.  (Прочитано 9334 раз)
ieroglif
Гость
« : Декабрь 14, 2009, 09:15 »

посоветуйте, чего почитать для создания максимально быстро действующего кода на Qt?
посмотрите класс - может чего подскажите для убыстрения?

класс создан для обсчитывания объектов на 3d сцене, сортировки этих объектов по глубине и вызова их метода рисования (в порядке сортировки)

qglrenderer.h
Код:
#ifndef QGLRENDERER_H
#define QGLRENDERER_H

#include <QObject>
#include <QMap>
#include "glheaders.h"
#include "qglcamera.h"

class QGLObject;

class QGLRenderer : public QObject
{
Q_OBJECT
public:
    QGLRenderer();
void RegisterObject(QGLObject *obj);
void UnregisterObject(QGLObject *obj);
void Render();
bool HasObjects();

static QGLCamera *camera;
public slots:
void ToRender(QGLObject *obj);
private:
QMap<QGLObject*,bool> objects;
};

#endif // QGLRENDERER_H

qglrenderer.cpp
Код:
#include "qglrenderer.h"
#include "qglobject.h"
#include <QList>

QGLCamera* QGLRenderer::camera;

QGLRenderer::QGLRenderer()
{
objects.clear();
}

void QGLRenderer::RegisterObject(QGLObject *obj)
{
if ( objects.contains(obj) ) return;
objects.insert(obj,false);
connect(obj,SIGNAL(ToRender(QGLObject*)),this,SLOT(ToRender(QGLObject*)));
}

void QGLRenderer::UnregisterObject(QGLObject *obj)
{
if ( objects.contains(obj) ) {
objects.remove(obj);
disconnect(obj,SIGNAL(ToRender(QGLObject*)),this,SLOT(ToRender(QGLObject*)));
}
}

void QGLRenderer::ToRender(QGLObject *obj)
{
RegisterObject(obj);
objects[obj] = true;
}

void QGLRenderer::Render()
{
QGLObject *obj;
QMap<GLfloat,QGLObject* > map;
QList<QGLObject* > r_map;
QMap<QGLObject*,bool>::const_iterator i = objects.constBegin();
while ( i != objects.constEnd() ) {
if ( i.value() == true ) {
obj = i.key();
map.insertMulti(obj->DistanceTo(),obj);
}
i++;
}
QMap<GLfloat,QGLObject* >::const_iterator j = map.constBegin();
while ( j != map.constEnd() ) {
obj = j.value();
r_map.append(obj);
j++;
objects[obj] = false;
}
for ( int k=r_map.size()-1;k>=0;k-- ) {
r_map.at(k)->Render();
}
}

bool QGLRenderer::HasObjects()
{
if ( objects.isEmpty() ) return false;
return true;
}

на сколько "выгодно/невыгодно" использование контейнеров типа QList или QMap ?
на данный момент этот код обсчитывает около 600 объектов (сравнивает их растояние до камеры, и потом вызывает им функцию рисования) на сцене, выдавая 20-25 фпс, с туманом и 3-4 источниками света при следующем железе-софте:
Asus z99h видюха intel 945, оперативы 1.5 гига, ос Kubuntu 9.04 полуубитый всякими экспериментами, Qt 4.5.2
и я уже упарился от такого мракобесия.
хочется сделать красивую сцену, но стоит докинуть текстурку - получаю минус в скорости. докидываю источник света - та же хрень и так далее... в общем, не предлагайте оптимизировать ноутбук (лучше дайте бабло на это.. а предложить я и сам себе могу), а посоветуйте, в чём может быть загвозка кода? где искать возможности ускорения?
Записан
BRE
Гость
« Ответ #1 : Декабрь 14, 2009, 09:52 »

Что значит 600 объектов?
А сколько это в полигонах?
1 объект из 10000 полигонов != 10 объектам из 100 полигонов каждый.
Записан
ieroglif
Гость
« Ответ #2 : Декабрь 14, 2009, 10:17 »

600 объектов - это 600 объектов.
у меня не учитываются точки пересечения и прочее - всё просто.
надо просто отсортировать объекты по дальности от камеры что бы вывести их по удалению от камеры.
так что количество полигонов не влияет на сортировку по глубине.
полигонов суммарно несколько тысяч (и конечно окажется очень обломным, если даже несколько тысяч полигонов мои руки отображают криво и медленно).
Я понимаю что их число тоже влияет на скорость, но вывод объекта уже постарался оптимизировать по максимуму - в максе сделано минимальное количество полигонов, полигоны отрисовываются разовым массивом
Код:
void QGLMesh::Draw()
{
glNormalPointer(GL_FLOAT,0,normales);
glVertexPointer(3,GL_FLOAT,0,vertexes);
glDrawArrays(GL_TRIANGLES,0,numVertex);
}
В общем, в этом вопросе есть много доков в сети и есть откуда набираться знаний по оптимизации. Я ничуть не отказываюсь от советов по любым вопросам, просто сейчас хотелось бы углубиться в вопросы касательные именно Qt.
А тут - вопросы
1. ООП проектирования. неверная архитектура - это уже однозначный минус. К сожалению не получилось пока найти чего-то в сети по этому вопросу, поэтому буду рад, если есть чего.
2. C++ программирования под Qt - вот это, как мне кажется, в этом форуме и обсуждается в первую очередь. Соотсвественно - как писать под Qt на С++ максимально быстрый код? где кроются подводные камни, как делать правильно? как не надо делать? для примера как выложил кусок кода, в котором подозреваю один из подводных камней.
Записан
BRE
Гость
« Ответ #3 : Декабрь 14, 2009, 10:26 »

Метод render:
Для чего несколько раз перекладывать из одного контейнера в другой?
Из map в r_map, а только потом рисуем объекты из r_map?
Код
C++ (Qt)
       QMap<GLfloat,QGLObject* >::const_iterator j = map.constBegin();
       while ( j != map.constEnd() ) {
               obj = j.value();
               r_map.append(obj);
               j++;
               objects[obj] = false;
       }
       for ( int k=r_map.size()-1;k>=0;k-- ) {
               r_map.at(k)->Render();
       }
 
Записан
niXman
Гость
« Ответ #4 : Декабрь 14, 2009, 10:34 »

В общем, код вообще не оптимизирован Грустный
1. Как вам наверное известно, вставка элементов в нераспределенный контейнер, требует выделения памяти и/или связывания указателей предыдущий/следующий(это в том случае, если контейнером является двусвязный список), если же контейнером является вектор, это еще хуже.
Но QMap<> реализован на основе списка.

2. "r_map.at(k)->Render()" - очень медленный код.
Записан
niXman
Гость
« Ответ #5 : Декабрь 14, 2009, 10:39 »

Я про доступ по индексу.
map<>, быстрей индексируется по ключу.
Записан
ieroglif
Гость
« Ответ #6 : Декабрь 14, 2009, 10:59 »

BRE , честно сказать, сейчас смотрю на этот кусок и сам не понимаю почему именно так =( попробывал переписать, поиграться - перестало корректно сортировать и работать.
Помню что QMap был выбран специально как самосортирующийся.
niXman , понимаю что код не отимизированный - программист я не особый, только учусь. Можно ссылки на доки-маны ума поднабраться, или пример как оно должно быть?
Записан
niXman
Гость
« Ответ #7 : Декабрь 14, 2009, 11:06 »

http://www.ozon.ru/context/detail/id/1273200/
http://www.ozon.ru/context/detail/id/2342923/
http://www.ozon.ru/context/detail/id/2381848/
http://www.ozon.ru/context/detail/id/3817580/

желательно все Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 14, 2009, 11:16 »

ieroglif по поводу контейнеров Qt и их шустрости смотри Базовые контейнеры (на русском)

И в частности раздел "Алгоритмическая сложность"
« Последнее редактирование: Декабрь 14, 2009, 11:19 от lit-uriy » Записан

Юра.
ieroglif
Гость
« Ответ #9 : Декабрь 14, 2009, 12:06 »

niXman, lit-uriy спасибо большое - пошёл читать.

Оффтопиком спрошу ещё - может посоветуете ещё чего почитать по общей архитектуре? Делаю игру, описал геймплей - всё нормально. Дошёл до сетевой игры, и понял что текущая архитектура классов не увязывается с сетевой игрой и наступил ступор - как вообще делаются сетевые движки?
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #10 : Декабрь 14, 2009, 12:39 »

"Решение сложных задач на C++" - 2 раза указал. Убери, а то впадет в рекурсию Улыбающийся
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
niXman
Гость
« Ответ #11 : Декабрь 14, 2009, 12:47 »

Книги то разные Подмигивающий
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #12 : Декабрь 14, 2009, 13:08 »

Книги то разные Подмигивающий
Не уверен. Проверь первую и последнюю ссылку.
По крайне мене название одинаковое.
Или так показалось..
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Dendy
Гость
« Ответ #13 : Декабрь 14, 2009, 14:39 »

... как вообще делаются сетевые движки?

Как раз сейчас пишу один, не сетевой, а мультиплеерный. Случайному прохожему всех тонкостей не расскажешь, сложность задумки не позволяет. Экспериментируйте.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 14, 2009, 14:58 »

1) На 600 единицах (объектах) проходит все что угодно и много на контейнерах не сэкономить. Все же я бы делал попроще

Цитировать
struct CDistObj {
 OGLObject * mObj;
 float  mDist;

 bool operator < ( const CDistObj & sec ) const { return mDist < sec.mDist; }
};

QSet <CDistObj> theDistObj;
// очевидные операции вставки и.т.п

2) Рендер "по расстоянию от камеры" дает ограниченные возможности, но если уж Вы так решили - то почему Вы каждый раз выводите ВСЕ объекты "задом наперед"? Делаете по расстоянию - так крутите оптимизацию с буфером (и при удалении тоже)

3)
Цитировать
хочется сделать красивую сцену, но стоит докинуть текстурку - получаю минус в скорости. докидываю источник света - та же хрень и так далее...
Хммм... а на что Вы рассчитывали? Если при добавлении текстуры/света скорость падает - то при чем здесь контейнеры?  Улыбающийся Откуда убежденность что все должно быть real-time на любом железе?  Для начала отключите туманы и прочие красоты.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.074 секунд. Запросов: 23.