当前位置:   article > 正文

测试D3D压缩纹理进显存的速度_d3d 解码降低显存

d3d 解码降低显存

硬件环境:NVIDIA GeForce 1050 ti 

视频:手上有一个hap-q的视频,大小为:5760*4320。通过CPU解码出来以后,数据大小为:24883200(字节),相当于RGBA裸数据的1/4.

1.通过D3DXLoadSurfaceFromMemory函数加载这个数据需要38ms.

2.通过cuda将同样大小数据送入显存只需要:7ms.

测试结果:

源代码如下:

  1. #include "pch.h"
  2. #include <iostream>
  3. #include <windows.h>
  4. #include <d3d9.h>
  5. #include <d3dx9.h>
  6. #include <cuda_runtime.h>
  7. #pragma comment(lib,"d3d9.lib")
  8. #pragma comment(lib,"d3dx9.lib")
  9. #pragma comment(lib,"Winmm.lib")
  10. int main()
  11. {
  12. IDirect3D9Ex *pd3d;
  13. IDirect3DDevice9Ex *pd3dDevice;
  14. Direct3DCreate9Ex(D3D_SDK_VERSION, &pd3d);
  15. D3DPRESENT_PARAMETERS m_d3dPrtPar;
  16. ZeroMemory(&m_d3dPrtPar, sizeof(m_d3dPrtPar));
  17. m_d3dPrtPar.Windowed = TRUE;
  18. m_d3dPrtPar.SwapEffect = D3DSWAPEFFECT_DISCARD;
  19. m_d3dPrtPar.BackBufferFormat = D3DFMT_UNKNOWN;
  20. m_d3dPrtPar.BackBufferWidth = 0;
  21. m_d3dPrtPar.BackBufferHeight = 0;
  22. m_d3dPrtPar.BackBufferCount = 1;
  23. m_d3dPrtPar.hDeviceWindow = GetDesktopWindow();
  24. m_d3dPrtPar.MultiSampleType = D3DMULTISAMPLE_NONE;
  25. m_d3dPrtPar.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;
  26. m_d3dPrtPar.EnableAutoDepthStencil = false;//如果要启用深度缓冲区,则必须创建一个大的深度缓冲区,否则目标渲染区域大于深度缓冲区则渲染不出来。
  27. m_d3dPrtPar.AutoDepthStencilFormat = D3DFMT_D16;
  28. DWORD vp = D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_MULTITHREADED;
  29. pd3d->CreateDeviceEx(
  30. 0,
  31. D3DDEVTYPE_HAL,
  32. GetDesktopWindow(),
  33. vp,
  34. &m_d3dPrtPar,
  35. NULL,
  36. &pd3dDevice);
  37. int width =5760, height = 4320;
  38. LPDIRECT3DTEXTURE9 pTexture = NULL;
  39. D3DFORMAT format = D3DFMT_DXT5;
  40. pd3dDevice->CreateTexture(width, height,
  41. 1, 0, format, D3DPOOL_DEFAULT, &pTexture, NULL);
  42. int dataLen = width * height * 4;
  43. dataLen = 24883200;
  44. byte *pData = new byte[dataLen];
  45. ZeroMemory(pData, dataLen);
  46. int srcPitch = width*4;
  47. RECT rc = { 0 };
  48. rc.right = width;
  49. rc.bottom = height;
  50. LPDIRECT3DSURFACE9 pSurface;
  51. pTexture->GetSurfaceLevel(0, &pSurface);
  52. int timeBegin = timeGetTime();
  53. D3DXLoadSurfaceFromMemory(pSurface, NULL, NULL, pData, format, srcPitch, NULL, &rc, D3DX_DEFAULT, 0);
  54. int timeEnd = timeGetTime();
  55. pSurface->Release();
  56. printf("压缩纹理内存加载耗时:%d\n", timeEnd - timeBegin);
  57. LPDIRECT3DSURFACE9 pOffSurface = NULL;
  58. pd3dDevice->CreateOffscreenPlainSurface(width, height, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &pOffSurface, NULL);
  59. D3DLOCKED_RECT rect;
  60. timeBegin = timeGetTime();
  61. pOffSurface->LockRect(&rect, NULL, 0);
  62. //ZeroMemory(rect.pBits, width*height);
  63. pOffSurface->UnlockRect();
  64. timeEnd = timeGetTime();
  65. printf("Surface显存到内存耗时:%d\n", timeEnd - timeBegin);
  66. LPDIRECT3DTEXTURE9 pTextureRGB = NULL;
  67. LPDIRECT3DTEXTURE9 pTextureRGB2 = NULL;
  68. format = D3DFMT_A8R8G8B8;
  69. pd3dDevice->CreateTexture(width, height,
  70. 1, D3DUSAGE_RENDERTARGET, format, D3DPOOL_DEFAULT, &pTextureRGB, NULL);
  71. pd3dDevice->CreateTexture(width, height,
  72. 1, 0, format, D3DPOOL_SYSTEMMEM, &pTextureRGB2, NULL);
  73. LPDIRECT3DSURFACE9 pTexSuf1, pTexSuf2;
  74. pTextureRGB->GetSurfaceLevel(0, &pTexSuf1);
  75. pTextureRGB2->GetSurfaceLevel(0, &pTexSuf2);
  76. HRESULT hr = pd3dDevice->GetRenderTargetData(pTexSuf1, pTexSuf2);
  77. timeBegin = timeGetTime();
  78. //pTextureRGB->LockRect(0,&rect, NULL, D3DLOCK_DISCARD);
  79. //((char*)rect.pBits)[0] = 1;
  80. //pTextureRGB->UnlockRect(0);
  81. pTexSuf2->LockRect(&rect, NULL, 0);
  82. pTexSuf2->UnlockRect();
  83. timeEnd = timeGetTime();
  84. printf("纹理显存到内存加载耗时:%d\n", timeEnd - timeBegin);
  85. byte *dev_c = NULL;
  86. cudaMalloc((void**)&dev_c, dataLen);
  87. timeBegin = timeGetTime();
  88. cudaMemcpy(dev_c, pData, dataLen, cudaMemcpyHostToDevice);
  89. timeEnd = timeGetTime();
  90. printf("cuda内存到显存加载耗时:%d\n", timeEnd - timeBegin);
  91. timeBegin = timeGetTime();
  92. cudaMemcpy( pData,dev_c, dataLen, cudaMemcpyDeviceToHost);
  93. timeEnd = timeGetTime();
  94. printf("cuda显存到内存加载耗时:%d\n", timeEnd - timeBegin);
  95. system("pause");
  96. }

测试demo:demo

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/53678
推荐阅读
相关标签
  

闽ICP备14008679号