小编Arn*_*ann的帖子

计算gpu前端缓冲区中像素的平均值,而不将前端缓冲区复制回系统内存

我准备为我的电脑构建一个流光溢彩的克隆.为此,我需要一种方法来计算屏幕几个区域的平均颜色.

到目前为止我发现的最快方法如下:

  pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH/*D3DPOOL_SYSTEMMEM*/, &pSurface, nullptr)
  pd3dDevice->GetFrontBufferData(0, pSurface);
  D3DLOCKED_RECT lockedRect;
  pSurface->LockRect(&lockedRect, nullptr, D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
  memcpy(pBits, (unsigned char*) lockedRect.pBits, dataLength);
  pSurface->UnlockRect();
  //calculate average over of pBits
Run Code Online (Sandbox Code Playgroud)

然而,它会将整个前端缓冲区复制回系统内存,平均需要33毫秒.显然33ms并不接近我需要的速度,因此我正在寻找一种方法来直接在gpu上计算前缓冲区域的平均值,而无需将前缓冲区复制回系统内存.

编辑:代码片段中的瓶颈是pd3dDevice->GetFrontBufferData(0, pSurface);.memcpy对性能没有明显影响.

编辑:

根据user3125280的回答,我制作了一些代码,它们应该占据屏幕的左上角并对其进行平均.但结果总是0.我错过了什么?另外请注意,pSurface现在它已经存在于视频内存中,因此GetFrontBufferData只是视频内存中的一个内存非常快.

  pd3dDevice->CreateOffscreenPlainSurface(1, 1, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pAvgSurface, nullptr);
  pd3dDevice->CreateOffscreenPlainSurface(ddm.Width, ddm.Height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pSurface, nullptr);

  pd3dDevice->GetFrontBufferData(0, pSurface);

  RECT r;
  r.right = 100;
  r.bottom = 100;
  r.left = 0;
  r.top = 0;
  pd3dDevice->StretchRect(pSurface, &r, pAvgSurface, nullptr, D3DTEXF_LINEAR);

  D3DLOCKED_RECT lockedRect;
  pAvgSurface->LockRect(&lockedRect, nullptr, D3DLOCK_NO_DIRTY_UPDATE|D3DLOCK_NOSYSLOCK|D3DLOCK_READONLY);
  unsigned int color = -1; …
Run Code Online (Sandbox Code Playgroud)

c c++ directx graphics gpu

10
推荐指数
1
解决办法
1596
查看次数

滚动非常大的GtkDrawingArea

我有一个GtkDrawingArea用于可视化数据.根据数据库和用户输入,绘图可能会变得非常大(大于允许的最大GtkDrawingArea大小).因此,我想使用与当前窗口一样大的绘图区域,并在滚动时手动更新它.

如果我使用ScrolledWindow + Viewport方法将滚动条添加到绘图区域,它显然不起作用,因为绘图区域不够大,不需要滚动条.

有没有什么方法可以让视口欺骗认为底层小部件比实际大?如果不是什么是解决这个问题的最佳方法?

注意:我使用Gtk2并且不可能切换到Gtk3.

c c++ gtk gtk2

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

标签 统计

c ×2

c++ ×2

directx ×1

gpu ×1

graphics ×1

gtk ×1

gtk2 ×1