荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 提高 Windows 95游戏性能
发信站: BBS 荔园晨风站 (Thu Jan 21 23:07:03 1999), 转信


为Windows95环境开发实时游戏时,要注意在Windows进行一些外围设
备任务的过程中避免游戏循环中发生阻塞或停滞。本文提出了一些有
关由系统事件引起的阻塞问题及其解决方法。

    代码内存页
    问题:当调用某些函数时,游戏的性能降低了。
    原因:应用程序驻留在CD-ROM中,它的访问速度慢。不是所有的函
数都适于装入RAM,因而调用那些近期不用的函数时则需从CD中读取。
    解决方法:
    将全部应用程序装入虚拟内存中。在这种方式下,当函数被从RAM
中抛弃后,它们将置于页文件中(通常称作交换文件),在那里比从CD中
检索要快得多。
    CD-ROM缓存
    问题:应用程序的速度由于CD-ROM缓存而下降。
    原因:预读缓存为实际并不需要的函数分配了内存,从而导致已在
RAM中的函数又不得不由于页交换而清出RAM。
    解决方法:
    将应用程序加载到前面讲到的交换文件中。
    通常不要实现自己的 CD-ROM缓存系统。它在与系统缓存进行交
互作用时还会发生类似的性能干扰。

    数据内存页
    问题:即使应用程序已加载了全部数据,但当从交换文件中访问数
据时还是造成性能下降。
    原因:解释这个问题需要了解一下Windows如何决定何时将内存块
抛弃或页交换出去(如从RAM移动到交换文件)。
    Windows 95内存管理有一个安全机制,禁止进程使用一次内存块
后将其全部忽略。例如,将一个大的位图文件用作桌面墙纸时,用户正
在运行一个最大化的应用程序,因而位图文件被页替换出一段时间。
随后,用户将该应用程序最小化。现在系统需要重新装载墙纸的位图
文件以便将其画到屏幕上。如果没有保护机制,即使RAM中可能包含了
一旦应用程序重载就需要使用的代码或数据,但这个位图文件还是会
把很多页从RAM中挤掉。这个位图很可能在一定时间内不再需要,但它
却占据了大量物理内存。
    安全机制可以防止上述事件发生,其方法如下。当系统加载一页(
在x86的机器上,一页是4K),它首先将该页置于一中间状态。在这个状
态下,页面始终没有获得一个"最近访问"的时间戳,即便它被再次访问
。只有当多于16页(在Windows 95中)加载时,它将被提升至完全状态
。但在此时,它被标记为近期没有使用过,因而在下一次需要物理内存
时首先被抛弃。只有当该页在提升到完全内存状态后被访问,Windows
才标记它为近期使用过,识别它为潜在的有用页并值得保留在物理内
存中。
    在上述桌面墙纸的例子中,这将意味着第一个加载的页将很可能
在多于16个页加载后抛弃。每当新的一页被加载,则有一页从中间状
态提升,并有一页抛弃。结果是装入任何尺寸的图像只需要替换掉17
×4=68K的物理内存(该数字仅对Windows 95有效)。
    可见,一页一页地顺次加入数据以使Windows在物理内存中保留大
的数据块的做法将会是失败的,因为安全机制会像处理上例中的位图
一样处理这些数据。
    解决方法:
    为了让Windows识别一重要内存页而不抛弃它,必须在该页从中间
状态提升后再次访问它(在它提升之前访问不会达到预期结果)。函数
如下:
    /*假定pb和cb均在页边界上,并且该页的大小由GetSystemInform
ation()决定*/
    #define cbLag           (16 * PageSize)
    void MakeRegionPresent (volatile BYTE *pb, UNIT cb)
    {
    UNIT ib;
    Assert(((DWORD)pb & (PageSize - 1))== 0);
    Assert(((DWORD)cb & (PageSize - 1))== 0);
    for  (ib = cbLag; ib < cb; ib+= PageSize)
    {
      pb[ib - cbLag];
      pb[ib];
    }
    }

    五分钟暂停
    问题:在某些设置下,当系统轮询网络时,它将挂起全部其它任务
达五分钟之久。
    原因:通常,原因是当DHCP(动态主机设置协议,dynamic host con
figuration protoco;  详细情况请参考其它文献)装入网络适配器(
通常是拨号网络适配器,如调制解调器),而网络适配器并不在装有DHC
P的服务器的网络上。这通常是由于用户本意是允许拨号网络适配器
上的DHCP,但偶然允许了物理网络适配器上的DHCP。它还可能发生在
当用户在调制解调器上允许DHCP,但网络服务提供者并没有使用DHCP

    解决方法:
    依照下列方法改变网络设置:
    在控制面板中,双击网络。在设置页中的部件列表中,单击TCP/IP
并单击属性按钮。在P 地址一栏中,单击指定IP地址,然后输入IP地址
和电脑的子网掩码(可以通过运行WINIPCFG获得这些数据)。

    清除交换文件
    问题:Windows清理交换文件。
    原因: 当Windows发现所有的应用程序都空闲时,它便决定开始进
行清理,例如,一直在e tMessage状态。
    解决方法:
    当应用程序表现出繁忙时,Windows将推迟它的清理工作。不要使
用一组GetMessage调用──使用PeekMessage代替,以保证消息队列始
终继续。
    下面的代码段显示了在主消息循环中以PeekMessage代替GetMess
age的一种方法。假定每当应用程序的焦点丢失就将AppPaused Boole
an设置为TRUE。这一标记确保应用程序不会在空闲时仍继续运行Peek
Message循环的情况下,消耗CPU时间。
    MSG msg;
    do
    {
      if ( PeekMessage ( &msg, NULL, 0, 0, PM_REMOVE))
      {
        if ( msg.message = = WM_QUIT) break;
          //唯一退出循环的途径
          TranslateMessage (&msg);
          DispatchMessage (&msg)
        }
        else
        {
        if  (AppPaused) WaitMessage();
        else
        {
          //在这里进行任何不基于消息循环的处理,如动画制作
        }
      }
    }
    while (TRUE);
    return  msg.wParam;

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店