使用老爷机想玩LOL还要听音乐?OK,我满足你。

版权声明:本文为Dark Pigeon原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37217636/article/details/79515978

Hacker第一原则,不做重复的事情。

所以我第一件事就是去寻找哪位先生和我一样要做一个音乐播放器,无奈每一个人都是懒鬼,各种瞎搞,两小时软件使用突破天际,CPU还好点,不过说实话,MFC的弊端不就是这个嘛。

所以我拷了一个人的源码,他这个Project已经挺好了,两小时内存占用还没过1G。

试过一个人的QT项目,啧啧,两小时内存占用1.3G。

不是我吹,你这个要是交付给客户,你工作立马就没了,请动点脑子写代码好吗?不要以完成为第一要任。

在该贴贴主的基础上改的:http://tieba.baidu.com/p/2707246273?pn=2

源码下载自百度云:http://pan.baidu.com/s/1b1HKM

打不开就算了。我也没有存备份。

好了,我要开始吹水了,请大家拿好板凳坐下。

本来的界面我改了一下,如下:


毕竟是MFC做的,丑了点大家认了吧。

主要就是加入了一个导入播放列表。


导入会尝试读取MML格式的文件,至于MML格式的文件肿么样呢?



所以,不用小心翼翼的像什么Apache配置文件一样,生怕留下个字符就无法启动了不是?

那么,我的标题是老爷机打游戏还要听歌?首先我们来看一下常用的音乐软件的资源占用率吧!

应用                                                    CPU            内存        磁盘        网络            GPU


OK,来看看基于那位贴主改造后的程序是肿么样的占用率呢?


请注意哦,这是已经开始播放歌曲啦!是同一个MP3文件。

源程序此时的CPU占用峰值4.8%,后平衡至1.6%,内存持续增长,播放第一首歌时,为18MB+,后一小时持续增长。

磁盘都是0.1MB/秒。

此外,源程序有环状播放队列,但是对于这两个按钮,无环状循环。

因此,我对这两个Button的代码做了一下修改。


其实环状循环大家都会,只是想不想得到罢了(打码的那一个等下后面吹)。

同理另一个按钮:


至于导入列表是怎么做的呢?其实也很简单,但是我想贴主并没有以一个用户的角度思考这个问题,以他那种方法添加音乐有多麻烦,是很明显的。

代码如下:

void CMPlayerDlg::OnBnClickedButton7()
{
	char fliter[] = "音乐列表文件(*.mml)\0*.mml\0"
		"所有文件(*.*)\0*.*\0\0";
	CFileDialog fdlg(TRUE);
	fdlg.m_ofn.lpstrFilter = fliter;
	if (IDOK == fdlg.DoModal())
	{
		CString path = fdlg.GetPathName();
		CString file = fdlg.GetFileName();
		bool LIST_ERROR = false;
		CStdioFile mml;
		CString str;
		mml.Open(path, CFile::modeRead);
		while (mml.ReadString(str)) {
			if (str.IsEmpty() || (GetFileAttributes(str)==-1) || PathIsDirectory(str)) {
				LIST_ERROR = true;
				continue;
			}
			else {
				list.InsertString(list.GetCount(), str);
				list.SetCurSel(list.GetCount() - 1);
			}
			//MessageBox(str);
		}
		if (LIST_ERROR) {
			MessageBox("列表文件有错!已忽略所有错误音乐指向!");
		}
		此行打码
		//list.InsertString(list.GetCount(), path);
		//list.SetCurSel(list.GetCount() - 1);
	}
	
	// TODO: 在此添加控件通知处理程序代码
}

不过是使用循环读取文件,然后插入队列罢了。

实现起来估计初中生都会了。

然后是各种显示优化了,再次重复,贴主肯定没有站在用户的角度上来思考这个程序要怎么做。我们做的不仅是能用,还要好用。


如果童鞋们自行编译了那位贴主的程序肯定知道这里和我的差距了。当前播放如果路径长一点,就只能看到是哪个盘哪个文件夹的了,这样还有意义吗?

根本就没有意义了吧!还有就是添加进入列表的音乐也是这个问题,如果路径长了我连歌名都看不到,还手动切歌?

列表那个控件右对齐即可。

至于上面的正在播放,也是改了一下,变得更加亲民。


代码是这样的,我将他的修改正在播放那个代码注释了,上面的是我的。那个GetFileNameFromPath是自己写的。


各位看官想必到现在估计已经在骂我了,还以为你很厉害,这样的代码我都能写,哪来的优化,骗我呢?

请你喝一口咖啡,耐心看下去好吧。

最后的自然就是资源优化了。

所以不要着急,嗯,好东西自然都是留在最后的。

不过先说一句,因为懒得鼓捣计时器,所以干脆利用控件触发和音乐切换来进行资源缩减。

优化基于EmptyWorkingSet了,别问我为什么不自己做了,自己做肯定可以,想之前学算法各种骚优化,想了想,

还是得遵循Hacker的原则啊,不能重开发啊!

核心代码:


然后在控件事件的最后一行加入这个函数。

程序将自动清理内存空间。真正的做到了低资源占用率。

好了,听我吹水了这么久,还不关了这个界面?



还没关?那行吧,我把Github地址给你了:https://github.com/1426652334/MiniPlayer

猜你喜欢

转载自blog.csdn.net/m0_37217636/article/details/79515978
今日推荐