解决方案:如何从零开始用 C++ 开发一款游戏引擎?
优采云 发布时间: 2022-11-20 07:15解决方案:如何从零开始用 C++ 开发一款游戏引擎?
原文链接:
游戏开发一直是学生学习高级计算机科学的巨大动力。有些人可能认为游戏是为儿童准备的,但对于标准的计算机科学课程来说,游戏开发实际上是少数几个可以使用所有知识的领域之一。
游戏开发涉及标准计算机科学课程中的大量内容
根据游戏的性质,您可能还需要深入研究更具体的专业,例如分布式系统或人机交互。游戏开发是一项严肃的工作,也是学习计算机科学概念的强大工具。本文详细介绍了使用 C++ 创建简单游戏引擎所需的一些基本构建块,解释了游戏引擎
所需的主要构建块,并就如何从头开始编写游戏引擎提供了一些个人建议。
但是,本文不是编程教程,因此不会涉及太多技术细节或解释所有这些元素如何通过代码粘合在一起。如果您正在寻找有关如何编写C++游戏引擎的综合教程,请首先使用 C++ 和 Lua 创建 2D 游戏引擎。
1. 什么是游戏引擎?
简而言之,游戏引擎是一组优化视频游戏开发的软件工具。这些引擎可以是小而简约的,就像提供游戏循环和一些渲染功能一样简单;当然,它也可以是大而全面的,类似于IDE应用程序,开发人员可以使用脚本,调试,自定义关卡逻辑,人工智能,设计,发布,协作,并最终从头到尾构建游戏,而无需离开引擎。游戏
引擎和游戏框架通常向用户公开一组 API。这些 API 允许程序员调用引擎函数并执行像黑匣子一样艰巨的任务。
为了真正了解这些API的工作原理,让我们结合应用笔记进行更具体的介绍。例如,游戏引擎 API 公开一个名为“IsColliding()”的函数的情况并不少见,开发人员可以调用该函数来检查两个游戏对象是否发生冲突。程序员不需要知道函数是如何实现的,也不需要正确确定两个形状是否重叠所需的算法。在我们的例子中,IsLabeling函数只是一个黑盒,根据这些对象是否相互碰撞,它正确返回true或false。下面是大多数游戏引擎向用户公开的功能示例。
大多数引擎抽象碰撞检测,并简单地将其公开为真/假函数
除了编程 API 之外,游戏引擎的另一个重要职责是硬件抽象。例如,3D 引擎通常基于专用图形 API 构建,例如 OpenGL、Vulkan 或 Direct3D。这些 API 为图形处理单元 (GPU) 提供软件抽象。
说到硬件抽象,还有低级库(如DirectX,OpenAL和SDL),它们提供许多其他硬件元素的抽象以及多平台访问。这些库帮助我们访问和处理键盘事件、鼠标移动、网络连接甚至音频等功能。
二、游戏引擎的兴起
在游戏行业的早期,游戏是使用自定义渲染引擎构建的。开发该代码是为了最大限度地提高较慢机器的某些系统性能。每个 CPU 周期都很重要,因此开发人员负担不起多个方案的代码重用或泛型函数。
随着游戏和开发团队的规模和复杂性的增长,大多数工作室最终会在开发中的多个游戏中重用某些功能和子程序。工作室开发的内部引擎基本上是用于低级任务的内部文件和库的集合。这些功能允许开发团队的其他成员专注于高级细节,例如游戏操作、地图创建和关卡自定义。
一些流行的经典引擎包括id-Tech,Build和AGRI。创建这些引擎是为了帮助开发特定游戏,它们允许团队的其他成员快速开发新关卡、添加自定义资产和动态自定义地图。这些自定义引擎还用于修改或创建其原创
游戏的扩展包。id
Software(美国德克萨斯州的一家游戏软件公司)开发了id Tech技术。 id Tech技术实际上是不同引擎的集合,每个引擎都与不同的游戏相关联。因此,开发人员通常将id Tech 0描述为“Wolfenstein 3D引擎”,id Tech 1描述为“Doom引擎”,id Tech 2描述为“Quake引擎”,依此类推。
Build 是 90 年代游戏引擎历史上的另一个例子。它是由Ken Silverman创建的,旨在帮助第一人称射击游戏的定制。与id Tech类似,Build随着时间的推移而发展,它的不同版本帮助程序员开发Duke Nukem 3D,Shadow Warrior和Blood等游戏。这三款可以说是使用Build引擎开发的最受欢迎的游戏的代表,通常被称为“三巨头”。
Ken Silverman 的 Build 引擎正在编辑 2D 关卡
90年代游戏引擎的另一个例子是Manic Mansion(SCUMM)的脚本创建实用程序。SCUMM是由Lucas Arts开发的引擎,是许多经典点击游戏的基础,这些游戏用于Monkey Island和Full Throttle。
全速游戏的对话和操作使用SCUMM脚本语言进行管理
随着机器的发展及其能力的不断提高,游戏引擎也在不断增强。现代引擎配备了功能丰富的工具,需要快速的处理器速度、惊人的内存量和专用显卡。
借助备用电源,现代游戏引擎可以交换机器循环以获得更多的抽象。这种权衡意味着我们可以将现代游戏引擎视为一种通用工具,以更低的成本和较短的开发时间创建复杂的游戏。
为什么要制作游戏引擎?
这不是一个陌生的问题,不同的游戏程序员有不同的看法。答案取决于正在开发的游戏的性质、业务需求和其他需要考虑的因素。
开发人员可以使用许多免费、强大且专业的业务引擎来创建和部署自己的游戏。那么,有这么多游戏引擎可供选择,为什么有人要从头开始制作游戏引擎呢?
我曾经写过一篇博客文章“你是写游戏引擎还是使用现成的游戏引擎?()来解释程序员从头开始制作游戏引擎的一些原因。在我看来,主要原因包括:
学习机会:深入了解游戏引擎的工作原理可以使您成为一名优秀的开发人员。工作流程控制
:您可以更好地控制游戏的特殊方面,并调整解决方案以满足工作流程的需求。定制
:能够根据独特的游戏需求定制解决方案。
极简主义:较小的代码库可以减少较大游戏引擎的开销。
创新:您可能需要实现一些其他引擎不支持的全新或非正统硬件。
4. 如何制作游戏引擎游戏引擎
的一些组件将在下面继续,并指导读者自己编写游戏引擎。
1. 选择编程语言
开发核心引擎代码的编程语言是首选。原创
汇编语言,C,C++,甚至高级语言,如C#,Java,Lua和JavaScript都被用来开发引擎。
编写游戏引擎的最流行的语言之一是C++。C++编程语言将速度与使用面向对象编程 (OOP) 和其他编程范例的能力相结合,以帮助开发人员组织和设计大型软件项目。
因为在我们开发游戏时,性能往往非常重要,而C++具有编译语言的优势。使用编译语言意味着最终的可执行文件将在目标计算机的处理器上本机运行。还有许多专用的C++库和开发套件可用于大多数现代游戏机,例如PlayStation或XBox。
开发人员可以使用微软提供的C++库访问XBox控制器
在性能方面,我个人不建议使用虚拟机、字节码或任何其他中间层语言。除了C++之外,一些适合编写核心游戏引擎代码的替代方法包括 Rust、Odin和 Zig 等语言。
本文将使用C++编程语言构建一个简单的游戏引擎。
2. 硬件访问
在MS-DOS等较旧的操作系统中,我们通常可以直接操作内存地址并访问映射到不同硬件组件的特殊位置。例如,如果我想“绘制”具有某种颜色的像素,我所要做的就是加载一个特殊的内存地址,其中数字表示 VGA 调色板的正确颜色,然后显示驱动程序将该更改转换为物理像素并将其转换为 CRT 监视器。
随着操作系统的发展,他们开始负责保护硬件免受程序员的侵害。现代操作系统不允许修改代码以提供操作系统允许的进程地址以外的内存位置。
例如,如果您使用的是Windows,macOS,Linux或BSD,则需要向操作系统请求正确的权限,以便在屏幕上绘制像素或与任何其他硬件组件通信。即使是简单的任务(例如在操作系统桌面上打开窗口)也必须通过操作系统 API 执行。
因此,运行进程、打开窗口、在屏幕上呈现图形、在窗口中绘制像素,甚至从键盘读取输入事件都是特定于操作系统的任务。
SDL(简单直接媒体层)是一个非常流行的库,有助于实现多平台硬件抽象。在游戏开发课上,使用 SDL,我不必为 Windows 操作系统、macOS 和使用 Linux 的学生创建三个不同版本的代码。SDL 不仅是不同操作系统之间的桥梁,也是不同 CPU 架构(Intel、ARM、Apple M1 等)之间的桥梁。SDL 库抽象底层硬件访问,并“转换”我们的代码,以便在这些不同的平台上正常工作。
" />
下面是使用 SDL 在操作系统上打开窗口的一小段代码。为简单起见,代码中没有添加任何错误处理部分,但以下代码适用于Windows,macOS,Linux,BSD甚至Raspberry Pi。
SDL 只是游戏库的一个示例,我们可以使用它来实现这种多平台硬件访问。SDL 是 2D 游戏和将现有代码移植到不同平台和控制台的热门选项之一。多平台库的另一个流行选项是GLFW,它主要用于3D游戏和3D引擎。GLFW库与OpenGL和Vulkan等加速的3D API通信良好。
3. 游戏主循环
此时,一旦解决了操作系统解决方案,我们需要创建一个控制整个游戏的主循环。
简而言之,我们通常希望我们的游戏以每秒 60 帧的速度运行。根据游戏的不同,帧速率可能会有所不同,但为了更清楚,用胶片拍摄的电影通常以每秒 24 帧的速度运行(每秒有 24 张图像从您的眼睛旁边闪过)。
比赛期间,游戏循环连续运行,
在每个循环中,我们的引擎需要运行一些重要的任务。传统的游戏循环必须确保:
处理输入事件而不会阻塞
更新当前帧的所有游戏对象及其属性
在屏幕上呈现所有游戏对象和其他重要信息
然而,一个原创
的C++循环对我们来说是不够的。游戏循环必须与现实世界的时间有某种关系。毕竟,游戏中的敌人应该在任何机器上以相同的速度移动,无论这些机器的 CPU 时钟速度如何。
控制此帧速率并将其设置为固定数量的FPS实际上是一件非常有趣的事情。它通常需要我们跟踪帧之间的时差并进行一些合理的计算,以确保我们的游戏以至少 30 FPS 的帧速率流畅运行。
4. 输入事件处理
很难想象一个游戏不会从用户那里读取某种输入事件。所有这些输入事件都可能来自键盘、鼠标、游戏手柄或虚拟现实设备。因此,我们必须在游戏循环中处理不同的输入事件。
要处理用户输入,我们必须请求访问硬件事件,这必须通过操作系统 API 执行。我们可以使用一些知名的多平台硬件抽象库(SDL、GLFW、SFML 等)来处理用户输入。
例如,如果我们使用 SDL,我们可以实现轮询事件,然后我们只需几行代码即可处理各种输入事件。
同样,如果我们使用 SDL 等跨平台库来处理输入,则不必过多担心特定于操作系统的实现。无论我们的目标平台是什么,C++代码都应该是相同的。
此时,我们有一个有效的游戏循环和一种处理用户输入的方法。现在是时候开始考虑在内存中组织游戏对象了。
5. 表示内存中的游戏对象在设计游戏
引擎时,我们需要设计数据结构来存储和访问游戏对象。
程序员在设计游戏引擎时使用各种技术。某些引擎可能使用简单的面向对象方法来类和继承,而其他引擎可能会将其对象组织到实体和组件中。
如果您想了解有关算法和数据结构的更多信息,建议尝试实现这些数据结构。如果您使用的是C++,一种选择是使用 STL(标准模板库)并利用它附带的许多数据结构(向量、列表、队列、堆栈、映射、集合等)。C++STL 严重依赖模板,因此这是一个很好的机会,可以练习使用模板,同时在实际项目中查看模板的实际效果。
阅读一些游戏引擎体系结构后,您会发现游戏使用的最流行的设计模式之一是基于实体和组件。实体组件设计将游戏场景中的对象组织成实体(在Unity中称为“游戏对象”,在虚幻中称为“角色”)和组件(我们可以添加或附加到实体的数据)。
若要了解实体和组件如何协同工作,请考虑一个简单的游戏方案。在这种情况下,实体将成为我们的主要玩家,包括敌人、地板、射弹等,而组件将是我们“附加”到实体的重要数据块,例如位置、速度、刚体碰撞体等。
一种流行的游戏引擎设计模式是将游戏元素组织成实体和组件
我们可以选择一些附加到实体的组件,例如:
位置组件:跟踪世界坐标系(或 3D 中的 x-y-z)中实体的 x-y 位置坐标。
速度分量:跟踪实体在 x-y 轴(或 3D 中的 x-y-z)上移动的速度。
精灵组件:通常存储我们应该为特定实体渲染的 PNG 图像。*敏*感*词*
组件:跟踪实体的*敏*感*词*速度以及*敏*感*词*帧如何随时间变化。
碰撞体组件:这通常与刚体的物理特性有关,并定义实体的碰撞形状(边界框、边界圆、网格碰撞体等)。运行状况
组件:存储实体的当前运行状况值。这通常只是一个数字,或者在某些情况下是一个百分比值(例如,运行状况进度条)。脚本组件
:有时我们可以将脚本组件附加到实体,它可能是我们的引擎必须在后台解释和执行的外部脚本文件(Lua、Python 等)。
上面介绍的是表示游戏对象和重要游戏数据的一种非常流行的方法。现在我们有了实体,我们可以将这些不同的组件“插入”到实体中。
市场上有许多书籍和文章探讨了如何实现实体组件的设计以及在此实现中应使用哪种数据结构。我们使用的数据结构以及访问它们的方式直接影响我们的游戏性能。开发人员经常提到面向数据的设计、实体组件系统 (ECS)、数据局部性等想法,这些想法与我们的游戏数据存储在内存中的存储方式以及如何有效访问密切相关。
在内存中表示和访问游戏对象可能是一个复杂的主题。根据我的经验,您可以编写一个简单的实体组件来手动实现它,也可以简单地使用现有的第三方 ECS 库(实体-组件-系统,“实体-组件-系统”的缩写。这种模式遵循组合重于继承的原则,其中游戏中的每个基本单元都是一个实体,每个实体又由一个或多个组件组成,每个组件仅收录
代表其特征的数据)。
市场上有一些流行的现成 ECS 库,我们可以将其收录
在我们的C++项目中,并开始创建实体和附加组件,而不必担心它们是如何在幕后实现的。C++ ECS 库的一些示例是 EnTT 和 Flecs。
我个人建议认真编程的学生至少尝试一次手动实现非常简单的 ECS。我的理由是,即使您的实现并不完美,从头开始编写 ECS 系统也会迫使您考虑底层数据结构和相应的性能。
完成自定义临时 ECS 实现后,我建议您只使用一些流行的第三方 ECS 库(EnTT、Flecs 等),因为这些是业界开发和测试多年的专用游戏开发库,它们可能比我们自己从头开始编写的要好得多。
简而言之,仅凭个人实力很难从零开始实现专业的 ECS。选择经过良好测试的第三方 ECS 库并将其添加到您的游戏引擎代码中以完成您的游戏。
6. 渲染
游戏引擎的复杂性正在缓慢增加。现在我们已经讨论了在内存中存储和访问游戏对象的方法,让我们讨论如何在屏幕上渲染对象。
第一步是考虑使用引擎创建的游戏的性质。我们创建的游戏引擎是否仅用于开发 2D 游戏?如果是这样,我们需要考虑渲染精灵、纹理、管理层,以及可能的显卡加速。2D 游戏通常比 3D 游戏简单,因为 2D 数学比 3D 数学简单得多。
如果目标是开发 2D 引擎,则可以使用 SDL 来帮助进行多平台渲染。SDL 抽象化了加速的 GPU 硬件,以便在我们的游戏窗口中解码和显示 PNG 图像、绘制精灵和渲染纹理。
如果目标是开发 3D 引擎,那么您需要定义如何将一些额外的 3D 信息(顶点、纹理、着色器等)发送到 GPU。如果要对图形硬件使用软件抽象,最流行的选项是OpenGL,Direct3D,Vulkan和Metal。当然,决定使用哪个 API 可能取决于目标平台。例如,Direct3D为微软平台的应用程序提供支持,而Metal仅适用于Apple的产品。
3D 应用程序通过图形管道处理 3D 数据。管道规定引擎必须如何将图形信息(顶点、纹理坐标、法线等)发送到 GPU。图形 API 和管道还将规定我们应该如何编写可编程着色器来转换和修改 3D 场景的顶点和像素。
可编程着色器指示 GPU 应如何处理和显示 3D 对象每个
顶点和每个像素(片段)可以有不同的脚本,分别用于控制反射、平滑度、颜色、透明度等。
" />
对于3D对象和顶点,最好将读取和解码不同网格格式的任务委托给一些第三方库。大多数第三方 3D 引擎应该了解许多流行的 3D 模型格式,例如某些文件格式,例如 OBJ、Collada、FBX 和 DAE。我的建议是首选。OBJ 文件格式,因为有许多经过良好测试和支持的库可以处理 C++ 中的 OBJ 加载。在这方面,TinyOBJLoader 和 AssImp 是许多游戏引擎的不错选择。
7. 物理引擎
当我们向引擎添加实体时,我们可能还希望它们在场景中移动、旋转和弹跳。
游戏引擎的这个子系统称为物理模拟。这可以手动创建,也可以从现有的现成物理引擎导入。
在这里,我们还需要考虑要模拟的物理场类型。 2D 物理通常比 3D 简单,但物理模拟的基础部分与 2D 和 3D 引擎非常相似。
如果您只想在项目中收录
一个物理库,有几个不错的物理引擎可供选择。对于2D物理引擎,我建议研究Box2D和花栗鼠2D。对于专业和稳定的 3D 物理模拟引擎,该品牌非常适合收录
PhysX 和 Bullet 等库。如果物理稳定性和开发速度对您的项目至关重要,那么使用第三方物理引擎始终是一个不错的选择。
BOX2D是一个非常流行的物理库选项,可以与游戏引擎一起使用
您不需要编写完美的物理模拟,但要确保对象正确加速,并且可以将不同类型的力施加到游戏对象上。一旦你实现了基本的物体移动效果,你还可以继续考虑实现一些简单的冲突检测和冲突解决。
有关 2D 刚体物理,请参阅 Box2D 源代码和 Erin Catto 的介绍。如果您正在寻找游戏物理方面的综合课程,请参阅从头开始编写 2D 游戏物理。
如果你想学习3D物理和物理模拟实现,你可以参考David Eberly的《游戏物理》一书。
8. 用户界面设计
当我们想到像Unity或Unreal这样的现代游戏引擎时,我们会想到复杂的用户界面,其中收录
许多面板,滑块,拖放选项和其他漂亮的UI元素,可以帮助用户自定义游戏场景。UI 允许开发人员添加和删除实体、动态更改组件值以及轻松修改游戏变量。
为清楚起见,我们谈论的是开发工具的游戏引擎 UI,而不是我们向游戏用户显示的用户界面(例如对话框屏幕和菜单)。游戏引擎
不一定需要嵌入编辑器,但由于游戏引擎通常用于提高生产力,因此用户友好的界面将帮助您和您的团队快速自定义其他方面,例如游戏场景的级别。
对于初学者来说,从头开始开发 UI 框架可能是游戏引擎制作中最烦人的任务之一。您必须创建按钮、面板、对话框、滑块、单选按钮、管理颜色,并且需要正确处理 UI 事件并始终维护其状态。向引擎添加 UI 工具会增加应用程序的复杂性,并给源代码管理带来很多麻烦。
如果您的目标是为引擎创建UI工具,那么我建议您使用现有的第三方UI库,例如Dear ImGui,Qt和Nuklear。
Imgui 是一个功能强大的 UI 库,被许多游戏引擎用作编辑工具
Dear ImGui 是不错的选择之一,它允许我们快速设置引擎工具的用户界面。ImGui 项目使用了一种称为“即时模式 UI”的设计模式,由于利用加速的 GPU 渲染与 3D 应用程序具有良好的通信,因此在游戏引擎中得到了广泛的应用。
总之,如果你想在你的游戏引擎中添加UI工具,推荐亲爱的ImGui。
9. 脚本开发
随着我们的游戏引擎不断发展,一个常见的选择是使用简单的脚本语言实现游戏关卡自定义。
这个想法很简单:我们在原生C++应用程序中嵌入了一种脚本语言,非专业程序员可以使用该语言来编写实体行为、AI 逻辑、*敏*感*词*和游戏的其他重要方面的脚本。
一些流行的游戏脚本语言是Lua,Wren,C#,Python和JavaScript。所有这些语言的运行级别都比我们的原生C++代码高得多。无论谁使用脚本语言来编写游戏行为脚本,都不需要担心内存管理或核心引擎如何工作的其他低级细节。他们所要做的就是编写游戏中相应关卡的脚本,我们的引擎知道如何解释脚本并在幕后执行艰巨的任务。
Lua 是一种快速、小巧的脚本语言,可轻松与 C/C++ 项目集成
我最喜欢的脚本语言是Lua。Lua 体积小,速度快,并且非常容易与 C 和 C++ 本机代码集成。另外,如果我使用 Lua 和“现代”C++,我喜欢使用一个名为 Sol () 的包装库。Sol 库帮助人们快速熟悉和使用 Lua,并提供了一些辅助函数来改进传统的 Lua C-API。
如果我们开发一个支持脚本的游戏引擎,那么我们可以开始讨论游戏引擎中的一些更高级的主题。脚本可以帮助定义 AI 逻辑、自定义*敏*感*词*帧和动作以及其他不需要由本机C++代码控制但可以通过外部脚本轻松管理的游戏行为。
10. 音频
接下来,需要为游戏引擎添加的另一个支持元素是音频。
如果我们想读写音频数据并发出声音,我们需要通过操作系统访问音频设备。同样,由于人们通常不想编写特定于操作系统的代码,因此我建议使用多平台库来抽象音频硬件访问。
SDL 等多平台库具有扩展功能,可帮助引擎处理音乐和音效等内容。
但是,我强烈建议您仅在确定引擎的其余部分正常工作后才考虑处理音频。控制声音文件的发音很容易实现,但是如果我们过早地开始处理音频同步,即将音频与*敏*感*词*、事件和其他游戏元素结合起来考虑,事情往往会变得混乱。
如果您真的是自己编写代码,那么多线程的复杂性会使音频处理变得棘手。但是,如果您的目标是编写一个简单的游戏引擎,那么我可能更喜欢使用专用库来处理这部分功能。
例如,您可以考虑将出色的音频库和工具(如 SDL_Mixer、SoLoud 和 FMOD)集成到您自己的游戏引擎中。
小型战斗竞技场
游戏使用FMOD声音库来实现多普勒和压缩等音频效果
11. 人工智能
最后一个子系统是人工智能。我们可以通过脚本实现人工智能。这意味着我们可以将AI逻辑委托给关卡设计师来编写脚本。另一种选择是在游戏引擎内核的本机代码中嵌入适当的 AI 系统。
在游戏中,人工智能用于对游戏对象产生响应、自适应或类似智能的行为。大多数AI逻辑被添加到非玩家角色(NPC,敌人)中,以模拟类似人类的智能。
敌人是人工智能在游戏中应用的一个流行例子。当敌人在地图上追逐物体时,游戏引擎可以通过路径搜索算法或对人类行为的有趣模仿来创建抽象效果。
伊恩·米林顿(Ian Millington)的《游戏人工智能》(Game Artificial Intelligence)是一本关于博弈AI理论和实现技术的综合书籍,值得一读。
五、不要贪图更多更快
其中之一
开发游戏引擎最困难的部分是大多数开发人员没有设定明确的界限,即感觉他们不在“终点线”。换句话说,程序员会启动一个游戏引擎项目,渲染对象,添加实体,添加组件,然后突然发现一切都不好。因此,如果他们没有定义某种边界,就很容易不断添加越来越多的功能而忽略大局。如果发生这种情况,游戏引擎很有可能永远不会看到曙光。
除了缺乏边界之外,当我们看到代码以闪电般的速度增长时,很容易让自己不知所措。游戏引擎项目的复杂性可能会迅速增长,您的C++项目可能在几周内有多个依赖项,需要复杂的构建系统,并且随着引擎中添加更*敏*感*词*,代码的整体可读性将继续下降。
所以我的首要建议是在编写实际游戏时始终坚持编写自己的游戏引擎。在开始和完成游戏的第一次迭代时,请牢记一个真正的游戏。这将帮助您设置限制并为您需要完成的工作指出清晰的路径。尽最大努力坚持下去,而不是反复改变需求。
六、稳扎稳打,着力立足基础
大多数学生在课程开始时会感到兴奋,但焦虑会随着时间的推移而开始。如果我们从头开始创建一个游戏引擎,尤其是在使用像C++这样的复杂语言时,很容易失去不知所措的动力。
因此,学会分阶段享受某些小胜利。例如,了解如何在屏幕上成功显示 PNG 纹理、成功发现两个对象之间的碰撞等。关注和理解基础知识一直非常重要。
对于热爱编程的朋友,无论道路多么艰难,你都必须坚持下去!如果你想更好的提高你的编程核心能力(内功),不妨现在就开始!
解决方案:Google网站管理员工具是什么?
什么是谷歌网站站长工具?
地址:
为了更好地与站长沟通,谷歌推出了这项服务,允许站长在Goole中查看网站的索引和排名。可以说,谷歌站长工具是站长与谷歌对话的平台,无论是了解SEO还是从未听说过SEO这个词的网站站长,都可以从这个最基本的SEO工具中获得帮助。权威、免费、全面,这些特点使谷歌网站站长工具从一开始就受到网站站长的欢迎。
GooGle 网站站长工具是做什么的?
" />
从这里获取官方谷歌介绍:
谷歌站长工具注册和登录:
选择网站站长
来自Google网站管理员中心的工具,如果您已经拥有Goolge帐户,则可以使用Gmail,Adsense,iGoogle或其他产品帐户直接登录。如果您没有,只需注册一个。
有关使用 Google 网站站长工具的建议:
" />
1.如果验证总是失败,可能的原因是机器人.txt页面或404页面设置不正确。有时有必要在其他时间进行验证。
2. 如果您需要
删除网址,需要小心。不要删除整个网站。
3.如果你发现很多网址错误,应该是你的网站需要改进,而不是删除错误的网址。
4. 设置“首选 URL”并在 .haccess 文件中执行 301 重定向。(仅适用于 Apache 服务器)。