с ++ высокая память и процессор - PullRequest
0 голосов
/ 17 августа 2010

хорошо, у меня есть простая игра, которая использует очень много памяти и процессора.Процессор переходит на 44%, а память - на 5000. Вот мой код

Код

как это исправить?РЕДАКТИРОВАТЬ память: 5000 байт.процессор: 44% на i5программа становится медленнее к тому времени, как она запускается.

Ответы [ 3 ]

2 голосов
/ 17 августа 2010

Лучший способ решить что-то подобное - закомментировать большие куски кода, пока вы не перестанете видеть разгруженный процессор / память, а затем постепенно раскомментировать эти куски, пока не обнаружите проблему.Сканирование кода, мне интересно, почему вы запускаете одиннадцать таймеров для обновления ваших игровых объектов.Было бы лучше иметь один таймер, который обновляет все сразу, а затем выполняет один вызов Invalidate.

2 голосов
/ 17 августа 2010

Это слишком много кода для тщательного изучения.

Некоторые общие советы: оцените, сколько памяти вы ожидаете использовать.Растет ли использование памяти во время работы или оно перестает расти в какой-то момент?Если он постоянно растет, у вас, вероятно, есть утечка.Существуют пакеты, которые могут помочь вам отследить утечку или убедиться, что вы используете RAII (например, shared_ptr) для управления вашей памятью.Если память остается стабильной при большом количестве, вы можете пересмотреть свой алгоритм и посмотреть, где используется память.Вы распределяете много дублирующих данных?

Что касается использования ЦП, единственный способ выяснить, куда уходит время, - профилировать ваше приложение и посмотреть, где профилировщик говорит, что ЦП расходуется.Затем вы можете подойти к этому небольшому фрагменту кода и определить, как его улучшить.Наиболее вероятными улучшениями являются поиск алгоритмов полиномиального (или худшего) времени и превращение их в субполиномиальное время.

1 голос
/ 18 августа 2010

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

Я обычно использую что-то вроде

while(gameIsRunning) //Set this to false when the WM_QUIT message arrives
  {
  //handle all messages, if any
  while (PeekMessage(&msg, hwnd,  0, 0, PM_REMOVE)) 
    {
    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
    }

  //addition per loop code
  //...

  Sleep(1);
  }

Кроме того, вам следует отказаться от таймеров и посмотреть на QueryPerformanceTimer и QueryPerformanceFrequency для измерения и измерения.

...