Hi there 👋

  • 欢迎来到猫猫的小木屋,我是猫猫,目前是一名自由职业者,专注于文字游戏开发。关注微信公众号【猫语互动】订阅博客更新~

用AI做东西 - (03) 揭秘GPT模型中的标记和预测逻辑

GPT 系列的 LLM 接收提示作为输入,然后生成文本。这个过程被称为文本补全。例如,提示可能是 “The weather is nice today, so I decided to”,而模型的输出可能是 “go for a walk”。您可能想知道 LLM 模型是如何根据输入提示构建输出文本的。正如你将看到的,这主要是一个概率问题。 在向 LLM 发送提示(prompt)时,LLM 会首先将输入内容分割成更小的片段(称为 “标记”)也就是 token。这些标记(token)代表单个单词、单词的一部分或空格和标点符号。例如,前面的提示可以这样分解: “the”、“wea”、“ther”、“is”、“nice”、“today”、","、“so”、“I”、“de”、“ci”、“ded”、“to”。每个语言模型 都有自己的标记符。在撰写本文时,GPT-4 标记符号生成器还不可用,但您可以测试 GPT-3 标记符号生成器。 从单词长度的角度来理解词块的经验法则是,100 个词块约等于英文文本中的 75 个单词。 借助前面介绍的注意力原则和 Transformer 架构,LLM 可以处理这些标记,并解释它们之间的关系和提示的整体含义。Transformer 架构允许模型有效识别文本中的关键信息和上下文。 要创建一个新句子,LLM 会根据提示上下文预测最有可能出现的词组。OpenAI 制作了两个版本的 GPT-4,上下文窗口分别为 8,192 个和 32,768 个。以前的递归模型很难处理长输入序列,与之不同的是,带有注意力机制的 Transformer 架构允许现代 LLM 将上下文作为一个整体来考虑。根据上下文,模型会为每个潜在的后续标记分配一个概率分数。然后,概率最高的标记被选为序列中的下一个标记。在我们的例子中,在 “The weather is nice today, so I decided to “之后,下一个最佳标记可能是 “go”。 然后重复这一过程,但现在的语境变成了 “The weather is nice today, so I decided to go”,这时先前预测的标记 “go"被添加到原始提示中。模型可能预测的第二个标记是 “for”。这个过程不断重复,直到形成一个完整的句子: “go for a walk”。这个过程依靠的是 LLM 从海量文本数据中学习下一个最有可能出现的单词的能力。

December 16, 2023 · 1 min · 猫猫

用AI做东西 - (02) 理解Transformer在LLM中的作用

Transformer 架构彻底改变了 NLP,这主要是因为 Transformer 有效地解决了以往 NLP 模型(如 RNN)的一个关键局限性:它们在处理长文本序列和在这些长度的文本序列中保持上下文时所面临的困难。换句话说,RNN 往往会遗忘较长文本序列中的上下文(即臭名昭著的 “灾难性遗忘”),而 Transformer 则能有效处理和编码上下文。 这场革命的核心支柱是注意力机制,这是一个简单而强大的理念。该模型不是将文本序列中的所有单词视为同等重要,而是"关注"其任务每一步中最相关的术语。交叉注意和自我注意是基于这种注意机制的两个架构模块,它们经常出现在 LLM 中。Transformer 架构广泛使用了这些交叉注意和自我注意模块。 交叉关注有助于模型确定输入文本不同部分的相关性,从而准确预测输出文本中的下一个单词。它就像一盏聚光灯,照亮输入文本中的单词或短语。突出显示预测下一个单词所需的相关信息,而忽略不那么重要的细节。 为了说明这一点,让我们以一个简单的句子翻译任务为例。假设我们有一个输入的英语句子,“Alice enjoyed the sunny weather in Brussels”,它被翻译成法语,“Alice a profité du temps ensoleillé à Bruxelles”。在这个例子中,重点生成法语单词 ensoleillé,它的意思是阳光明媚。对于这个预测,交叉注意会更多地考虑英语单词 sunny 和 weather,因为它们都与 ensoleillé 的意思相关。通过关注这两个词,交叉注意可以帮助模型为这部分句子生成准确的翻译。 自我关注指的是模型关注输入文本不同部分的能力。在 NLP 的语境中,模型可以评估句子中每个单词与其他单词的重要性。这可以让模型更好地理解词语之间的关系,并帮助模型从输入文本中的多个词语中建立新的概念。 举一个更具体的例子: “Alice received praise from her colleagues."。假设模型正试图理解句子中 “her” 一词的含义。自我注意机制会给句子中的单词分配不同的权重,在这种情况下突出与 her 相关的单词。在这个例子中,自我注意力会给 Alice 和 colleagues 这两个词更多的权重。自我关注可以帮助模型从这些词语中建立新的概念。在本例中,可能出现的概念之一是 “Alice’s colleagues”。 与递归架构不同,Transformer 还具有易于并行化的优势。这意味着 Transformer 架构可以同时而不是按顺序处理输入文本的多个部分。这可以加快计算和训练速度,因为模型的不同部分可以并行工作,而无需等待前面的步骤完成,这与需要顺序处理的递归架构不同。Transformer 模型的并行处理能力与图形处理器(GPU)的架构完美契合,后者旨在同时处理多项计算。因此,GPU 凭借其高度并行性和计算能力,成为训练和运行这些 Transformer 模型的理想选择。这一进步使数据科学家能够在更大的数据集上训练模型,为开发 LLM 铺平了道路。 谷歌的 Vaswani 等人在 2017 年发表的论文《Attention Is All You Need》中介绍了 Transformer 架构,该架构最初是为机器翻译等序列到序列任务而开发的。标准 Transformer 由两个主要部分组成:编码器和解码器,这两个部分都在很大程度上依赖于注意力机制。编码器的任务是处理输入文本,识别有价值的特征,并生成有意义的文本表示,即嵌入。然后,解码器利用这种嵌入产生输出,如翻译或摘要。该输出可有效解释编码信息。...

December 15, 2023 · 1 min · 猫猫

用AI做东西 - (01) 了解Chat-GPT

OpenAI 通过 GPT 模型创造了出了 Chat-GPT,使人与计算机的交流,可以像人与人之间对话一样简单。GPT-4 和 其他的 GPT 模型都是大语言模型(LLMs),通过海量的数据进行训练,从而达到了能够精确识别与生成人类书写的文本。 这些 AI 应用的出现,不只是一个语音助手那么简单。通过 OpenAI 的模型,开发者可以通过超强的自然语言处理的能力,来创造曾经只存在科幻小说里的东西。通过现在的 AI 模型,可以做出更优秀的智能助理,智能服务系统。在教育行业,可以完全针对每一人的学习风格,实施对应的教学方案。GPT-4 和 ChatGPT 完全开创了一个新的领域。 但什么是 GPT-4 和 Chat-GPT 呢?本文旨在深入探讨这些人工智能模型的基础、起源和主要特点。了解了这些模型的基础知识,就可以很轻松的创造出下一代由 LLM 驱动的应用。 作为 LLM,GPT-4 和 ChatGPT 是 NLP 领域的最新模型类型,而 NLP 本身就是机器学习(ML)和人工智能的一个子领域。在深入研究 GPT-4 和 ChatGPT 之前,有必要先了解一下 NLP 及其相关领域。 人工智能有不同的定义,但其中一个定义(或多或少是共识)认为,人工智能是指开发能够执行通常需要人类智能才能完成的任务的计算机系统。根据这一定义,许多算法都属于人工智能的范畴。例如,考虑一下 GPS 应用中的交通预测任务或策略游戏中使用的基于规则的系统。在这些例子中,从用户的角度来看,机器似乎需要智能才能完成这些任务。 ML 是人工智能的一个子集。在 ML 中,我们并不试图直接实现人工智能系统使用的决策规则。相反,我们试图开发一种算法,让系统从实例中自我学习。自 20 世纪 50 年代开始研究 ML 以来,已经有很多 ML 算法被提出。 其中,深度学习算法的应用比较广泛。深度学习是 ML 的一个分支,主要研究受大脑结构启发的算法。这些算法被称为人工神经网络。它们可以处理大量数据,在图像和语音识别以及 NLP 等任务中表现出色。 GPT-4 和 ChatGPT 基于一种特殊的深度学习算法,称为 Transformer。Transformer 就像阅读机器。它们会关注句子或文本块的不同部分,以理解其上下文并做出连贯的反应。它们还能理解句子中单词的顺序及其上下文。这使它们在执行语言翻译、问题解答和文本生成等任务时非常有效。 NLP 是人工智能的一个子领域,侧重于使计算机能够处理、解释和生成人类自然语言。现代 NLP 解决方案基于 ML 算法。NLP 的目标是让计算机能够处理自然语言文本。这一目标涵盖了广泛的任务:...

December 12, 2023 · 1 min · 猫猫

关于 ChatGPT、GPT、GPT-3、OpenAI

2015年12月,一群聪明的人为了一个共同的目标走到了一起:以有利于整个人类的方式促进和发展友好的人工智能。 萨姆-奥特曼、伊隆-马斯克、格雷格-布罗克曼、里德-霍夫曼、杰西卡-利文斯顿、彼得-泰尔、亚马逊网络服务(AWS)、Infosys和YC Research宣布成立OpenAI,并向该企业认捐了超过10亿美元。该组织表示,它将通过向公众开放其专利和研究,与其他机构和研究人员进行 “自由合作”。 OpenAI的总部设在旧金山Mission区的Pioneer大厦。2016年4月,OpenAI发布了其强化学习研究平台 “OpenAI Gym “的公开测试版。2016年12月,OpenAI发布了 “Universe6”,这是一个软件平台,用于衡量和训练人工智能的通用智能,跨越世界上的游戏、网站和其他应用程序的供应。 2018年,埃隆-马斯克辞去了他的董事会席位,理由是与特斯拉自动驾驶汽车的人工智能开发存在 “潜在的未来利益冲突”,但他仍然是一个捐赠者。2019年,OpenAI从非营利性过渡到上限营利性,利润上限设定为任何投资的100倍。该公司向员工分配股权,并与微软合作,后者宣布向该公司投资10亿美元的一揽子计划。随后,OpenAI宣布打算对其技术进行商业化授权。 2020年,OpenAI宣布了GPT-3,这是一个根据互联网上的数万亿词汇训练的语言模型。它还宣布,一个相关的API,简单地命名为 “API”,将构成其第一个商业产品的核心。GPT-3的目标是自然语言回答问题,但它也可以在语言之间进行翻译,并连贯地生成即兴文本。2021年,OpenAI推出了DALL-E,这是一个深度学习模型,可以从自然语言描述中生成数字图像。 快进到2022年12月,OpenAI在推出ChatGPT的免费预览版后收到了广泛的媒体报道。据OpenAI称,该预览版在前五天内收到了超过一百万的注册用户。根据路透社在2022年12月援引的匿名消息,OpenAI预计2023年的收入为2亿美元,2024年为10亿美元。截至2023年1月,它正在进行融资谈判,该公司的价值将达到290亿美元。 这就是OpenAI的故事,它是一个人工智能研究实验室,由营利性公司OpenAI LP及其母公司、非营利性公司OpenAI Inc.组成。 在该公司发布流行的ChatGPT之前,大多数人都不知道OpenAI。 ChatGPT的主要目的是模仿人类行为,与人进行自然对话。然而,这个聊天机器人能够根据它与不同用户的对话来学习和教导自己。这个人工智能具有对话能力,可以编写教程和代码,谱写音乐,并执行其他任务。ChatGPT的用例相当多样化,可以说是无穷无尽;用户已经证明了这一点。有些用例是创造性的(如写一首说唱歌曲),有些是恶意的(如生成恶意代码或命令),还有一些是面向商业的(如搜索引擎优化、内容营销、电子邮件营销、冷处理电子邮件和商业生产力)。 ChatGPT只是代表生成性预训练转化器,是建立在OpenAI的GPT-3系列大型语言模型之上的。聊天机器人是用监督和强化学习技术进行微调的。 GPT-3是ChatGPT的基础。ChatGPT只是一个利用GPT-3的项目,并增加了一个网络界面、内存和更多的用户友好功能。读完本指南后,你将能够建立自己的聊天机器人,可能比ChatGPT更好,因为你可以根据自己的具体需要进行定制。 其他使用GPT-3的项目有: GitHub Copilot(使用OpenAI Codex模型,是GPT-3的后裔,为生成代码进行了微调) Copy.ai7和Jasper.ai8(用于营销目的的内容生成) 德雷塞尔大学(检测阿尔茨海默病的早期症状) Algolia(增强其搜索引擎能力) 你肯定听说过GPT-4。GPT-4是GPT-3的继任者,也是由OpenAI创建的一个未发布的神经网络。 你可能已经看到了比较两个版本的GPT的图表,显示了GPT-3(1750亿)和GPT-4(100万亿)的参数数量。 当被问及这幅病毒性插图时,奥特曼称其为 “完全是胡说八道”。“GPT-4的谣言是一个荒谬的事情。我不知道这一切从何而来。人们在乞求失望,他们会失望的。炒作就像… 我们没有一个真正的AGI,这也算是对我们的期望吧”。

March 29, 2023 · 1 min · 猫猫

搭建自己的AI图片生成器

最近一段时间,使用 Stable Diffusion 等工具生成图片的资讯充斥着整个互联网,但是很多在线的 AI 图片生成工具,要么根本访问不了(需要科学上网),要么就是需要付费,而且还巨慢。作为一个常年混迹于互联网的技术流玩家,我觉得有必要在自己本机搭一下无限制的 AI 图片生成工具。 本地搭建这东西我觉得还是很有用的,对于我来说,写博客,公众号的一些配图,完全可以用这东西生成。还有最重要的,我是想用在独立游戏开发中,让我做的那些垃圾文字游戏,可以多一点图片,增加哪怕一点点美感和吸引力。 我们用的工具是 Stable Diffusion。由于我的机器是 Mac M1 芯片的,所以教程也就是在此配置上去搭建,其他平台类似。 1. 确认 Python 环境 首先确保自己机器上的 Python3 版本是 3.10 以上,使用命令 python3 --version 可以查看。如果还没有安装 Python3 则使用命令 brew install python3 来安装。如果版本比 3.10 低,则使用 brew upgrade python3 来升级到最新版本 2. 下载 Stable Diffusion 的 Web 工程 使用命令 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 来克隆 Stable Diffusion 的 web 工程,这个工程可以让我们在浏览器中使用 Stable Diffusion。 注意,这个过程可能会异常的慢,甚至可以失败,如果失败了,那就重新执行命令,或者采取一些科学的网络方式对其进行下速,反正相办法下载下来就行。 3. 下载模型文件,模型文件,可以理解为官方或其他人已经训练好的一些参数集合,有了这个,生成工具才知道怎么去生成一张图片。 先下载官方的基础 Model,这里使用的是 1.5 版本的,2.0 版本的不在此博客的讨论范围内,因为我也没用过。 点击这里下载 v1-5-pruned.ckpt 下载完成后,将这个文件放入 stable-diffusion-webui/models/Stable-diffusion 目录下...

March 27, 2023 · 2 min · 猫猫

角色扮演游戏设计艺术笔记

玩家需要感受到他们的交互效果,他们希望自己对游戏的经历起重要作用并通过他们交互对世界、故事或其他游戏元素产生某种程度上的辨认效果。 奖励 玩家在完成一次胜利,或特定的时候,给予一定的奖励,以此激励他们继续奋战。 保险性 确保玩家可以在游戏中通过某些途径获得物品,技巧等,以完成对于障碍的挑战。 确认 游戏规则不会确认,游戏的公平性保证 技巧 通过经历获得技巧。还需要明确地说明目标,让玩家知道为何而战。 铁杆(氪金)玩家需要 非常高级别的挑战 提供数小时扩展的游戏 某种程度的重玩结构 高度的细节和内存逻辑环境 使用字符、对象、符咒以及游戏设计的任何其他数字驱动等信息 普通玩家的需要 简单、简单、简单 短的学习曲线,游戏的界面和游戏的基本控制应该可以在短时间内掌握 非常快的升级速度以及频繁的奖励 以外观和感觉为中心的设计 清楚地提供游戏目标 短时间内应该能完成的游戏 破坏者的需要(特殊) 主要通过战斗解决游戏的目标 主要关注角色的战斗能力 探宝家式的玩家需要 频繁分布有价值的物品 具有找到便宜商品并且可以进行精明买卖的灵活的游戏经济系统 具有可以更多了解物品的组织属性和机制清单的系统 在模拟的经济系统中,有一些玩家会因为宝物的价值,或者艺术美而收集他们(收集癖好)。有一些物品不但非常有价值,而且可以帮助完成完成一些关键任务。玩家收集的许多材料的唯一的目标就是必须用它来做某些事情 旅行者的需要 可以探索的足够大的世界 很多交互细节 能够显示玩家到过和未到过的游戏地图 Q: 想办法处理冗长的背包物品列表,来找到需要的物品 随机性 随机性=冒险=危险=感情投入 游戏中的任何一部,都要让玩家明白有失败的可能性,任何一步都不能是100%确定的 例如攻击力,可以不用绝对攻击力,而使用范围。例如,攻击17~67 关于技能与角色特点(职业) 在网络游戏Ultima中,如果玩家一段时间没有使用某种技能的话,那么玩家的这种技能水平就会下降。使用这种方式,可以让玩家自己确定到底要保留哪些类型的技能。 还有一种方式,就是完全舍弃独立的技能系统,将所有的技能的载体放在物品(装备)上,例如一双靴子,有了这个,就拥有了垂直走路的能力。另一方面,因为这个能力的存在,所以这个靴子会占据较大的空间,或者让此物品很重,让玩家不能同时携带多于两个这类物品。 这种方案的有点是强制每个角色有不同的表现,并根据他们自己口袋装着的物品形成不同的角色。 经典RPG游戏中的重要因素 探险 让玩家处于一个令人难忘,错综复杂,但是具有内在致性的世界中。玩家在游戏中遇到的每个角色和每一件事情都应尽量真实,而还是为了迎合剧情发展。 故事 无论游戏中为玩家角色设计了什么大型剧情,我们一定要让玩家感受到游戏需要他们参与才能解决出现的那些问题。 战斗 令人兴奋、直觉、快节奏的战斗界面对游戏的成功是很重要的。 临时任务 拯救世界需要花费很多时间。要实现游戏的高度可重玩性,根据玩家角色的不同行为而提供不同的临时任务是一种好方法,这会让玩家们不断地重新开始。 搜寻财宝 玩家对于他们可以在盒子桶、板条箱,或者书箱里发现的东西非常好奇。任何看起来有可能包含报备的容器都会引起玩家的注意力,而正是我们游戏者决定他们过去会找到什么东西。我们可以为玩家提供武器、弹药、具有魔力的物品、珠宝,甚至是一件新衣服。不论提供什么,在玩家以后的游戏经历中,这些驼绒裤可以预约可以派上用场。要注意尽量避免创建无用的占是占据背包的物品。 资源管理 资源管理是RPG游戏的主要部分,通常会要求玩家管理一些琐碎的事务,比如保证角色具有足够吃的,保证足够的睡眠,保证武器处于战斗状态。由于某些物品的稀少或者难以获得,玩家还需要考虑使用情况,例如电池、子弹、血瓶等。RPG游戏通常也会让玩家自己去考虑如何花手头的钱,是去购买更好的装备,还是用来贿赂城堡卫兵。 解决问题 玩家在游戏过程中要面临多种类别的挑战,在战斗中随着遇到更厉害的怪物,玩家需要不断掌握新的策略。偶尔也会在黑暗的地下城和狂人住宅中遇到考验智力的难题和陷阱。 RPG游戏的持久力量在于超越了平凡的能力,可以将玩家带入兴奋和有趣的新设计,以家庭、城市、王国或者银河系的形式为玩家创造不同的机会。游戏中的每个人都有很重要的影响力。 游戏构思的可能选择 兴趣爱好 文化底蕴,探险 哲学、精神领域 历史事件 假定分析、推断 身边不断变化中的事情 公众会议、社会组织 自然规律 生命中出现的任何不寻常现象 军事训练准则 科技设备,中世纪武器,服装 玩家究竟是什么 一个玩家应当要做出选择 一个玩家应当要获得报酬 一个角色扮演游戏总是需要一些反对的力量去积极地对抗玩家。没有反对就没有斗争,而没有斗争你所拥有的就不是游戏了。 游戏规则 在一个RPG游戏中,你的任务就是去创建一套有着内在联系的规则,就像是棋子一样。你必须定义出玩家与他们的化身,与环境、目标,还有其他玩家及怪物相交互的所有方式。这当中有的规则是直接指出解决特定情况的方法,像是确定当当玩家试着踢到一扇门时将会发生什么情况。其他的规则都是普遍应用的一般性设计原则,它们可以帮助玩家了解游戏世界是怎样运行的。所有的这些想法必须平稳地结合在一起,从而创建出一个没有扣动、逻辑缜密的程序体,也就是人们所知道的规则体系。...

March 26, 2023 · 1 min · 猫猫

使用 OpenAI 的最佳实践

如何向GPT-3和Codex提供清晰有效的指令。 Prompt 是怎样工作的 由于指令跟随模型的训练方式或它们所接受的数据,有特定的提示格式可以很好地配合当前任务并可靠地发挥作用。以下是我们发现可靠有效的一些提示格式,但请随意尝试不同格式,以找到最适合您任务的格式。 经验法则和示例 注意:"{text input here}“是实际文本/上下文的占位符 1. 使用最新模型 为了获得最佳结果,我们通常建议使用最新、功能最强大的模型。截至2022年11月,生成文本的最佳选项是“text-davinci-003”模型,生成代码的最佳选项是“code-davinci-002”模型。 2. 在提示的开头放置说明,并使用###或”““分隔指令和上下文 低效方式 Summarize the text below as a bullet point list of the most important points. {text input here} 高效方式 Summarize the text below as a bullet point list of the most important points. Text: """ {text input here} """ 3. 请尽可能具体、描述性和详细地说明所需的上下文、结果、长度、格式、风格等。 请具体说明上下文、结果、长度、格式和风格等。 低效方式 Write a poem about OpenAI. 高效方式 Write a short inspiring poem about OpenAI, focusing on the recent DALL-E product launch (DALL-E is a text to image ML model) in the style of a {famous poet} 4....

March 23, 2023 · 3 min · 猫猫

Unity 内存管理的专业提示

优化是游戏开发中很重要的一部分,涉及的方面主要有 CPU,GPU,内存,网络等。 在这篇博客中,主要会写关于内存相关的优化,Unity 是如何管理内存的,以及怎样才能使游戏更高效地运行。 在深入到 Unity 之前,我们先来看一下内存是如何工作的。 操作系统会在物理内存的基础上,创建一个虚拟内存,用于程序运行。在这个抽象中,会有一些虚拟地址空间(VAS) 在内存优化上,主要考虑两部分,也就是栈(Stack)和堆(Heap)。在理解栈和堆之前,首先要理解在 Unity 中,数据的类型,可分为值类型,和引用类型。对于值类型的数值,会直接存储在栈上,并且是可以直接复制的。例如,int, float, bool, struct, Color Vector3 等。 而引用类型的数据,则是存储在堆上,但是,指向这个数据的指针,是存储在栈上的。 栈(Stack) 存储值类型 存储引用类型的指针 由 CPU 自动管理,无须程序员关心。在函数调用时,参数将自动申请内存放入栈中,当函数结束时,这些参数又会从栈取出,释放内存,这一切操作都是自动的。 栈比堆的速度快 栈的容量有限,如果超过上限,则会出现栈溢出。 栈的运行方式是 Last in first out。也就是后进先出,或者说先进后出。 堆(Heap) 可以存储引用类型和值类型的数据 由程序员手动管理 内存空间不一定是连续的 比栈速度慢 可以扩展空间大小 接下来,我们来理解什么是 “垃圾”,以及什么是 “垃圾回收”。 垃圾 存储在栈上的一个指向堆数据的指针结束时(释放时),堆上的数据没有用了,对于这样的对象,可以理解为 “垃圾”。 垃圾回收 为了解决垃圾内存的问题,.Net 有对应的垃圾回收系统。 在初始化一个新的进程时,语言运行时会为该进程保留一个连续的地址空间区域。这个保留的地址空间称为托管堆。托管堆维持指向堆中下一个对象的地址指针。 从托管堆中分配内存,比非托管堆中分配内存要快。 垃圾回收系统会创建一个包含从根可访问的所有对相的图。当一个对象不在这个图中,也就是无法从根节点访问时,垃圾回收系统会将这部分内存视为垃圾,并在合适的时机释放为其分配的内存。 Unity 的内存管理系统 Unity 的内存管理分为三部分。 托管内存 托管内存使用托管堆以及垃圾回收系统自动分配和释放内存,而提供这个功能的是 Mono 或 IL2CPP。在 Unity 中我们大部分时候使用的都是托管内存,所以 New 对象时,都不考虑释放,垃圾回收系统会帮我们处理掉。 C# 非托管内存 C#非托管内存层使你可以在编写C#代码的方便下访问本机内存层以微调存储器分配。 您可以在Unity Core API中使用Unity.CollectionsNamespace(包括NativeArray),以及Unity Collections软件包中的数据结构来访问C#非托管的内存。如果您使用Unity的 Job System 或 Brust,则必须使用C#非托管内存。...

November 1, 2022 · 1 min · 猫猫

异能觉醒,新游预约

4508年,因核泄露污染水域从而造成人类大灭绝,并造成了全球生物变异,但少数人类适应了污染,造成了细胞全面进化,使生命层次进化觉醒异能。 自从污染事件已来,整个世界变得异常的诡异,一些【奇奇怪怪】的东西,开始出现,什么鸡坤,什么篮球,杀伤力不强,但是让人异常头晕。在这个少数人的世界,开始一段令人哇塞的旅程。收集各种各样的物品,打造各种奇怪的装备,战斗各种让人费解的敌人。还可以养宠物,升级宠物,带着宠物去打怪…… 一旦你开始玩这个游戏,奇怪的事情,就开始发生了…… 是的,我又开发新游戏了,已经新建好文件夹,不过还没有开始写下第一行逻辑代码。 开发者的话 大家好,我是练习时长,好多年的,游戏开发者,因为技术太差,找不到工作,赚不到钱,只能白天送外卖,晚上开发游戏。我平时什么也不喜欢干,就喜欢打代码,做游戏。这个游戏,是我做的众多辣鸡,噢不,好玩的游戏之一。游戏正在开发中,预计下个月可以做完上线(如果我平时少摸点鱼的话),嗯,不管怎么样,点一下预约,点一下关注,你就是我爱的人~ 虽然游戏还没有做完,但依然可以加入QQ号瞎聊【异能觉醒 - 1群】:134032407 游戏假图 游戏预约 在 TapTap 上预约:https://www.taptap.com/app/242377 在 好游快曝 上预约:https://www.3839.com/a/147738.htm

October 17, 2022 · 1 min · 猫猫

通过作用域最小化来避免屎一样的代码

面条式代码,是软件工程中反面模式的一种,也就是源代码的控制流程复杂,混乱难以理解,见到来说,就是屎一样的代码。 最小化变量的作用域,是避免产生面条式代码的一种有效方式。 作用域最小化是一种构建代码的方式,操作起来很容易 声明具有最小作用域的变量 用具有最小作用域的数据来分配变量 事实上,是代码的结构,定一了变量的可见性。 背景 一个程序是由一些单一或者组合的语句构成,例如赋值操作、条件判断、循环等。 通常来说,如果有两个代码块 A 和 B 如果 A 包含 B,那么 A 就是 B 的外部代码块 如果 B 被 A 所包含,那么 B 就是 A 的内部代码块 代码的缩进级别,是由嵌套级别数量决定的,直接的内部块会比其外部块多一个级别。 我们假设定义全局作用域,也就是没有外部块的代码,缩进级别为0,而全局变量,就是那些在全局范围内定义的变量。 变量可见规则 一个变量的可见性,由下面规则决定 从该变量的声明语句开始 结束于变量声明块的末尾 并且在开始与结束中间的嵌套块中也是可见的 反过来说,如果一个变量是不可见的,那么 在变量声明前 在变量声明块结束后 建议 R1. 尽量不要使用全局变量 R2. 声明单一用途的变量 R3. 在接近变量用途的地方声明变量 R4. 保持小的代码块 R5. 使用靠近其声明的变量 R6. 使用不超过2层的嵌套 R1. 尽量不要使用全局变量 全局变量会使代码变得难以阅读和理解,难以维护和测试。 全局变量的使用,增加了出现问题的概率,并且不容易被发现。 程序中可能错误地分配变量的语句越少越好。 总之,全局变量的使用往往代表着技术债务,必须尽快重构以避免后期的不可维护。 R2. 声明单一用途的变量 为单一的特定目的声明和使用变量,以便将其作用域限制作到最小。 一个变量的目的性越多,意味着可访问此变量的代码块越多。 而变量可见的语句数量越多,可能错误地赋值变量的语句就越多。 可能错误地赋值变量的语句越多,那么发现和修复潜在错误就越困难。 R3. 在接近变量用途的地方声明变量 尽可能地在靠近将使用这些变量的语句和代码块的地方声明变量。 与 R2 严格相关。...

October 4, 2022 · 1 min · 猫猫