问:程序员大牛与菜鸡分别写音乐播放器,播放同一首歌,音质会有差别吗?
答:差别非常大,笔记本外放我都能听出来,while循环声音更纯,但是复杂混音解析度不够,for循环在对于i的操作过于规整化,导致内存固定周期的读写会产生干扰波,不属于白噪,会导致音乐略微失真。
好的播放器尽可能使用静态变量,不得不用非静态的时候尽量让变量创建和删除的时候有高频音或鼓点的遮盖,这个就非常需要经验了。不过现在可以用机器学习来解决。
内存回收一定要手动进行,不要用智能指针,更不要用java,java写出的播放器内存块不停移动的噪音就像一个施工队在你家窗外修路一样。android音质一直不如iphone和语言也有很大关系。
新手写的播放器往往只有一种解码方式,能听个响就算成功。高手写的播放器至少要有6个解码模块来适配不同类型的电流,还有一个电流预判的贝叶斯模块来预测电压波动和抗电涌,和一个解码器实时调参模块来做分支预测选择合适的参数适配电流,调参模块非常难,没有大cpu厂做分支预测5年以上经验的,基本搞不好。6个基本模块分别是针对水电,火电,风电,核电,电池和太阳能,但是现在城市供电都是混合供电,一般还需要一个卡尔曼滤波器来对6个解码模块加权来进行协作解码。
新手写的播放器在无外界电磁干扰,设备用电池的时候还勉强能听。但是需要外接电源的时候基本属于噪音生成器,高手写的播放器无论电池还是电源基本能达到一致。
评论:
值得一提的是,给变量取名也会对音质有所影响。大牛程序员会尽量使用同一风格的作曲家给变量取名,而菜鸟程序员则不会注意这一点,造成音质上有所欠缺
新手因为没学过数据结构,只会使用线性查找,复杂度为O(N),听码率高的mp3时可能会产生延迟,左右声道进行不一致的情况。而高手在这里会使用二分查找树,或哈希算法,复杂度能减少为O(logN)甚至O(1),即使mp3码率达到320kbps,也不会听出任何延迟的感觉。
哈希查找声音比较杂,不如二分查找听起来均衡。
其实编译器也有很大讲究,gcc编译出的播放器奔放热烈,适合听欢快音乐,vs编译器编译的我个人感觉听蔡琴的更有味道,声音醇柔绵长,过几天想试试clion的效果呢
基本说到点上了,我还要补充一点。高手写播放器从来不会用break, continue, goto这类的语句,贸然的分支截断会产生音阶严重跳变,进而导致可怕的失真。btw,科普一下,齿音一般就是这么来的。