我已经在业余时间做了2. 5年的个人飞行模拟项目,用C写的,在Windows 7 PC上使用OpenGL。
我最近不得不搬到windows 10。硬件完全一样。我重新安装了Code::blocks。
结果是,在系统启动后,我的项目第一次启动时,性能还可以,与我以前在windows 7上看到的情况类似。但是,第二次、第三次和所有后续启动时给予我的性能都较低,与第一次运行相比,帧速率的流动性明显降低,肉眼可以察觉到。这在windows 7上从未发生过。
任何时候我启动我的系统,第一次运行是快速的,下一次运行是缓慢的。
我看了一下任务管理器,同时做一些运行。第一次运行是由我的CPU的4个核心之一处理的(iCore 5 -6500)大约为85%。在接下来的运行中,负载将分布在4个内核上。在4个内核上的较慢运行期间,我尝试修改关联性并将程序只指向一个内核,但性能没有显著提高,所选内核在满负荷下工作,我也是
我的C代码在这个阶段没有显式地使用任何线程函数。从我谦虚的程序员的Angular 来看,只有一个主线程在main()中运行。在任务管理器上,我可以看到当我的程序运行时,大约有10到14个线程是活动的。我猜测(错误?)它们是通过使用操纵杆、跟踪ir或其他与GPU的通信任务隐式创建的...
会不会是因为程序停止时内存没有被正确释放?我以为windows会正确释放它,即使我在使用“new”后忘记了一些“delete”。
有没有人遇到过类似的情况?你们想到什么解释了吗?
有什么建议可以更好地理解这些事实吗?显然,我的最终目标是无论发射多少次都有一致的性能水平。
尝试上传任务管理器查看的第二次运行的屏幕截图:
尝试上传任务管理器查看的第一次运行的屏幕截图:
1条答案
按热度按时间o4tp2gmn1#
嗯,我得到了一个问题,当切换到win10的客户端在我的工作太在这里很少我遇到所有因为Windows10已经改变了进程的调度创建了很多问题,如:
1.较旧的windows无块线程同步技术不再起作用
放置得很好的
Sleep()
有时会有帮助。顺便说一句,从w2 k切换到wxp时也遇到了类似的问题。*较旧的单线程应用程序运行速度大幅降低,并频繁冻结数秒
通常,将亲和性设置为单核可以解决这个问题。您也可以在任务管理器中这样做,如果有帮助的话,您也可以在代码中这样做。下面是一个如何使用winapi进行此操作的示例:
*混乱的驱动程序计时导致僵尸进程甚至完全冻结和/或BSOD
我在工作中处理USB,有时在Win10上这是一场噩梦。最重要的是,Win10往往会在设备上强制执行错误的驱动程序(如GFX卡、自定义USB系统等...)
*如果应用程序未及时响应
wndproc
,则自动冻结关闭应用程序在Windows10中,超时时间比旧版本小得多。如果出现这种情况,您可以尝试在兼容模式下运行(在桌面上的图标属性中设置)(但不适用于#1、#2),或者更改应用程序代码以加快响应速度。例如,在VCL中,您可以从阻止代码内部调用
Process Messages
来补救这一点。或者你可以使用线程来完成繁重的工作...只是要小心渲染和使用winapi,因为从主线程外部访问一些winapi(任何窗口/视觉相关的东西)函数会造成严重破坏...最重要的是,旧的IDE(特别是MCU)不再正常工作,新的IDE通常更糟糕(或者因为旧版本中存在的功能不足而无法使用),所以我对Windows7充满信心,以供开发人员使用。
如果以上都没有帮助,那么试着记录一些任务确实需要的时间......它可能会告诉你哪部分代码有问题。我通常使用这样的时序图来做这件事:
两个x,y轴都是时间,每个任务都有自己的颜色和图表中的行。图表在时间上滚动(在我的情况下向左),并有可变的时间刻度。数字显示实际和最大(或滑动平均)值...
通过这种方式,我可以查看某个任务是否占用了太多时间,甚至与下一次执行重叠,峰值也很明显,并且所有任务都在运行时运行,而无需任何调试工具,因为调试工具可能会改变执行行为。