游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4231|回复: 7

DirectX下的WM_PAINT消息

[复制链接]

7

主题

14

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2009-8-24 12:27:00 | 显示全部楼层 |阅读模式
我刚刚开始学习D3D,使用的学习教程主要就是官方SDK的帮助手册。下面这段代码是手册里讲初始化框架这一章的(非常基础),相信不少人都熟悉:

LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;

        case WM_PAINT:
            Render();
            ValidateRect( hWnd, NULL );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

这是消息处理函数。我的疑问是,d3d里一定有什么可以让系统不停发送WM_PAINT这个消息吧?我知道第一个WM_PAINT消息是updatewindow()发送的。但是如果要不断更新画面,必须要不断启动WM_PAINT才能做到。因为它把所有渲染过程都放在这个Render()里了。所以我想这个Render()里一定有再次发送WM_PAINT的命令?Render()函数如下:
VOID Render()
{
    if( NULL == g_pd3dDevice )
        return;

    // Clear the backbuffer to a blue color
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
   
    // Begin the scene
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        // Rendering of scene objects can happen here
   
        // End the scene
        g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display
    g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

所以我猜,发送WM_PAINT消息的命令可能就在Clear()、BeginScene()、EndScene()、Present()这几个函数中当中某一个里面。
但到底在哪一个里面?网上查了半天查不到,SDK这个问题也不讲。我的猜测正确吗?有大侠知道吗?谢谢了。

5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2009-8-24 17:32:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

一般做一个while() 不停的渲染~~不发送wm_paint

6

主题

17

帖子

25

积分

注册会员

Rank: 2

积分
25
发表于 2009-8-25 07:54:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

一般render函数放在循环里,还记得构建窗口时的while(getmessage()){}吗,只不过这次是将循环修改一下        while (msg.message!=WM_QUIT)
        {
                if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
                else
                {
                        Render();
                }
        }
这里区别的就是getmessage与peekmessage的用法,你可以看一下window的消息机制,我就不多说了!我没用过你说的那个WM_PAINT,记得当初学gdi绘图时在那地方用到过!

7

主题

14

帖子

16

积分

新手上路

Rank: 1

积分
16
 楼主| 发表于 2009-8-25 14:02:00 | 显示全部楼层

Re: DirectX下的WM_PAINT消息

回楼上两位,如果自己写的话,我知道这么做几近“标准”了。可是 DX SDK 给的官方手册教程里,并不是这么写的,而是像我在上面列举的那样,写在了WM_PAINT消息响应里面。我就是想知道它这么写为什么也能起作用,到底是什么函数在发WM_PAINT消息?

10

主题

56

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2009-8-26 17:12:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

看一下window的消息机制吧....

0

主题

2

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2009-9-1 21:19:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

WM_PAINT相对需要非常高的速度要求的游戏来说,由于他要通过操作系统的调用,所以它太慢了...
如果在游戏程序(大型的3D,2D简单的游戏是可以的)中使用发送WM_PAINT消息,那会严重影响刷新频率..游戏程序是很少用发送WM_PAINT来实现刷新的..
而如果在游戏主程序中用循环来实现刷新,则会快很多..因为这是从源代码级别的操作...

4

主题

69

帖子

205

积分

中级会员

Rank: 3Rank: 3

积分
205
发表于 2009-9-2 17:55:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

WM_PAINT消息的绘制是为了处理,当窗口拖动或者其它原因导致不进入渲染的时,可以使窗口可以绘制画面

4

主题

67

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-9-3 19:56:00 | 显示全部楼层

Re:DirectX下的WM_PAINT消息

一直以为WM_PAINT是MFC专用..
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 01:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表