Добавление в массивы C ++ - PullRequest
1 голос
/ 13 января 2012

просто интересно, как бы я добавил добавление целых чисел в массив следующим образом;

Я получаю среднюю частоту кадров для моей игры, но насколько я понимаю, если я создаю массив int [10], у меня нет собственного способа просто добавить число в начало массива.

Я хочу сделать это.

myInt[0] = 60
myInt[1] = 59
myInt[2] = 61

Я хочу добавить, скажем, 30, в myInt [0] и заставить его переместить текущий myInt [0] в [1] и [1] в [2], чтобы он просто перемещал все по одному и отбрасывал последнее целое число из массива.

То, что я пытался сделать до сих пор, просто меняет [0], делая мои средние вычисления бесполезными. Кроме того, я использую SDL_GetTicks () для определения текущего истекшего времени.

Есть ли лучший способ сделать среднюю частоту кадров?

Ответы [ 3 ]

2 голосов
/ 13 января 2012

звучит так, как будто вы хотите круговую очередь. Я бы исследовал оператор "%" со счетчиком кадров. Ваш счетчик кадров всегда увеличивается, вы обновляете myInt [frame_counter% MY_INT_LENGTH], затем отображаете карту myInt и делите на MY_INT_LENGTH.

Я бы предложил хранить последние 8 или 16 кадров вместо 10. Это делает мод-оператор битовой маской.

EDIT

Если вы хотите получить среднюю частоту кадров, вам стоит проверить delta_frames / delta_time

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

1 голос
/ 13 января 2012

std :: vector - это то, что вы должны использовать вместо массивов, хотя std :: queue в этом случае.

Быстрый / грязный код, показывающий, как это будет работать:

int sum = 0; // should be wrapped in a class or something
const int max_size = 10;

void add(std::queue<int>& q, int fps) {
  q.push(fps);
  if(q.size() > max_size) {
    sum -= q.front();
    q.pop();
  }
  sum += fps;
}

int avg(std::queue<int>& q) {
  return sum / q.size();
}

//...

std::queue<int> myQ;
add(myQ, 60);
add(myQ, 61);
add(myQ, 50);
std::cout << avg(myQ);

Вы должны быть в состоянии увидеть метод, как вы, кажется, понимаете его в исходном коде.

0 голосов
/ 13 января 2012

Есть ли лучший способ сделать среднюю частоту кадров?

Почему да ....

Вот код, который я использовал раньше, чтобы отслеживать «частоту кадров» для приложения рендеринга видео. Это было написано для приложения Windows. Если вы не используете Windows, замените все приведенные ниже типы «DWORD» на «unsigned int». И замените вызов GetTickCount функцией SDL_getticks (). Это довольно просто. Вызывайте OnFrame каждый раз при рендеринге нового кадра. Вызывайте GetFrameRate всякий раз, когда хотите узнать это.

class CFrameRateMonitor
{
private:
    static const DWORD DEFAULT_INTERVAL = 2000;
    bool m_fFirstFrame;
    DWORD m_dwInterval;  // how often we recompute the average
    DWORD m_dwFrames;
    DWORD m_dwStartTime;
    DWORD m_dwComputedRate;
public:
    CFrameRateMonitor();

    void Reset();
    void OnFrame();
    DWORD GetFrameRate();
    void SetInterval(DWORD dwInterval);
};



CFrameRateMonitor::CFrameRateMonitor()
{
    Reset();
    m_dwInterval = DEFAULT_INTERVAL;
}

void CFrameRateMonitor::SetInterval(DWORD dwInterval)
{
    m_dwInterval = dwInterval;
}

void CFrameRateMonitor::Reset()
{
    m_dwFrames = 0;
    m_dwStartTime = 0;
    m_dwComputedRate = 0;
    m_fFirstFrame = true;
}

DWORD CFrameRateMonitor::GetFrameRate()
{
    return m_dwComputedRate;
}

void CFrameRateMonitor::OnFrame()
{
    DWORD dwCurrentTime = GetTickCount();
    DWORD dwActualInterval = dwCurrentTime - m_dwStartTime;

    if (m_fFirstFrame)
    {
        m_dwStartTime = dwCurrentTime;
        m_fFirstFrame = false;
    }
    else
    {
        m_dwFrames++;
        if (dwActualInterval >= m_dwInterval)
        {
            // enough time has passed to compute a new interval
            // + 500 to "round up"
            m_dwComputedRate = (m_dwFrames * 1000 + 500) / dwActualInterval; 
            // reset counting
            m_dwStartTime = dwCurrentTime;
            m_dwFrames = 0;
        }
    }
}
...