• 关于引擎代码从Delphi 2007 升级至Delphi 10.1的一些历程


            代码升级确实很麻烦,不是一般的麻烦。

           因为需要整理出一套配合我自己写的D3D绘图引擎,所以我选择了以前的IGE作为项目的开端。原因很简单。因为现在的那些源代码是无法完成这个工作的。

           而且如果有了一套完善的基础版本,那么以后无论想改成啥都容易得多。

           说说绘图引擎,目前HGE算是主流吧,其实这是大家没有法子的选择。经过各位的总结,目前的HGE算是比较完善的。不过啊,我还是那句话,HGE原本就是给小型游戏搞的绘图引擎,不管你怎么改,底层写法如果没有改变,那么你就无法在大型的游戏里面得到理想的结果。

           那些代码,一张图片锁一次缓存区,一帧画面,到底要锁多少次?

           另外为什么一帧绘图得翻转n次?

           看不明白,这是一种什么样子的绘图思路,确实令人费解!

          如果是三维游戏,那么这个游戏会死得很惨!

           也有人采用ASP绘图引擎来做,结果很明显,达不到要求。这个玩意就不提了,从底层开始,人家的四边形面片,原本是用来做GUI的,你拿来做游戏主绘图,可以啊,不过底层结构你得改啊,不容易的,一大堆源代码,彼此嵌套,不说改了,理清楚逻辑就不是人做的事情。

           另外我想不明白的,一个主类的函数,是虚方法,这个没有冲突,问题是,这个方法得子类来写具体的实现,这个也没有问题,问题是,这个函数有点奇怪了,你在写主类的时候,怎么知道要传入那些参数,另外你怎么肯定这个方法转了几百次之后,它是不需要改变的。这些奇葩的玩意,在ASP的代码架构里面到处都是。

            我只知道,哪怕是一条函数,都是经过多次检测之后才肯定没有问题的。也就是说,外国佬在测试完子类实现代码之后再复写主类。我的天,真是有必要吗?

            ASP不是一个难字可以形容,绕,非常非常绕,满满都是坑。

             绘图引擎最关键的不是逻辑代码,而是直绘机制,干脆利落,为什么,因为这样做,效率高,而且没有隐患。

            什么隐患?就是不知道在什么时候给你弄出麻烦,而且你还无法知道原因所在。

             有人说,这些根本不具备什么技术含量!

             有,但是你不知道!

             你试试游戏帧速率在只有8,9帧的情况下,一下子把帧速率全面提升到几乎与显示器刷新率持平这种程度。

             另外关于写字,其实我不太明白,为什么还有那么多人纠结这个问题。

             当然了,游戏写字,很多人依然采用老套的画BMP图片,然后阿尔法处理像素,之后再转纹理,确实辛苦啊!还有干脆弄成资源文件读取方式,满满都是泪。

            其实拖慢帧速率的罪魁祸首就是像素拷贝,得至少拷贝两次啊,一张图片,你不慢,谁慢?

             没有什么好说,直接采用D3D9原本的函数,一次性写出来,想写啥就写啥,想采用什么字体就采用什么字体,人家三维游戏都没有纠结这个问题,你二维游戏纠结个啥。

             然后就是批量绘图,客户端里面,画地图三层结构,可以完全打开批量机制,等于是锁缓存区只要用到几次左右就合适,当然把握好的话,三层地图只锁定一次就行。

             由于写字跟绘制图片不同机制,所以不能够全面采用批量机制,但是至少解决了三层地图绘制效率的问题,当然后期可以继续优化,把握好的话,在大型PK的情况做一些优化处理,效率应该更好。

             至于GUI不必多提,这个玩意想咋弄都成。反正图片是死的,一次性画好,后面不必再创建纹理,没有必要。除非纹理掉失了,再重新创建就是了。最最不重要的部分就是这里了。

             当然了,一旦GUI控件达到千个以上,那么你需要考虑的就是,这套代码应该怎么优化了。这个时候就不要提升级的事情了。

             经过了几个月的奋战,整套代码已经升级到delphi 10.1版本下

           其实这个过程一点都轻松,可以说满满的一掬心酸泪。

           有的朋友问,为什么要升级啊,是啊,为什么要升级呢??

           是的,为什么要升级,哈哈哈哈哈哈哈,为什么要升级??哈哈。

           都是程序员,这个笑话就不多提了,谁不比谁聪明多少!

           ---------------------------------------------------------------------------------------------------------------

           我的劝告,如果可以,最好跟几个朋友一起干,一个人得累死,就像我这样的!

           真是很累,你得面对无数次程序崩溃,电脑系统蓝屏等等

           最要命的都是字符串,以前那种直接发送字符串方式已经不行了,不管你填充入内存或者直接发送,都不行,你得面对各种各样的乱码,然后程序崩溃!由于数据类型相当复杂,而且让人无奈,你想想人物数据结构有多么复杂吧。

          里面成员变量嵌套各种数据结构,字符串类型的,布尔类型的,啥都有,确实吓死人,不说传输了,就算是保存,你都不敢完全肯定不会出错。

          花在网络通讯方面的时间是最多的,因为得不到正确的结果,所以一次次改变代码函数,一次次测试,最终才解决掉。

           真是悲催,以前的都是采用直接发送字符串的方式,确实很写意轻松,现在新编译器下,说真的,我感觉对字符串处理还不是很理想。当前程序下,各种字符串填充内存块,拷贝是没有任何问题的,但是不能动,哪怕一点点,就像M2跟网关通讯那样,后面拼接了内存,最后的结果,出现大量的乱码和掉包。

          其实这些都是以前不严格的做法造成的。

          说真的,那些代码很难保证程序的稳定性,尤其是一些设置参数,几乎是心血来潮就各种写,各种作,这里一套,那里一套,还有一个全局的的,自己也来一套,之后,到底谁改变了谁,天知道。这样玩意能稳定,去,算了吧。

          整套程序要稳定,第一就是,设置参数必须统一。这没有什么好说。

         暂时这样吧。

  • 相关阅读:
    【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况
    【官网翻译】性能篇(三)为电池寿命做优化——概述
    【官网翻译】性能篇(二)通过线程提高性能
    Mybatis+Struts2的结合:实现用户插入和查找
    在安装mysql出现的错误以及解决方法
    关于PHP的内置服务器的使用
    误用.Net Redis客户端CSRedisCore,自己挖坑自己填
    dotnet代码管理之密钥分离策略
    dotnetcore三大Redis客户端对比和使用心得
    生产环境(基于docker)故障排除? 有感于博客园三番五次翻车
  • 原文地址:https://www.cnblogs.com/GameDelphi/p/7761494.html
Copyright © 2020-2023  润新知