游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2934|回复: 4

占用内存大!高手来帮我优化!

[复制链接]

3

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2010-5-25 10:27:00 | 显示全部楼层 |阅读模式
ATOM  myRegisterClass(HINSTANCE);//注册窗体类
BOOL InitInstance(HINSTANCE,int);//创建窗口
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);//消息处理
void _mypaint(HDC);//绘制窗口


HBITMAP man[7];//定义位图数组
DWORD tNow,tPre,tChk;//定义现在CPU的时间,前一个时间,校验时间
DWORD count,frame,fps;//定义计数,框架1秒内更新的总次数,框架每秒更新的次数
HDC hdc,mdc;
HWND hwd;//操作窗体


int APIENTRY WinMain( HINSTANCE hInstance,
                                         HINSTANCE hPrevInstance,
                                         LPSTR lpCmdLine,
                                         int nShowCmd )
{

        MSG msg;
        myRegisterClass(hInstance);//注册窗口

        if (!InitInstance(hInstance,nShowCmd)) return false;//窗口创建失败
        GetMessage(&msg,NULL,NULL,NULL);
       
        while (msg.message!= WM_QUIT)
        {
                if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
                {
                        TranslateMessage(&msg);//翻译消息按键消息
                        DispatchMessage(&msg);//转换按键消息
                }
               
                else
                {
                        tNow = GetTickCount();//获取CPU频率
                        if (tNow- tPre>=100)//每次贴图的时间间隔为0.1秒
                        {
                                _mypaint(hdc);
                        }
                }
       
        }
       

        return msg.wParam;//wParam 通常返回一个常量值
}

ATOM myRegisterClass(HINSTANCE hInstance)//注册窗体
{
        WNDCLASSEX wcse;
        wcse.cbSize = sizeof(WNDCLASSEX);//计算所需内存的字节大小
        wcse.style  =  CS_HREDRAW | CS_VREDRAW;//窗口风格 | CS_NOCLOSE(调节高度 宽度自动适应,没有关闭按钮)
        wcse.lpfnWndProc= WndProc;//指定一个指针指向窗口(处理窗口消息处理函数)
        wcse.cbWndExtra = 0;//是否需要额外的字节处理窗口的初始化
        wcse.cbClsExtra =0;//指定额外数量的字节来初始化WNDCLASSEX结构体。
        wcse.hInstance = hInstance;// 用于操作的当前窗口
        wcse.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));//加载图标
        wcse.hCursor= LoadCursorFromFile("..//Working.ani");//加载了动态光标
        wcse.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);//背景颜色
        wcse.lpszMenuName = NULL;//如果没有菜单则为NULL 如果有菜单 需要使用MAKEINTRESOURCE(标号)
        wcse.lpszClassName = "Game";//指向窗口类的名字,在初始化的时候根据这个寻址
        wcse.hIconSm = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));

        return RegisterClassEx(&wcse);
}

BOOL InitInstance(HINSTANCE hInstance,int nCmdShow)//创建窗口
{
       
        hwd = CreateWindow("Game","单点兽",WS_OVERLAPPEDWINDOW &~WS_MAXIMIZEBOX,//&~WS_SIZEBOX
                CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);
        if (!hwd)  return false;//假如创建失败 即退出

        MoveWindow(hwd,100,100,600,500,true);//移动窗口到指定位置

        UpdateWindow(hwd);//更新窗口

        ShowWindow(hwd,nCmdShow);//显示窗口

        hdc = GetDC(hwd);//获取控制窗口的有效内容区域
        mdc =CreateCompatibleDC(hdc);
        char filename[20]=" ";//存储
       
        for (int i=0;i<7;i++)
        {
                sprintf_s(filename,"..//man%d.bmp",i);
                man =(HBITMAP)LoadImage(NULL,filename,IMAGE_BITMAP,640,480,LR_LOADFROMFILE);
        }
       
        _mypaint(hdc);

        return true;

}

void _mypaint(HDC hdc)//绘制窗口
{

        char name[40]=" ";//显示文本

        if(count == 7) count = 0;//重置计数器
        frame++;//刷新次数++
        if (tNow -tChk>=1000)//是否经过1秒钟
        {
                fps = frame;
                tChk = tNow;
                frame = 0;//将刷新次数置为0;
        }

        //黏贴男人物图片
        SelectObject(mdc,man[count]);       
        sprintf_s(name,"每秒刷新次数%d fps",fps);
        TextOut(mdc,0,0,name,strlen(name));
       
        BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);

        tPre = GetTickCount();
        count++;
        ReleaseDC(hwd,hdc);
        DeleteDC(mdc);

}


LRESULT CALLBACK WndProc(HWND hwd,UINT msg,WPARAM wParam, LPARAM lParam)
{
        PAINTSTRUCT ps;//定义绘画函数
        HDC hdc1;
        switch (msg)
        {
        case WM_PAINT:               
                 hdc1 = BeginPaint(hwd,&ps);//开始绘制窗口
               
                //TOD  添加代码
               
                EndPaint(hwd,&ps);
               
                break;
        case WM_DESTROY:

                for (int i=0;i<7;i++)
                {
                        DeleteObject(man);
                }
                PostQuitMessage(0);
                break;
        default:
                return DefWindowProc(hwd,msg,wParam,lParam);
                break;
        }
        return 0;
}
这是vc++游戏设计基础的代码!结果它的源程序也是如此的占用内存!

3

主题

8

帖子

8

积分

新手上路

Rank: 1

积分
8
 楼主| 发表于 2010-5-26 18:34:00 | 显示全部楼层

Re:占用内存大!高手来帮我优化!

已经自行解决le~~PeekMessage不是好东西! 占用了很多内存!

修改以后 可以正常运行  但是使用的 是计时器 而不是使用的GetTickCount

效果一样 还是选择 SetTimer函数

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2010-6-1 10:53:00 | 显示全部楼层

Re:占用内存大!高手来帮我优化!

!!!!!!!!!!!!!!PeekMessage不是好东西?????????????????

1

主题

14

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2010-6-7 13:25:00 | 显示全部楼层

Re:占用内存大!高手来帮我优化!

我在想楼主不是想说内存大吧?
是CPU占用率高?

29

主题

107

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2010-7-14 13:03:00 | 显示全部楼层

Re:占用内存大!高手来帮我优化!

你线程休眠没
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 10:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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