Lecture 03 How to build a Game World

news/2024/11/16 1:39:15/文章来源:https://www.cnblogs.com/Tellulu/p/18391252

Lecture 03 How to build a Game World

Everything is a Game Object (GO)

  • 面向对象的方式

    有些GO之间并没有清晰的继承关系

    • Unreal中的UObject、Unity中的Object并不是这里讲的GameObject概念,而是更类似如C#中的Object,用于确定任何对象的生命周期需要的句柄
    • Unreal中的GameObject概念对应的应该是Actor,Unity中是GameObject
  • Component Base

    • 组件化,如果涉及到多重继承就应该用组合

      • Transform

      • Model

      • Motor

      • Animation

      • Physics

      • AI

      • ...

    • 所有组件都有一个tick函数

    • 组件模式的缺点

      • 如果用最基础的实现时,效率不如class,所以ECS中同样的组件同样的数据放在一起,用方法快速处理很重要
      • 组件之间也需要一套通讯机制,一个组件并不知道同一个GameObject还有多少组件,所以当一个组件要访问另一个组件时,需要不停查询有没有挂载这个组件,高频调用时很消耗性能
  • 总结

    • 任何物体都是GameObject
    • GameObject应该以component-based的方式描述

How to Make the World Alive?

将GameObject中的component都依次tick一遍

Component-based Tick

现代游戏引擎中不是按GameObject进行tick的,而是按Component进行tick

  • Object-based tick、

    • 简单并且符合直觉
    • 容易debug
  • Component-based tick

    • 并行运算
    • 减少缓存未命中
      • 将Component的数据集中在一起
  • tick时序

    • 父节点先tick,子节点后tick

    • 这样做的话component-based tick会变得复杂

      因为这些tick是并行执行的,而并行执行的时序非常重要 ,时序不一样会带来逻辑上的混乱

    • 于是引入一个消息中心,GameObject的Event先发给中心,由中心按照设定顺序转发给GameObject

    • Component Dependencies

      • Motor tick Animation,Animation 有可能又tick了Physics,又影响了Motor

      • 物理和动画互相影响时的处理

        • 当人受击时

          1. 切换到布娃娃系统(看着像没有骨骼),看着物理真实,但是觉得假

          2. 受击动画,这部分基于深度学习有更好的结果

          现在主流的做法是插值,受击开始时切动画的表现,越往后,动画的位移作为物理的初输出,交给物理去模拟,这样不会看着假,并且结果也很随机,符合物理真实

    • 收到Event是当场处理还是下一帧再处理?对游戏逻辑非常重要

  • 如果一个tick过长

    • 每个tick将步长传进去,这样就能补偿起来

    • 直接跳过下一个tick,tick两帧(比较危险)

    • deferred process

      比如发生一个爆炸,带来了大量需要处理的内容,这时候可以用五六帧的时间去处理,而五帧也只有0.2s左右,不太影响视觉

  • tick时,渲染线程和逻辑线程怎么同步

    • 一般二者在不同线程进行
    • 逻辑线程会比渲染线程早一些

GameObject之间的交互

  • Hardcore
    • 比如坦克开炮,生成一个GameObject炮弹,炮弹爆炸时查询周边对象
    • 当游戏世界复杂起来时,Hardcore就不work了
  • Events
    • Message sending and handling
    • Decoupling event sending and handling
    • 本来需要知道所有GameObject的类型,现在只需要发出一个Event给对应的GameObject,让它自己来处理即可,这里不同GameObject就解耦合了
    • 开发引擎时要制作可拓展的消息机制
    • 如果GameObject之间直接通过Event通信会产生很多逻辑上的混乱性
      • 比如A向B发出event,B同时也向A发出Event,那么结果可能与处理顺序(不确定)有关,而我们希望结果是可控的
    • 难调试
      • 打Log
      • 可视化方法(游戏中的Debug模式)

Scene Management

  • GameObject

    • 有一个unique ID
    • 有一个position
  • Scene Management

    • 最简单的管理就是不划分

    • 划分

      • 划格子

        • 小场景可用
        • 现代游戏中GO分布不均匀
      • Hierarchy 层级结构

        • 2D四叉树

        • 3D八叉树

        • BVH

          每个物体有一个boundingbox,将boundingbox不断合成成大的boundingbox

      • 动态物体的处理

        • 最简单的做法,每一帧都生成一遍hierarchy,效率低
        • 一般选择更新起来比较轻量的数据结构
          • 比如BVH,如果用球来表示boundingbox,BVH的合并只是让球的半径变长,消耗小
          • 引擎一般支持两三种以上经典空间划分的算法,让游戏产品自己去选择

总结

  • 任何东西都是一个Object
  • GameObject应该以component-based形式描述
  • GameObject的状态以tick循环的形式更新
  • GameObject通过event机制交互
  • GameObject过一些有效率的策略来做场景管理(层级结构)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/790536.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lecture 13 Real-time Ray Tracing 2

Lecture 13 Real-Time Ray Tracing 2 Implementing a spatial filter 这里想做的是低通滤波移除高频信号会不会丢失高频中的信息? 噪声不一定只在高频中集中在频域 这些filtering可以应用在PCSS、SSR上的降噪用$$\widetilde C$$表示有noise的图像 \[K$$表示滤波核kernel,比如…

Lecture 10 11 Real-time Physically-based Materials (surface model)

Lecture 10 Real-time Physically-based Materials (surface models and cont.) PBR and PBR MaterialsPhysically-Based Rendering (PBR) 基于物理的渲染渲染内的任何事都应该是PBR的材质、光照、相机、光线传播等等不限于材质,但常常指材质PBR materials in RTR实时渲染中材…

[笔记]Tarjan

Tarjan求强连通分量 定义 DFS树相关 我们对一个有向联通图进行DFS遍历,会得到一棵DFS树。 DFS树的形态是根据我们DFS的顺序来决定的,因此对一个有向联通图来说,它的DFS树可能有多个。我们把这棵树的边称作树边。 其他边我们分为\(3\)类:前向边:从\(u\)到它dfs树上的祖先的…

Lecture 12 Real-time Ray Tracing

Lecture 12 Real-Time Ray Tracing Basic ideasample per pixel PPS 1 SPP path tracing = $$\downarrow$$camera出发打到求出第一个交点(像素上看到的点),这一步是primary ray(工业上实际用rasterization)工业上这一步有一个技巧 将这一步改为光栅化 因为每个像素都要从c…

gcc/g++编译ZR

编译工具链我们写程序的时候用的都是集成开发环境 (IDE: Integrated Development Environment),集成开发环境可以极大地方便我们程序员编写程序,但是配置起来也相对麻烦。在 Linux 环境下,我们用的是编译工具链,又叫软件开发工具包(SDK:Software Development Kit)。Linux 环…

一种优雅的方式整合限流、幂等、防盗刷

大家在工作中肯定遇到过接口被人狂刷的经历,就算没有经历过,在接口开发的过程中,我们也需要对那些容易被刷的接口或者和会消耗公司金钱相关的接口增加防盗刷功能。例如,发送短信接口以及发送邮件等接口,我看了国内很多产品的短信登录接口,基本上都是做了防盗刷,如果不做…

Lecture 06 Real-time Environment Mapping (Precomputed Radiance Transfer)

Lecture 06 Real-time Environment Mapping (Precomputed Radiance Transfer) Shadow from environment lighting通常情况下要实时渲染非常困难 在不同观察方向上As a many-light problem: Cost of Shadow Map is linearly to #light As a sampling problem: Visibility项V会变…

Lecture 07 Real-time Global Illumination (in 3D)

Lecture 07 Real-time Global Illumination (in 3D) 实时渲染中全局光照一般只bounce两次(直接光照bounce一次,间接光照bounce两次)primary light source 真正的光源secondary light source 次级光源: 一切被直接光照照到的物体都会继续将自己作为光源想要用间接光照照亮\(…

Lecture 04 Real-time Shadows 2

Lecture 04 Real-time Shadows 2 PCF and PCSS PCF背后的数学知识 Filter / convolution: 如果对某个函数\(f\)做卷积,可以用\([\omega * f](p)=\underset{q \in \Nu (p)}{\sum}w(p,q)f(q)\)比如PCSS中对某一点q周围区域做卷积求visibility \(V(x)=\underset{q\in \Nu(p)}{\su…

Lecture 05 Real-time Environment Mapping

Lecture 05 Real-time Environment Mapping Recap: Environment Lighting一张表示了来自四面八方的无穷远处光(distance lighting)的图片 Spherical map vs. cube mapShading from environment lighing 非正式地命名为Image-Based Lighting (IBL) \[L_o(p,\omega_o)=\int_{\Ome…

Lecture 02 Recap of CG Basics

Lecture 02 Recap of CG Basics Graphics Pipeline光栅化、深度测试、Blinn-Phong模型、纹理映射&插值 OpenGL 总结:每一个pass定义物体、相机、MVP 定义帧缓冲区、输入输出纹理 定义Vertex Shader / Fragment Shader 渲染其他的多趟pass 如ShadowMapShading Languages Sh…

VulNyx - System

扫描发现 2121是ftp端口 8000 http的一个端口 6379redis端口爆破redis的密码爆破出来时bonjour猜测ftp的密码和redis的密码是一样的 尝试用密码去爆出ftp的用户名报出来用户名是ben那么根据现有的条件 我们可以利用ftp上传文件 可以用redis module load 加载文件那么我们可以用…