小编Tyl*_*iel的帖子

Nvidia图形驱动程序导致明显的框架口吃

好的,我已经研究了这个问题几天了,所以让我回顾一下目前为止我所知道的,这让我相信这可能是NVidia的驱动程序而不是我的代码的问题.

基本上我的游戏在运行几秒后开始出现口吃(随机帧需要70ms而不是16ms,在规则模式上).仅当在Nvidia控制面板中启用了"线程优化"设置(最新驱动程序,Windows 10)时才会发生这种情况.不幸的是,此设置默认启用,我宁愿不必让人们调整他们的设置以获得愉快的体验.

  • 游戏不是CPU或GPU密集型(没有vsync的帧为2ms).它没有调用任何需要同步数据的openGL函数,也没有流式传输任何缓冲区或从GPU或其他任何东西读取数据.关于最简单的渲染器.

  • 问题始终存在,当我在fmod中添加音频时,它才开始变得明显.fmod不是这个的原因(更多在后期)

  • 尝试使用NVidia Nsight调试问题使问题消失."开始收集数据"立即导致口吃消失.这里没有骰子.

  • 在Profiler中,"nvoglv32.dll"花费了大量的cpu时间.如果启用了线程优化,则此过程仅生成.我怀疑这是一个同步问题,因此我使用visual studio Concurrency Viewer进行调试.

  • A-HA! vsyncs

  • 调查nvidia线程上的这些CPU时间块,我可以在其callstack中获得的最早命名函数是" CreateToolhelp32Snapshot ",然后在Thread32Next中花费了大量时间.我在早期查看CPU时间时发现了分析器中的Thread32Next,所以这看起来好像我在正确的轨道上.

  • 因此,看起来nvidia驱动程序会出于某种原因定期抓取整个过程的快照?可能是什么原因,为什么会这样做,我该如何制止呢?

  • 这也解释了为什么一旦我在fmod中添加问题就开始变得明显,因为它抓取了所有进程线程的信息,而fmod产生了很多线程.

  • 有帮助吗?这只是nvidia驱动程序中的一个错误,还是我可以做些什么来修复它,告诉人们禁用线程"优化"?

编辑1:我的笔记本电脑上的当前nvidia驱动程序也出现同样的问题.所以我并不疯狂

编辑2:同样的问题发生在nvidia驱动程序的版本362(以前的主要版本)上

c++ graphics multithreading synchronization nvidia

30
推荐指数
2
解决办法
3506
查看次数

将数组解交错?

假设我有一个隔行扫描数据数组,例如1a2b3c4d5e,我想将它解交错到一个看起来像12345abcde的数组(没有临时缓冲区).这样做的最快方法是什么?

到目前为止,我有这个

template<typename T>
void deinterlace(T* arr, int length){
  if(length<=1) return;

  int i = 1;
  for(i = 1; i*2<length; i++){
    //swap i with i*2
    T temp = arr[i];
    arr[i] = arr[i*2];
    arr[i*2] = temp;
  }
  deinterlace(arr+i, length-i);
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,它不适用于不是2的大小的数组

编辑:无论如何,这个算法在更大的2的力量下失败,所以我想我再次在0

编辑2:我找到了一个nlogn算法,给定一个O(n)数组旋转函数,或者初始大小是2的幂

像这样工作:

1a2b3c4d5e6f7g,"块大小"= 1初始,

分成大块的组*4 1a2b 3c4d 5e6f 7g

交换每组的内部2块12ab 34cd 56ef 7g

重复块大小=块大小*2

12ab34cd 56ef7g(读数:56 ef 7 g) - > 1234abcd 567efg

1234abcd567efg - > 1234567abcdefg

template<typename T>
void deinterlace(T* arr, int length, int group_ct = 1){ …
Run Code Online (Sandbox Code Playgroud)

c++ arrays

21
推荐指数
1
解决办法
2591
查看次数

测试子类是否覆盖基类中的虚函数

我正在寻找一种检查子类是否覆盖其基类上的函数的方法。如果成员函数指针不是虚拟的,则比较成员函数指针可以很好地工作,但是如果它们虚拟的,则无法工作。这个示例代码本质上就是我遇到的麻烦。

class Base {
    public:

    virtual void vfoo(){ cout << "foo"; }
    virtual void vbar(){ cout << "bar"; }
    void foo(){ cout << "foo"; }
    void bar(){ cout << "bar"; }
};

class Child : public Base {
    public:

    void vfoo(){ cout << "foo2"; }
    void foo(){ cout << "foo2"; }
};

int main (){
    //non-virtual cases, these work correctly
    cout << (&Base::foo == &Child::foo) << endl; //outputs false (good)
    cout << (&Base::bar == &Child::bar) << endl; //outputs …
Run Code Online (Sandbox Code Playgroud)

c++

5
推荐指数
1
解决办法
1401
查看次数

标签 统计

c++ ×3

arrays ×1

graphics ×1

multithreading ×1

nvidia ×1

synchronization ×1