添加到数组C++

Adding to arrays C++

本文关键字:C++ 数组 添加      更新时间:2023-10-16

只是想知道如何以以下方式将int添加到数组中;

我得到了游戏的平均帧速率,但据我所知,如果我创建一个[10]的int数组,我就无法在数组的开头添加一个数字。

我想这么做。

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

我想把30加到myInt[0]上,让它把当前的myInt[0]移动到[1],把[1]移动到[2],所以它只把所有的东西都沿着一移动,然后从数组中去掉最后一个整数。

到目前为止,我试图做的只是改变[0],使我的平均计算变得毫无用处。此外,我正在使用SDL_GetTicks()来获取当前经过的时间。

有没有更好的方法来实现平均帧速率?

听起来像是想要一个循环队列。我会用帧计数器调查运算符"%"。帧计数器总是上升,更新myInt[frame_counter%MY_INT_LENGTH],然后映射reduce myInt并除以MY_INT_ELENGTH。

我建议存储最后8或16个帧速率,而不是10个。这使得mod操作符成为一个位掩码。

编辑

如果你想要一个平均帧速率,你真正应该做的是检查delta_frames/delta_time

在渲染线程或观察者中,每次帧渲染都会增加一个计数器。然后问有多少帧,除以时差。您可以异步轮询平均帧速率,并在轮询时重置帧计数器。

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);

您应该能够在原始代码中看到您似乎理解的方法。

有没有更好的方法来实现平均帧速率?

为什么是。。。。

以下是我以前使用过的一些代码,用于跟踪视频渲染应用程序的"帧速率"。它是为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;
        }
    }
}