请问怎么样用DirectX提高放大图像的播放速率?

admireO 2001-11-14 09:38:24
最近再用DirectX写一个播放原始图像的(8bit/pixel)程序,用:BitBlt写显存,速度上还可以,现在当我把图像放大时把512 * 512放大成1024 * 1024速度只有原来的1/3了.请问高手,怎么样提高播放速度呀?
...全文
123 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
admireO 2001-11-20
  • 打赏
  • 举报
回复
top,top..........................................
admireO 2001-11-20
  • 打赏
  • 举报
回复
大家帮帮忙呀?????????????????????????????????
admireO 2001-11-19
  • 打赏
  • 举报
回复
大家帮我看一段代码把,怎么执行到:lpDDSOffScreen->GetDC( &hOffScreenDC )就出问题,程序被强制终止了.
BOOL CDDUtil::DD_CreateWnd(int nOuterMode,int x,int y,int width,int height,int nRest,LPCTSTR lpszCaption)
{
DDSURFACEDESC ddsd={0};
HRESULT ddrval;
HINSTANCE hInstance=g_hInst;
//int sysw,sysh;

//HWND hawnd=GetActiveWindow();

nMode=nOuterMode;
nSrcWidth=width;
nSrcHeight=height;

nMode |= MODE_WINDOW; nMode |=MODE_FASTBLT;

if (nMode&MODE_YUV /*|| nMode&MODE_RGB*/)
nMode &= ~MODE_FASTBLT ;


BOOL bDisplayInWindow=TRUE;//((nMode&MODE_WINDOW) && (!(nMode&MODE_FASTBLT)));
//Set position here
rcPos.top=y;
rcPos.left=x;
rcPos.bottom=y+height;
rcPos.right=x+width;

/*
* create a window
*/
hwnd = CreateWindowEx(
0,
NAME,
lpszCaption,
WS_CAPTION|WS_SYSMENU|WS_VISIBLE|WS_MAXIMIZEBOX|WS_BORDER|WS_SIZEBOX|WS_MAXIMIZE,
// gan WS_CAPTION|WS_SYSMENU|WS_VISIBLE|WS_MAXIMIZEBOX|WS_BORDER|WS_SIZEBOX,
x,
y,
/*width + nRest,
height,*/
width,
height,
NULL,
NULL,
hInstance,
NULL );
if( !hwnd )
{
DWORD dwRet = ::GetLastError();
return FALSE;
}
m_hCreatedWnd = hwnd;

SetWindowLong(hwnd,GWL_USERDATA,(LONG)((nMode&MODE_WINDOW)?this:NULL));
// ShowWindow( hwnd, (nMode&MODE_WINDOW)?SW_SHOWNOACTIVATE:SW_HIDE );
// UpdateWindow( hwnd );

if (nMode & MODE_WINDOW){
GetClientRect(hwnd,&rcPos);
sysw=width-(rcPos.right-rcPos.left);
sysh=height-(rcPos.bottom-rcPos.top);
MoveWindow(hwnd,x,y,width,height,TRUE);
}
/* create the main DirectDraw object
*/

LPDIRECTDRAW lpDD1;
ddrval = DirectDrawCreate( NULL, &lpDD1, NULL );
if( ddrval != DD_OK )
{
return DDrawFailed();
}
ddrval = lpDD1->QueryInterface(IID_IDirectDraw2, (void **)&lpDD);
if( ddrval != DD_OK )
{
return DDrawFailed();
}
lpDD1->Release();
ddrval = lpDD->SetCooperativeLevel( hwnd, DDSCL_NORMAL );
if( ddrval != DD_OK )
{
return DDrawFailed();
}

// Create the primary surface
ddsd.dwSize = sizeof( ddsd );
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

ddrval = lpDD->CreateSurface( &ddsd, &lpDDSPrimary, NULL );
if( ddrval != DD_OK )
{
ddrval=DD_OK;
return DDrawFailed();
}

DDSURFACEDESC desc = { 0 };
desc.dwSize = sizeof(desc);
desc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
desc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;

desc.dwHeight = height;
desc.dwWidth = width;

ddrval = lpDD->CreateSurface( &desc,&lpDDSOffScreen,NULL );
if( ddrval != DD_OK )
{
ddrval = DD_OK;
return DDrawFailed();
}
ASSERT( m_hTypeBitmap != NULL );
ASSERT( lpDDSOffScreen != NULL );
lpDDSOffScreen->Restore();
HDC hOffScreenDC;
//执行到下面这句被强制终止,这是什么原因呀,我的DIRECTX部分不是满屏的是一个1024 * 1024窗口
LRESULT ddRet = lpDDSOffScreen->GetDC( &hOffScreenDC );
ASSERT( hOffScreenDC != NULL );
::SelectObject( hOffScreenDC,m_hTypeBitmap );
lpDDSOffScreen->ReleaseDC( hOffScreenDC );

return TRUE;
}
rockswang 2001-11-16
  • 打赏
  • 举报
回复
BltFast呀
admireO 2001-11-15
  • 打赏
  • 举报
回复
我用Clipper,获得窗口HDC,然后再BitBlt,当我放大图像的时候我就用StretchBlt,速度好像跟不上,请问,有没有什么好的办法?
hboy 2001-11-15
  • 打赏
  • 举报
回复
用Overlay表面可以,但对显卡有要求
IONPhantom 2001-11-15
  • 打赏
  • 举报
回复
就是,用显卡硬件实现多好!
linclouds 2001-11-15
  • 打赏
  • 举报
回复
使用DirectDraw可以,有些显卡支持硬件拉伸!
admireO 2001-11-15
  • 打赏
  • 举报
回复
请大家关注呀,我快疯了
IONPhantom 2001-11-15
  • 打赏
  • 举报
回复
DirectDraw 好象没有 BitBlt 这个函数呀,只有 Blt
admireO 2001-11-14
  • 打赏
  • 举报
回复
我的贴子怎么没人理呀?

8,304

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧