找回密码
 注册
X系列官方授权正版
搜索
楼主: 笑笑笑笑笑

[分享] 升级 48G内存后,策略游戏后期再也不卡了

[复制链接]
发表于 2017-6-5 22:57:55 | 显示全部楼层
本帖最后由 FRIGHTER 于 2017-6-6 00:13 编辑


我也特地去截了个图
我是4核心4线程的3代I5,CPU占用18~20之间徘徊,存档读档的时候能到25%。

开了观察模式,30AI1000星图,开快速建造来加快进度,最高速度下等了几年55帧,CPU占用20~40之间跳动。
很明显能看到只有核心3在承担大多数的负载,核心4偶尔帮忙干点活,1、2基本就是在酱油



过了一段时间,游戏进入到中期开始战争了帧率开始下降到50左右

CPU负载基本在40~50之间。可以看出来这个游戏顶多三线程优化,实际上影响明显的只有两线程,再多的全是浪费




然后就是到了地图基本划分完成的中后期了。
可以看到帧数已经掉到了40左右,然而CPU占用还是不争气的只有60出头。果然是2核心+1酱油的优化水平。当然这不怪游戏,大部分游戏也只能做到这个水平了。毕竟游戏不像解压和渲染那种只要最后完成就行,谁先完成谁后完成顺序不重要,大大方方的把要进行的运算划分成几块分给CPU去算就好。游戏需要等待mainloop的循环,而mainloop里运算更新渲染三个步骤顺序不能乱,分不开也是很正常的。
顺便,如果看的比较细心的,可以发现游戏从开局到现在内存占用增幅并不像CPU那么明显,CPU占用已经翻了一倍多而游戏内存占用只增加了100M左右。这是因为游戏需要的数据大部分都是在游戏开始地图初始化的时候就加载完成了,需要在运行过程中额外分配的只有那些在游戏过程中创造出来的数据,例如建造的舰船的血量攻防这些的。但是这些数据的容量非常小,根本不需要太多的空间。举个例子,一个船假设有20个属性需要记录,每个属性都用32位int储存,那么一个船需要20x4=80个Byte来储存,也就是说1MB的内存能储存12500艘船。当然实际上需要记录的数据更多,而且有很多内存是分配作为临时运算用缓存的,这个涉及到游戏内存管理机制就不多说了。



最后一图,游戏已经掉到30帧附近,然而CPU的占用跟上面的图几乎没有变化。很明显能够看到,决定我游戏运行速度上限的就是CPU3和4这两个核心,当这两个核心负载增加之后游戏就会开始掉帧。


刚才打完楼下那个关于超线程的帖子之后发现自己游戏忘了关,于是再来一图吧
可以看到CPU和帧率跟上面一图几乎没有变化,内存懒得截图了,总之到现在也刚刚超过1GB的占用。
回复

使用道具 举报

发表于 2017-6-6 00:09:22 | 显示全部楼层
本帖最后由 FRIGHTER 于 2017-6-6 00:35 编辑

当然可能有人就觉得那英特尔搞多核处理器有什么卵用?设计/制造更大的内存有什么卵用?反正吃不上不是么?
多核心处理器和多线程技术没用吗?倒也不是。对那些单纯需要大量计算的程序,比如前面提过的压缩和渲染(更主要的是渲染,压缩还得看硬盘),还有我们最常用却不常见到的服务器来说,多核心处理器的性能可以得到完全的发挥。因为这些程序或者设备它所处理的对象不要求严格的先后顺序,每个运算内容之间不存在依赖关系,先处理这个还是先处理那个不会互相影响,所以只要把新的任务分给空闲处理器就可以了。但是对于游戏之类的程序,数据和数据之间存在极大依赖关系,想支持多核运算,尤其是三核四核甚至更多的核心同时运算(并且保持相对可以接受的效率)是非常困难的一个事情。因为你必须严格的按照一个先后顺序进行运算,否则就可能出现攻击这边还没渲染出来,对方的血量已经被打光爆炸了的尴尬情况,甚至是攻击打到了一个已经被击毁释放了内存的船只上,于是在舰船列表里递补上来的无辜舰船被击毁甚至直接出现内存错误报错退出。而如果让先算完的核心停下来等待其他核心又会极大的降低效率。只能是把一些外围的小运算分布到其他核心上。

而大内存也是一样。内存不足会卡顿的原因是内存的读写速度比硬盘高出3个数量级(双通道内存读写10000MB/s以上,一般的SATA固态硬盘随机读写也就50MB/s左右,机械硬盘更是惨不忍睹)因此一旦程序需要用到没有加载到内存里的数据时就必须等待硬盘慢慢的去读取,表现到用户体验上就是掉帧卡顿。那么加大内存有多大的帮助呢?首先需要指出的一点是内存不存在占用率高导致响应变慢的情况,一条90%占用的内存读写速度和一条10%占用的内存基本是一样的,这点有无数的测试已经证明过了不用怀疑。而超过4G的空余内存对32位程序来说基本没啥关系(看到我上面截图里群星的进程后面有个*32吧,就是表示这是一个32位程序),32位寻址限制了一个程序最多占用2G(通过指令可以划分3G),而加大内存在64位进程中作用更明显一些但也有限,除非是一些自己有BUG内存泄漏的软件否则内存消耗也是比较有限的。因为通常来讲一个游戏在设计过程中会针对内存占用进行优化,毕竟它需要适应不同配置的电脑。比较常用的有两种手段,一种是区块加载,将地图划分成若干个区块,每次只将玩家和周围的区块加载到内存里,这样一来内存占用相对稳定,但是一旦玩家进行远距离传送(例如GTA5切换人物时需要读图)或者以超快的速度运动(修改器等)就会出现加载不及卡顿的情况,而且玩家视野之外的区块就只能不处理了(例如MC里你远离家的时候你的红石电路是不工作的)。另外一种是预测性加载,通过一定的加权算法,优先加载玩家最可能用上的数据,加载完成后如果还有余裕则加载次一级可能用上的数据。这样的算法最大的优点就是充分利用内存,理论上你内存足够大可以把整个游戏加载到内存里,这样不管去哪都不用读图简直爽的没朋友,而内存不够也可以玩,大部分时候一样能获得流畅的游戏体验。但是一旦算法出错,或者玩家走位过于风骚,经常用上那些没有被加载进内存的数据,那结果就是瞬间卡顿。也就是说这个方法对小内存非常不友好,而且在内存管理上也比较麻烦容易出现各种BUG。

而超线程技术则跟多核心完全是两个概念。
超线程技术其目的是更好的利用CPU核心的空闲时间。CPU核心在运算中往往会遇到需要停下来等待数据传输或者是其他核心运算完成的情况。但是在这种时候核心的缓存依然是被占用着不能用来进行其他的运算。等于说核心的运算能力在这短时间里就被完全浪费了。而超线程技术就是用来充分利用这些伪占用的时间的技术,通过给单个物理核心分配两个逻辑线程,这样一旦A线程遇到了需要等待的情况核心就转头先去处理B线程的内容,可以减少这种闲置而被占用的情况,提高CPU的运算效率。但是这种提高是针对整体运算速度的,对单个进程来说其实没有什么影响,甚至在一些极端情况下反而会降低单个进程的处理速度(简单的举例就是一个核心不使用超线程技术时是处理一个指令耗时一秒停半秒等待下一个指令,那么这个线程的处理速度是1.5秒一个指令,而总处理速度也是1.5秒一个指令。而使用了超线程技术之后,算一秒,然后去另一个线程再算一秒,再回来算下一个指令,于是总的处理速度提升到每秒一个指令,但是对单个线程来说反而变成了两秒一个指令)
回复

使用道具 举报

发表于 2017-6-6 16:17:29 | 显示全部楼层
FRIGHTER 发表于 2017-6-6 00:09
当然可能有人就觉得那英特尔搞多核处理器有什么卵用?设计/制造更大的内存有什么卵用?反正吃不上不是么?
...

话说大家说了那么多,我就不说了。

我弱弱地为楼主提出意见行不?

既然楼主有大容量内存,可以把内存当硬盘用,把游戏装虚拟硬碟里减少硬盘的使用提升性能
回复

使用道具 举报

发表于 2018-1-12 08:04:29 | 显示全部楼层
这游戏不是吃CPU吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|DeepTimes.NET 太空游戏站