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

GPT4又把程序员取代了?(下)

2023-03-22 10:24 作者:pathologyenigma  | 我要投稿

书接上文

第一个错误是类型不对,需要转类型,第二个应该是和某个类型重名了,第二个问题它直接改名字就解决了,但第二个问题它试图通过转换指针类型来解决,显然是不合理的,加上一些其他不合理的设计。

我们一步一步告诉它需要修改什么(不然它理解不了):

小聪明

实际上我们这是个头文件,如果使用这个小聪明,那么可能会导致多个文件在包含这个头文件的时候重置__COUNTER__宏或者其他问题

于是,我们让它添加一个extern全局变量存储id,extern uint32_t component_id_counter;(修改不多,就不截图了,专栏一长就开始卡,打个字都需要几秒钟),将常量后面的__counter__换成了这个变量的++(注意,虽然xx++在c++现在是ub,但在c中还是原来的那种效果,话说回来C++岂不是......)

然后我们可以适当的让它做些优化,以方便我们全局管理不同的hashmap,即将不同component的存储通过这里的这个typeid绑定到一个全局的hahsmap中

显然它理解了我们需要做什么,但做法确实错的

由于接下来的修改可能比较难描述,所以这里再次使用中文

但是,这里还是不对,每次都会重复初始化hashmap
它又理解错了

然后外部的map得初始化,但此时上下文并没有可以用的allocator,所以其实更好的方案是建立一个world类型来管理这些逻辑

整体逻辑貌似没有大问题,但代码实现可能有点不对劲

让我们来一点一点让它修复

它怎么用从哪里编了一个变量出来

那么,我们先给world加上一个实体管家吧:

很简单直白啊

然后构造和析构函数更新一下:

这样实现貌似回收有点麻烦

那么,我们具体一点

忽然c++?

那自然是reject了,那么我们只能让它写个deque了

它并没有写完,但是我们这里不应该使用链表类型的deque应该使用动态数组类型的deque所以我们让它打回重写
是不是发现和pool有点像,但这里是一个单独的类型,会减少一些心智负担(其实都是它的负担,我就一个代码审核)

但是,它没有使用我们提供的allocator,也没有在内存不够的时候扩建,我不满意:

现在就将其用作entity管家了:

那么,接下来修改系统的问题:

首先是系统函数的定义不应该规定固定的参数,这就不能想获取什么就获取什么了

卧槽,直接整数组?

而且貌似component table有点不太对,那就先修改component table

不对劲,貌似之前的逻辑是无脑消除所有component的类型放进去,现在每个component类型自己有一个map,也就是我没有仔细检查宏,那个宏还是不对
让它把宏修正一下
好像还有哪里不对, allocator呢?

接下来的问题是各个component的hashmap类型并不相同,如何放进全局的这个map里面?

那么只有void*可以帮我了

看起来正常了(至于宏后面掉了的\我给补上就好),接下来为了避免重名,我们需要一点类型别名:

它似乎理解的是name冲突了
具体点儿

接下来,加点系统相关的功能,比如系统需要多线程运行之类的

只有很简单的pthread调用,但一开始也不要要求太高
看看它理解的了吗

看起来它理解成我们就是需要这两个特定的类型了

现在就有点样子

然后,之前的系统自然是不能用了,但也并非仅仅将这里的这个函数当成系统,所有系统都具有直接访问world的权利,数据必然爆炸

那么我们不妨初步设计一种方案,一个多线程执行管理器,一个为这个多线程执行管理器分配数据的数据管理器用于根据任务需要的数据分配数据

看起来还行?

但貌似系统的类型还不太对,不过得先让它使用page allocator

我们得让它提供反复执行系统的逻辑

看起来是可以的,但这样会让两个run函数被block住
对了一部分,但不完全对

它将所有task的执行移到run_task中,但还是在加入任务的时候就把数据放进去了,由于不知道有没有发生copy,所以我们将无从得知数据是否会随着程序执行而更新,而且它虽然移动了逻辑但是没有调用专门的线程,所以还是block了

它有改回去了,呃,真的是用英文描述不清楚了

其实任务是每一帧执行,而不是单独开一个线程然后让这个线程跑循环,这样不很快你cpu就炸了吗

它还是不理解

看来得采用我写注释它来实现的方式了

看起来能初步完成任务

然后得让它更新task manager

嗯?那岂不是task也要改?
呃,还不是能直接使用world?
让它自查
你看它其实都明白

其实,如果统一为任务分配资源就可以适当减少心智负担:

貌似没有保证原子性,但还是表明上的线程安全(指我不跑一下代码我也看不出来)

那么,我们来试试现在的代码

错误有点多,这里连一半都不到

除了一些语法错误以外还有一些类型错误,包括但不限于使用void*来表示某个hashmap但无法转回去之类的,在下实力有限,无法修改这些代码并使其正确,各位有兴趣可以尝试一下,以下是我尝试修改了一些但仍然问题很多的代码:



GPT4又把程序员取代了?(下)的评论 (共 条)

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