不信的话,可以在不修改代码的情况下在此点一下运行按钮,这时候就可以发现代码是瞬间运行完毕的。检查自己的代码是个漫长的过程,同时很枯燥,开发者等于要推翻自己之前的想法重新排查代码中错误的部分。如果开发者收到的是这些邮件:“我半个身子沉到地下了!!”“我养的宠物走在路上突然死了!!”“敲尼玛!!!你游戏又崩溃了,退款!”那么这些没头没脑的邮件基本不会给予BUG修复有任何实质上的帮助,正确提交BUG的方式应该是:1.详尽说明BUG出现的时间2.你当时在游戏中做了什么操作3.使用的是什么设备4.问题出现的时间点这些详尽的BUG反馈能帮助开发者更快修复BUG。
软件是怎样控制硬件的?
我觉得你是想问,软件是怎么控制一个设备,如机器人、数控机床,让它们执行设定的动作的。不论怎么变化,软件控制硬件,都离不开计算机的中央处理器CPU,或者单片机MPU。因为只有处理器才能把控制软件的指令,传递到接口电路,最终控制目标设备的动作。以下介绍几种我用过的控制方式。通过I/O口进行控制CPU有GPIO接口,MPU有P0~P4及更多的IO接口。
这些接口,可以通过软件设置,做为输出、输入口。从CPU,MPU出来的控制信号,一般不能直接控制目标对象,比如最简单的LED灯,电机等,必须经过一些锁存芯片、光电隔离芯片、继电器、接触器、信号驱动等电路,才能控制目标的动作。一些成熟的电机驱动器,也可直接接收从处理器出来的输出信号,只要用一些芯片进行信号转换即可。
通过内存扩展地址,用可编程芯片如PLC,CPLD,FPGA等对目标进行控制。有的控制对象需要几十、几百个控制点,这样P口就不够用了。解决的方法,就是用扩展外部存储器地址的方法,如使用E200H,E300H......这样的扩展地址线,通过PLC、CPLD、FPGA等可编程器件,可以扩展出需要数量的控制输出。
很多硬件从业者,很擅长用PLC、CPLD、FPGA等芯片,以至于单片机最直接的P口被束之高阁,只完成看门狗Watchdog最简单的监视作用。通过CAN,EtherCAT,ISA,PCIE等总线接口传递控制指令随着外部控制器件的日益智能化、处理器化,各种总线应运而生。如上位机为高速的PC机,下位机为控制各种动作的单片机,那么PC104的ISA总线接口、PCIE接口、CAN总线接口等,就是最好的选择。
或者下位机直接就是一个支持EtherCAT总线的电机驱动器。通过这些总线接口,可以快速地传递上位机的控制信号到控制单元中。总结:软件对硬件的控制,有很多种实现方式,IO直接控制;扩展地址外加PLC,CPLD,FPGA可编程芯片控制;CAN,EtherCAT,ISA,PCIE等总线接口控制方式。根据需要,灵活运用。
游戏中的bug都是怎么来的?
BUG这个存在,阻拦在开发者和玩家之间。游戏中的每一个致命的错误,每一次突发的崩溃,对于开发者而言都是一次巨大的打击。那么BUG是怎么产生的呢?简单来说,游戏中会产出BUG大抵是下面三个原因造成的:1. 程序员没有能力修复,所以让玩家来承受。2. 可以修复,但修复的投入大于回报,那就当做没看见。3. 在测试当中没有遇到,玩家发现了。
以上,就是玩家为何会在游戏中看到BUG的原因。BUG产生之后,一般由玩家反馈至开发者,但开发者也很苦恼啊,因为他要面临一个问题——重现BUG。你找到一个BUG容易,但开发者要解决一个BUG时就需要从根源入手,测试BUG真正触发的条件是什么,这需要耗费大量的时间。简单举个例子:在一款游戏中,开发者遇到一个玩家提供的BUG,他苦思冥想啊,日夜操作啊,呕心沥血地看代码。
发现自己的代码都很正常,并没有什么错误的地方。检查自己的代码是个漫长的过程,同时很枯燥,开发者等于要推翻自己之前的想法重新排查代码中错误的部分。直到最后,这位开发者拍着大腿跳起来:“老子终于找到了!!!”各位猜猜他在哪里找到BUG出现的原因呢?原来是一个数据表中弄错了一个索引值,就这一个数值导致了BUG的出现。
当然他检查数据表的过程肯定没有我写下来“数据表”这三个字那么简单。一个数据表中包含了几十种的类,用于储存游戏中的一切数据,同时还跟其它的数据表有关联。问题就出在他关联的那张表上只设定了接收16个值,但是他用于储存游戏数据表的设定了接收24个值。这中间一来二去,游戏中就会丢失8个值的数据,这就导致了游戏BUG的出现。
以上,还只是玩家提供准确BUG的效果。如果开发者收到的是这些邮件:“我半个身子沉到地下了!!”“我养的宠物走在路上突然死了!!”“敲尼玛!!!你游戏又崩溃了,退款!”那么这些没头没脑的邮件基本不会给予BUG修复有任何实质上的帮助,正确提交BUG的方式应该是:1. 详尽说明BUG出现的时间2. 你当时在游戏中做了什么操作3. 使用的是什么设备4. 问题出现的时间点这些详尽的BUG反馈能帮助开发者更快修复BUG。
为什么感觉一台计算机能花几分钟运行几行代码,却能如此快速地运行复杂的东西,比如游戏?
问题问的大错特错。什么叫“感觉一台计算机能花几分钟运行几行代码”,看这一句,我猜题主是一个计算机专业的新生,编写代码的时候产生了这种疑问。但是如果你耐心继续学习,等到大二大三把一些专业课上完的话,就不会问出这种低级问题了。编译和运行不一样很多初学者分不清编译和运行,认为只要点击了IDE上的运行按钮,程序就开始运行了,其实这是错误的。
就拿C语言为例,点击Clion或者visual studio或者其他IDE上面的运行按钮之后,IDE会首先保存代码文件,然后开始编译,生成后缀名为.o的中间文件,然后根据头文件再把生成的和系统库链接在一起,最后才能生成可执行文件。编译这个过程是一项非常复杂的工作,具体有多复杂,等到题主学了编译原理这门课就明白了。
根据编程语言的设计不同,编译的时间也有长短之分,但是一般情况下都远远远远长于程序运行的时间。一旦编译完毕,就按照专业课上程序的复杂程度,基本上都是瞬间就可以运行完毕的。不信的话,可以在不修改代码的情况下在此点一下运行按钮,这时候就可以发现代码是瞬间运行完毕的。现代处理器的运行速度是非常非常快的我从小就对计算机非常感兴趣,每次学校发的计算机课本我都是第一时间看完,然后反反复复的来回看。
没办法,谁叫当时家里没钱买电脑呢。所以计算机课本里面的一些内容,我至今仍然都记得。世界上第一台计算机叫做埃尼阿克,运行速度是每秒5000次加法。这个速度现在虽然看起来非常垃圾,但是还是远超手工计算的。那么现在处理器的运行速度是多少呢?我查了一下维基,2017年出厂的AMD 锐龙1800x,每秒钟可以运行三千亿次指令。
这还不是现在最新最强处理器,如果是现在新的处理器,速度只会更快。之所以我们感觉程序运行慢,一般情况下都是因为出现了瓶颈拖累了处理器。例如下面的代码,将1000个数字打印到终端上。因为涉及了IO,所以会给人速度慢的错觉。要知道向终端输出是一件非常慢的事情。但是如果你通过重定向将输出转移到文件里的话,可以发现程序仍然是瞬间运行完毕。
我曾经尝试过输出几百万的数据,导出到文件中也就是几兆的事情而已,也是瞬间完成的。最后回到问题,首先程序运行速度和代码行数没有任何关系。如果是一个死循环,那么就算他很简单,也是永远也运行不完的。就算只调用了一个函数,可能这个函数背后有很大一坨逻辑,因而运行速度会受到影响。然后是那些编程题,其实都属于小儿科的水平,纯运行的话,基本上都是瞬间就可以运行完成。
之所以感觉到慢,要么是你把编译时间当成了运行时间,要么就是涉及到了IO等浪费时间的操作,不要因为有东西拖后腿就怀疑现在处理器的能力。最后就是游戏了。游戏作为一个高度工业化的产品,做出来就是为了让玩家玩的爽,做出来就是为了赚钱的。那么游戏自然是一个经过高度优化的计算机程序,理所当然的可以发挥出处理器本身的水平。
2023-12-20 / 1.1
2023-12-19 / 6.0.1
2023-12-19 / 6.0.1
2023-08-25 / v3.1
2023-08-25 / v1.0.3
2023-08-25 / v1.0.1
2023-08-25 / v2.19.1
2023-08-25 / v1.2.0
2023-08-25 / v2.0.1
2023-08-25 / v1.5.1
2023-08-25 / v4.4.0
2023-08-25 / v1.0.03