游戏开发论坛

 找回密码
 立即注册
搜索
楼主: 游戏之家

宣三国英雄传提高速度的办法

[复制链接]

0

主题

228

帖子

285

积分

中级会员

Rank: 3Rank: 3

积分
285
发表于 2005-9-8 10:33:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

能流畅运行的最低配置:
  CPU 2.4G
  内存  512M

这种游戏也要这么高的配置,作者因该好好想想了

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
 楼主| 发表于 2005-9-8 10:34:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

我也觉得宣三国的图像没优化好,作者说DX只支持BMP格式。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-9-8 11:02:00 | 显示全部楼层

Re: 宣三国英雄传提高速度的办法

内存池基本上能改善产生大量内存碎片的情况


不是碎片。是基于系统级的页面,Windows保护模式下物理内存除了Windows自己能把它耗尽,谁也不可能用完的。

你要是想new失败,很简单的,你就new一个大数组好了,当数组的内存超过能申请到的页面,返回的指针就是NULL,即使你现在系统内存再多也没用的。不信你试试,你会发现这个数组内存非常小,但是就是申请不到内存。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-8 14:32:00 | 显示全部楼层

Re: Re: 宣三国英雄传提高速度的办法

bigbook2000: Re: 宣三国英雄传提高速度的办法
我new了40个字节的内存,此其1,windows的页面文件多大呢?,2,内存new不是在页上的,失败的原因也不止一种,因为new是在堆上分配的,C++的new只是对C的malloc的浅封装同,可以看看dbg_malloc的源代码,其中有很多种可能会失败 .3.分配 大的数组你指的多大呢?在函数里分配的话有栈的限制0x0000ffff个字节,多一个就异常.做全局指针可以new出足够的内存,我指的是那怕是几百M,一样可以new出来。具体可以看看wowmapview的代码,网上有下载的,他在读wow的mpq是一次读入的,七个文件2G左右,中间肯定用到了虚存.就是说他分配的内存块里最小的是6M左右(脚本),最大的1.G(地形那部分).windows的页面大小以k来算的,如果在页上分配就是说分配1M存也会失败么?

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-8 14:34:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

windows的内存页面不记得是256k还是多少了.

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-8 14:36:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

windows内存分配的问题windows核心编程一书里讲的比较好.

19

主题

116

帖子

122

积分

注册会员

Rank: 2

积分
122
QQ
发表于 2005-9-9 10:06:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

如果观点正确,我想大部份回贴的也不会是如此这般内容,文件容量确实是少了,读盘时间理论上也是相应地加快,但相对使用了DX7的作品而言,提速是否太肯定了呢?上面也提过只能加装BMP的图片了,在这种情况下,不管你用什么格式,中间环节必然需要转换成DX7能认别的BMP,这样情况下内存的占用似乎是不变的,自然而然图片加装到程式中的需时也是不减的,反而增加了转换的这部分时间。我同意某些贴子,但有些则看了哑口无言。

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2005-9-9 11:46:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

看了大家的回贴,说说自己的看法,不对见笑,毕竟已经好几年没搞过2D了 ^_^

1 内存池确实可以有效管理小内存分配的空洞,但是不能完全堵住New返回NULL的错误,该分不出来还是分不出来。去年也遇到这样的情况,呵呵。不过有总比没有好,因为可以有效防止内存空洞,否则的话,莫说分地图的大内存了,或许就连一个物体的小内存都分不出来。

2 图形如果真要用压缩格式,不如用DDS,肯定比GIF快这是必然的。而且(刚知道)GIF是需要授权,那就更不如用DDS了。实际上现在图形芯片的瓶颈并不是在内存,也不在显存,而是在内存到显存的通道。那么,DDS在这条通道的时候仍然能保持小传输,直到显存再通过指令解压缩,而GIF则必须在内存就解完压缩,再通过瓶颈传导到显存,这中间的性能差别是显而易见的。当然做2D游戏大可不必这么叫真,但是,我想楼主可能对GIF提速有些太肯定了。如果真的测试过GIF确实能提很多很多速度,估计是用GIF前的那个版本实在可能有点……嗯嗯,请楼主勿怪。至少我原来用的那个2D引擎,读GIF和读索引色的BMP,速度没有太大差别。当然,如果用GIF和16、24位色的BMP比,那差别自然就大得多了。

3 音频速度不太了解,但是MIDI不好听是真的。MP3和MIDI都有可能顿,这跟机器的状况有关,MP3顿的机会大一点因为MP3毕竟文件比MIDI大N倍,处理要多些,内存占用要多些,所以在切换音频的时候,速度会有些影响。但对于目前的主流机器而言,只要不是一边开着N个占内存的程序再一边玩游戏,问题不大。如果到了连MP3都顿的时候,那么离MIDI顿也不远了。
类如楼主这样的小游戏,MIDI即可,不必用MP3,否则发到网上大家下得比较慢。商业游戏一般还是用MP3的,我想这中间更多考虑的主要还是MIDI很难听,而且跟声卡关系紧密,不像MP3,什么烂声卡都能播的差不多。
当然如果考虑到玩家如果对音乐不会太在意的话,用MIDI可以减少刻盘的数量,对公司发行游戏可以节约成本,呵呵。 ^_^

相信想说服楼主会很困难,所以这里只是提出自己的看法,祝楼主好风借力,更上层楼。

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2005-9-9 12:06:00 | 显示全部楼层

Re:宣三国英雄传提高速度的办法

Windows内存分为分页的和未分页的,页面大小是固定的,我说的申请不到页面不是说超过了页面大小(一个页面),而是说系统无法为你提供可用的页面,比如你申请了10个页面,但系统目前只有8个供你使用,32位Windows可以为每个独立的进程提供2G的内存空间,我的意思是说,大多数new失败不是硬件层的,而是操作系统层的。还有一点就是网络程序消耗的资源更大,这是因为Winsock要求更为苛刻,他所使用的内存必须是分配在未分页的连续内存上,基本上50000个连接就是上限了

我想目前大多数的程序不会用到2G内存

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-9 12:08:00 | 显示全部楼层

Re: Re:宣三国英雄传提高速度的办法

noslopforever: Re:宣三国英雄传提高速度的办法
内存池确实可以有效管理小内存分配的空洞,但是不能完全堵住New返回NULL的错误,该分不出来还是分不出来。去年也遇到这样的情况,呵呵。不过有总比没有好,因为可以有效防止内存空洞,否则的话,莫说分地图的大内存了,或许就连一个物体的小内存都分不出来。

基本上同意楼上的观点,返回NULL是C++实现的问题,与有没有内存池没关系,我说内存池的意思是不像那位说的会出现有内存碎片而分配不到内存,从而导致使用链表来代替数组,因为这是没必要也是有臭味的做法。
但同时,内存池的实现方式不同,也可以解决不同的问题,如果实现的好的话,对分配NULL的问题可以进行异常封装,抛出错误,返回类型信息,在windows下也可以getlasterror来进行判断(因为在windows下面C++的new调用malloc,malloc调用dbg_malloc,而dbg_malloc最终还是转到了windows的heap分配中去了)所以可以捕获到API的异常。可以在游戏上层完全不用处理是否为NULL的问题。这能从底层解决上层逻辑问题,实际上这种实现都是一个入口,和aop说到一块儿去了,软件核心关注点在这儿实现,全局动态代理.
     java和C#等基本上内存管理 都由更底层语言级来代理,所以更安全,也就是它们能说比C++最有优势的地方,ms也打算从下一代或是下二代操作系统完全支持这种内存的委托模式,从而把直接分配内存放到托管之上.
这样的程序就不会再出现要处理大量内存不安全操作的问题。但同时应用程序员对内存使用的权力也受限,对平台的依赖性也会更强.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-28 04:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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