游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4354|回复: 12

cpu使用100%,麻烦帮我看一下?

[复制链接]

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2007-7-29 22:32:00 | 显示全部楼层 |阅读模式
#define WIN32_LEAN_AND_MEAN

#include <windows.h>
#include <windowsx.h>
#include "ddraw.h"

#define WIN_CLASSNAME "iwtjatpya"
#define WIN_HEIGHT 1024
#define WIN_WIDTH  768

#define KEYDOWN(vk_code)   ((GetAsyncKeyState(vk_code) & 0x8000) ? 1:0)
#define KEYUP(vk_code)     ((GetAsyncKeyState(vk_code) & 0x8000) ? 0:1)

int game_main(void *parms=NULL, int num_parms=0);
int game_init(void *parms=NULL, int num_parms=0);
int game_shutdown(void *parsm=NULL, int num_parms=0);


HWND hwnd_window=NULL;
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
        HDC hdc;
        PAINTSTRUCT ps;
       
        switch(uMsg)
        {
        case WM_PAINT:
                {
                        hdc=BeginPaint(hwnd,&ps);

                        EndPaint(hwnd,&ps);
                        return(0);
                }break;

        case WM_DESTROY:
                {
                        PostQuitMessage(0);
                        return(0);
                }break;

        default: break;

        }

        return(DefWindowProc(hwnd,uMsg,wParam,lParam));
}



int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
        MSG msg;
        HWND hwnd;
        WNDCLASSEX winclass;

        winclass.cbClsExtra=0;
        winclass.cbSize=sizeof(WNDCLASSEX);
        winclass.cbWndExtra=0;
        winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
        winclass.hCursor=LoadCursor(NULL,IDC_ARROW);
        winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
        winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
        winclass.hInstance=hInstance;
        winclass.lpfnWndProc=WindowProc;
        winclass.lpszClassName=WIN_CLASSNAME;
        winclass.lpszMenuName=NULL;
        winclass.style=CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;

        if(!RegisterClassEx(&winclass))
                return(0);


        if(!(hwnd=CreateWindowEx(NULL,WIN_CLASSNAME,"NEW DIRECTX",
                                                                WS_POPUP | WS_VISIBLE,
                                                                0,0,
                                                                GetSystemMetrics(SM_CXSCREEN),
                                                                GetSystemMetrics(SM_CYSCREEN),
                                                                NULL,NULL,hInstance,NULL)))
                return(0);
       
        game_init();

    hwnd_window=hwnd;
        //while(GetMessage(&msg,NULL,0,0))
//        {
//                TranslateMessage(&msg);
//                DispatchMessage(&msg);
//}
//}
        while(1)
        {
                if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
                {
                        if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
                        TranslateMessage(&msg);

                        DispatchMessage(&msg);
                }
                game_main();
        }
        game_shutdown();

        return(msg.wParam);
}


int game_init(void *parms, int num_parms)
{
     return(1);
}


int game_main(void *parms, int num_parms)
{

        if(KEYDOWN(VK_ESCAPE))
           SendMessage(hwnd_window,WM_CLOSE,0,0);
        return(1);
}


int game_shutdown(void* parms, int num_parms)
{
        return(1);
}

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2007-7-29 22:46:00 | 显示全部楼层

Re:cpu使用100%,麻烦帮我看一下?

很显然是100%,不用问,查一下PeekMessage的帮助说明

3

主题

155

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2007-7-29 22:46:00 | 显示全部楼层

Re: cpu使用100%,麻烦帮我看一下?

if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
{
if(!GetMessage(&msg, NULL, 0, 0 )) return msg.wParam;
TranslateMessage(&msg);

DispatchMessage(&msg);
}
game_main();


每一循环只 调度零个或一个消息 和 game_main();
相当于一直game_main();所以就CPU占用率大了

一般是调度完消息,再game_main();
while(有消息){ 调度消息;}
game_main();

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2007-7-29 22:50:00 | 显示全部楼层

Re:cpu使用100%,麻烦帮我看一下?

微软的例子是这样的

            while( msg.message!=WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    Render();
            }

你把Render函数注释掉或者切换到其他窗体使Render函数无效,CPU就是100%。
我想应该可以说明PeekMessage和Render里都干了些什么

180

主题

3511

帖子

3520

积分

论坛元老

Rank: 8Rank: 8

积分
3520
发表于 2007-7-30 10:12:00 | 显示全部楼层

Re: Re: cpu使用100%,麻烦帮我看一下?

jrc96: Re: cpu使用100%,麻烦帮我看一下?
while(有消息){ 调度消息;}
game_main();

这个很好。
写得再详细一点就是

while(play)
{
  while( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
    {
       TranslateMessage( &msg );
       DispatchMessage( &msg );
    }
  Render();
}

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2007-7-30 11:40:00 | 显示全部楼层

Re:cpu使用100%,麻烦帮我看一下?

非常感谢!
我试一下

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2007-7-30 11:41:00 | 显示全部楼层

Re: cpu使用100%,麻烦帮我看一下?

非常感谢!
我回去试一下

2

主题

8

帖子

10

积分

新手上路

Rank: 1

积分
10
 楼主| 发表于 2007-7-30 12:25:00 | 显示全部楼层

Re: cpu使用100%,麻烦帮我看一下?

我试了,不行,CPU还是使用100%

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2007-7-30 16:41:00 | 显示全部楼层

Re:cpu使用100%,麻烦帮我看一下?

简便方法,在主循环里加个Sleep(1);当然了,会影响你程序的FPS

1

主题

50

帖子

52

积分

注册会员

Rank: 2

积分
52
发表于 2007-7-30 19:38:00 | 显示全部楼层

Re:cpu使用100%,麻烦帮我看一下?

游戏和普通应用程序不一样,游戏要的是实时性,所以就要要把计算机性能发挥到及至.. CPU 100%很正常..
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 15:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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