Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14

Удаление переменной, уменьшение нагрузки процессора

23.06.2013, 09:07. Показов 2288. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. У меня есть цикл который находится в таймере (openGl), в этом цикле при каждой итерации создается спрайт и сразу рисуется. Но так память очень засоряется и нагрузка ЦП растет в арифметической прогрессии. Как бы можно было удалять эту переменную-спрайт, чтоб нагрузка не росла? (пробовал memset (с 0), delete, но не помогает).
Вот примерный код моего цикла
C++
1
2
3
4
5
6
7
8
9
void render () // функция таймера
{
       for(int i=0;i<n;i++)//цикл
       {
             Sprite a = Sprite();//создаем спрайт
             a.draw();//рисуем
             //здесь хотелось бы удалить переменную a
       }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.06.2013, 09:07
Ответы с готовыми решениями:

Работа с консолью. Уменьшение нагрузки на ЦП
Значит имеется следующий код: #include &lt;conio.h&gt; #include &lt;iostream&gt; int main() { bool bExit = false; while (!bExit) { ...

Уменьшение нагрузки и износа HDD
Приветствую всех. Купил ноут б/у с hdd, и задумался вот над каким вопросом: если перенести на флешку по максимуму программы,...

Работа скрипта - уменьшение нагрузки на сервер
ситуация: есть скрипт который проверяет список ссылок, посылает запрос, получает код ответа, ссылок ~1000, используется класс http_request....

21
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:31
Не совсем понятно, почему растёт нагрузка. Сам Sprite как создаётся? В динамической памяти?
1
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
23.06.2013, 10:35
@integerBrain, а если создать тот спрайт вне цикла? А в цикле, присваивать ему просто новые значения.
1
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:39
Деструктор, с освобождением памяти, у Sprite есть?

Добавлено через 1 минуту
Если есть, то можно так попробовать:
C++
1
2
3
4
5
6
7
8
9
10
void render () // функция таймера
{
       for(int i=0;i<n;i++)//цикл
       {
            { Sprite a = Sprite();//создаем спрайт
             a.draw(); } //рисуем
 
             //здесь хотелось бы удалить переменную a
       }
}
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
23.06.2013, 10:47
Попробовать-то можно, но чем это принципиально отличается от исходного варианта?
2
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 10:56
Цитата Сообщение от Somebody Посмотреть сообщение
Попробовать-то можно, но чем это принципиально отличается от исходного варианта?
Как это чем? При выходе из созданной локальной области, сработает деструктор и память освосбодится под a.

Добавлено через 4 минуты
Если она, конечно, выделяется в конструкторе.
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:32  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Не совсем понятно, почему растёт нагрузка. Сам Sprite как создаётся? В динамической памяти?
На сколько я знаю чтоб создать Sprite в динамической памяти нужно new Sprite();. А что дальше?
/////////////////////////////////////////////////////////////////////////////////////
Цитата Сообщение от alsav22 Посмотреть сообщение
Как это чем? При выходе из созданной локальной области, сработает деструктор и память освосбодится под a.

Добавлено через 4 минуты
Если она, конечно, выделяется в конструкторе.
А как мне выделить память в конструкторе и, что потом делать в деструкторе?
/////////////////////////////////////////////////////////////////////////////////////
Цитата Сообщение от SeregaC++ Посмотреть сообщение
@integerBrain, а если создать тот спрайт вне цикла? А в цикле, присваивать ему просто новые значения.
Я делаю текстовое поле на OpenGl, каждый символ это спрайт, а спрайт загружает в себя картинку. Текст может в любой момент изменится и потому нужно заново рисовать все символы.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 11:41
Вы попробовали, как я предложил в 4 посте?

Добавлено через 1 минуту
Sprite это ваш класс или библиотечный?
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:41  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы попробовали, как я предложил?
Конкретно с своим примером нет, но я создавал переменную с каким-то значением и потом пробовал delete её, но при этом количество байт использоваемое программой не изменилось.
//////
Мой, вообще он называется Sprite2D.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 11:45
грузить картинки в функции отрисовки - это бред вообще. спрайты должны быть готовы для отрисовки к моменту этой отрисовки, иначе, при таком подходе рендеринг будет жутко тормозной.
и прежде чем бороться за меньшее потребление памяти - убедитесь что это действительно проблема. убеждаться нужно правильными тулзами, а не каким-нибудь таскменеджером.
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:49  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
грузить картинки в функции отрисовки - это бред вообще. спрайты должны быть готовы для отрисовки к моменту этой отрисовки, иначе, при таком подходе рендеринг будет жутко тормозной.
Да не в этом же проблема. Я могу создавать спрайты в момент введения текста и забивать их в вектор, а в функии отрисовки рисовать, проблема в том, что "старые" спрайты "старого" текста (которые уже не нужны) остаются в памяти и грузят её. Каждый символ прибавляет к загрузке ЦП n-ое количество байт. И это плохо.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 11:56
что-то я не понимаю. вы утверждаете, что если я выделю скажем килобайт и буду его просто держать в памяти , ничего с ним не делая, то загрузка процессора будет скажем на n очков. а если мегабайт - то проц нагрузится на 1024*n очков. так чтоли?
Если что-то висит в памяти, то значит ее не зачистили. И это не за счет того, что локальные переменные какие-то плохие. Просто чей-то деструктор неверно отрабатывает. Конкретно в приведенном коде утечек никаких нет. Нужно смотреть деструкторы спрайтов.
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 11:59  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
что-то я не понимаю. вы утверждаете, что если я выделю скажем килобайт и буду его просто держать в памяти , ничего с ним не делая, то загрузка процессора будет скажем на n очков. а если мегабайт - то проц нагрузится на 1024*n очков. так чтоли?
Если что-то висит в памяти, то значит ее не зачистили. И это не за счет того, что локальные переменные какие-то плохие. Просто чей-то деструктор неверно отрабатывает. Конкретно в приведенном коде утечек никаких нет. Нужно смотреть деструкторы спрайтов.
Мне конечно ужасно стыдно это говорить, но все деструкторы моих классов пусты. Я, к сожалению, с памятью не умею работать.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 12:02
Цитата Сообщение от integerBrain Посмотреть сообщение
Мой, вообще он называется Sprite2D.
Покажите конструктор вашего класса.
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:05  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Покажите конструктор вашего класса.
C++
1
2
3
4
5
6
Sprite2D::Sprite2D(void)
{
    parent = NULL;
    texturesInfo.push_back(NULL);
    texturesInfo.push_back(NULL);
}
Вот, на всякий случай заголовочный файл:
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
#pragma once
#include <iostream>
#include "Graphics2D.h"
#include <gl\glut.h>
#include <gl\GLAux.h>
#include "Object2D.h"
using namespace std;
class Sprite2D : public Object2D
{
private:
    unsigned int textures[2];
    void drawTextures(void);
public:
    char* pathToTexture;
    char* pathToMask;
    vector<AUX_RGBImageRec *> texturesInfo;
    vector<Sprite2D *> childs;
    Graphics2D graphics;
    Sprite2D(void);
    Object2D *parent;
    Vector2D globalPos;
    void loadBmpTexture(char *url);
    void loadBmpMask(char *url);
    void addChild(Sprite2D* child);
    void drawTexture(int i);
    //object 2D
    virtual bool hitTestObject(Object2D object);
    virtual bool hitTestPoint(Vector2D point);
    virtual void draw(void);
    virtual void render(void);
    //
    ~Sprite2D(void);
};
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.06.2013, 12:09
Реализацию draw() покажите.
0
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:11  [ТС]
Цитата Сообщение от alsav22 Посмотреть сообщение
Реализацию draw() покажите.
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
void Sprite2D::draw(void)
{
    if(visible)
    {
        glPushMatrix();
        glTranslated(x, y, 0);
        glRotated(rotation, 0, 0, 1);
        glScaled(scaleX, scaleY, 1);
        //draw texture рисую текстуру
        drawTextures();
                //рисую детей
        for(int i=0;i<childs.size();i++)
        {
            childs[i]->draw();
        }
        //
        glPopMatrix();
    }
}
 
void Sprite2D::drawTextures(void)
{
    glEnable(GL_BLEND);
    //draw mask
    glBlendFunc(GL_DST_COLOR,GL_ZERO);
    drawTexture(1);
    //draw texture
    glBlendFunc(GL_ONE, GL_ONE);
    drawTexture(0);
    //
    glDisable(GL_BLEND);
}
В функции drawTexture ничего интересного, только рисование самой текстуры на уровне OpenGl
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 12:17
C++
1
2
   vector<AUX_RGBImageRec *> texturesInfo;
   vector<Sprite2D *> childs;
вот это это что? если это что-то динамически выделенное - то оно будет занимать память и после смерти вашего спрайта. дефолтный деструктор не удалит то, на что указывают элементы этих векторов.

unsigned int textures[2]; - вот это тоже. если текстуры были загружены, то в какой-то момент (например в деструкторе) их нужно выгружать. дефолтный для этого не годится. в нем нужно специальный код для этого писать.

а еще вы говорили что при хранении в векторе своих спрайтов проблема остается. для того, чтобы все было хорошо, помимо правильных деструкторов придется еще написать оператор и конструктор копирования. или запретить их. или еще что-то сделать. просто так такие спрайты в векторе держать не получится. будут глюки.
1
0 / 0 / 0
Регистрация: 16.04.2013
Сообщений: 14
23.06.2013, 12:20  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
C++
1
2
   vector<AUX_RGBImageRec *> texturesInfo;
   vector<Sprite2D *> childs;
вот это это что? если это что-то динамически выделенное - то оно будет занимать память и после смерти вашего спрайта. дефолтный деструктор не удалит то, на что указывают элементы этих векторов.

unsigned int textures[2]; - вот это тоже. если текстуры были загружены, то в какой-то момент (например в деструкторе) их нужно выгружать. дефолтный для этого не годится. в нем нужно специальный код для этого писать.
В первом векторе хранится информация о текстуре, в втором другие спрайты который добавлены в данный спрайт. В данном случай childs пустой.
//
Вы не подсказали бы, как выгружать элементы из вектора и массива?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
23.06.2013, 12:27
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  vector<int*> v;
  v.push_back(new int(0))
 
} // вот в этом месте деструктор вектора удалит всю память на те
// элементы, которые в нем хранятся. в нашем случае это один указатель на инт.
// но то, на что это указатель указывал - не удалится. это утечка. тут нужно
// явно удалять элементы:
 
{
  vector<int*> v;
  v.push_back(new int(0))
 
  for (auto it = v.begin(), end = v.end(); it != end; ++it)
  {
     delete *it; // удаление для каждого элемента.
  }
}
в вашем случае вместо делете могут быть вызовы, выгружающие текстуры или еще что-то другое. сами по себе они не выгрузятся.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.06.2013, 12:27
Помогаю со студенческими работами здесь

Уменьшение нагрузки на сервер, путем хеширования изображений в базу данных
Добрый вечер. У меня есть проект (в разработке), он основан на одном едином сервисе (ASP.NET MVC API), и он имеет одну лишь HTML страницу,...

Минимализирования нагрузки процессора
Доброго времени суток, если я много раз в скрипте обращаюсь к компоненту скрипта другого объекта то для ускорения мне нужно сделать на него...

Предел для нагрузки процессора.
Вот у меня вопрос. У меня в программе продолжительное время идут вычисления, и процессор загружен на 100% (я естественно пользуюсь...

Какова нормальная температура процессора без нагрузки?
Хотелось бы узнать, сколько должна быть температура процессора без нагрузки? А то у меня на одном пк 35-40 а на другом 60-65

Температура процессора 85 градусов при 26% нагрузки в игре
Привет форумчане, помогите! Процессор i7 4960x, охлаждение Corsair H100i GTX v2, материнка gigabyte x79 ud3 v1.1. Температура...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru