欢迎光临散文网 会员登陆 & 注册

大忙人系列-程序猿在想什么 (四·一) C++的食用方法

2020-01-21 21:17 作者:汐留楓Channel  | 我要投稿

B站的日更终于榨干了脑子,之后就随便想起啥写啥吧。


一. 多态+状态机(怎么又是你)

一如既往的状态机。

第一次对这个东西好像似懂非懂的时候还是在想着怎么整游戏逻辑,当时用的是python,作为个duck type,python自然没什么活好整,不过后来想了想C艹怎么整。

具体逻辑是这样,一个游戏当然除了标题界面外还有游戏界面、战斗界面、菜单界面。不同界面有相同行为当然是整个多态的活,都从一个类里面继承而来然后重载个像update呀render或者draw呀,然后没对象new一个出来就行。但是,战斗结束或者从菜单退出以后要回到上一个界面,所以需要额外的一个栈来保存历史的数据;按具体的按键能进入其他界面,就需要状态机+按键的结构,比如从标题界面按回车进入地图界面,再按Esc进入菜单界面,全部都是状态的转换。

另一个例子是在动画中,比如unity的动画系统就有个状态机。再比如《游戏编程模式》里面的例子,从输入的模块获得了输入以后如何影响玩家控制的角色,传统的方式连个简单的趴下和跳跃都会有很多情况(趴下中跳跃、跳跃中空中趴下),如果全部在输入模块里面处理肯定是地狱,这个时候将按键数据派发给主角类然后主角类根据自身的状态自己改变自己,从而能既完善又好编码。


二. 局部性

主要是看《游戏编程模式》看到这个就顺便水点东西吧。局部性这东西,虽然平时写代码没必要特别考虑,但是也见过作死结果还把自己埋了的。局部性就时间局部性和空间局部性,尽量让要操作的数据挨的近一点总没啥错。而且OOP经常被黑牺牲性能加强逻辑,所以也整除了面向数据编程(也就是说可以不用再面朝着对象【滑稽】)。

遥想当年让写一个冒泡排序排十万个短字符串吧,一直挪字符串肯定很蠢,就简单的用指针+std::vector<std::string>然后补个compare函数就行(排序和字符串比较默认顺序好像不一样的,有改动所以要自己写),指针虽然破坏局部性但是这个例子下其实还好啦,最后用gcc跑了二十几秒吧。然后某日常被我黑的同学就跑来找我说他的程序已经跑了几个小时了还没出结果,一看,Debug下,还没有用std::string,自己整个局部的字符数组又用指针又拷字符串,看的我一脸懵逼。



三. 模板

模板一时爽,一直模板一直爽,只是报错看不懂。

简单的模板可以很简单,就是可以批量生成应对不同类型但是核心算法相同的代码而只用写一次,比如一个链表,无论存啥数据结构基本的算法与操作都一样,那就没必要不同链表都实现一次。

e.g.

template<typename T>

class LinkedList {

public:

     LinkedList();

     ~LinkedList();

     void insert(const LinkedList* pos,const T& data);

     ......

private:

    LinkedList* head;

};

如此一来,一个简单的链表就成型了(虽然实战这么写会被人打死)。

除此之外,还可以用函数模板。上面在类前是类模板,那在函数前就是函数模板了。

如果以上的都能看懂,恭喜您知道了有个东西叫模板了,接下来当然是type_traits SFINAE metaprogramming云云的各种骚得C艹之父Bjarne自己都没想到可以这么整活的操作了。

想当年某编译课被安排了搞traits的活,还以为是去整点type_traits里面的黑科技,最后发现居然是老师叫我们去查查,对,就那个宇宙第一PHP,为了支持“多重继承”整活整出来的辣鸡语法。就本质而言,虽然在语法层级上的技术不同,但都是给已有的类扩功能,C艹、Python、Ruby有各种骚操作而已(PHP你真鸡儿丢人赶紧退群吧你这不就个interface人家Java的interface都升级了)。

虽然随着某C艹的版本更新,不少私活已经可以通过新语法解决了,但是去看老一辈整的活,还是会惊叹这些人都怎么想到的怎么可以这么整。

<= to be continued(好像第一大部分的几次忘记加了?)

大忙人系列-程序猿在想什么 (四·一) C++的食用方法的评论 (共 条)

分享到微博请遵守国家法律