【Unity研究】进程、线程、对象池的关系

这篇具有很好参考价值的文章主要介绍了【Unity研究】进程、线程、对象池的关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

简要概括

名词解释

实例

进程

线程

对象池

实际使用

对象池实际操作(含代码)

建立主线程以外的线程方法

在主线程中运行的生命周期

在副线程中运行的生命周期


简要概括

正在运行的Unity游戏就可以看做一个进程的实例,线程是进程内的执行单元(一个进程可以拥有多个线程),Unity游戏中的详细操作是在同一个进程里的中执行的。

名词解释

实例

“实例”指具体的实际存在的单个对象或者事物。在计算机中,进程就是程序的实例,也就是指程序在某个时间段内的运行过程。

进程

进程(Process)是计算机中正在运行的一个程序或任务的实例。在操作系统中,进程是资源分配的基本单位,每个进程都拥有自己独立的内存空间和系统资源,包括CPU、内存、文件、网络连接等。进程的出现是为了解决多道程序同时运行的冲突问题,通过将系统资源分配给多个进程,提高了计算机系统的效率和可用性。

每个进程都有自己的地址空间,包括代码段、数据段、堆和栈。堆和栈是两种不同的内存分配方式,堆用于动态分配内存,而栈则用于管理函数调用和变量分配。进程之间是相互独立的,可以并行运行,并且通过IPC和共享内存等方式进行通信和数据交换。

操作系统通过进程调度算法决定何时和如何切换进程,以保证每个进程都能得到足够的运行时间和系统资源,并且根据进程的优先级和状态等进行调度。进程的状态通常包括运行态、就绪态、等待态和终止态等。操作系统通过进程管理来保证系统的稳定性和安全性,防止进程之间的冲突和竞争,提高了计算机系统的效率和可靠性。

线程

线程是进程内的执行单元,一个进程可以拥有多个线程,每个线程都是独立的执行流。在Unity的代码中,update是在主线程中被执行的,不是在单独的线程中,而销毁物品等操作也是在主线程中执行的。

对象池

为了减少线程压力而创造的方法。

实际使用

对象池实际操作(含代码)

简单来说,对象池就是个含有list的类,而list也就是所谓的对象池的“池子”。

将需要操作的物品放在list中,然后隐藏。

需要使用对象的时候从对象池拿出对象,也就是显示物品。

不需要的时候放回,也就是隐藏物品。

彻底不需要时销毁(destroy),释放内存,并将对象从池子中移除。

对象池:

public class EnemyPool
{
    private List<GameObject> enemyPool;
    private GameObject enemyPrefab;
    private int poolSize;

//创建对象池;更新对象池对象
    public EnemyPool(GameObject prefab, int size)
    {
        enemyPrefab = prefab;
        poolSize = size;
        enemyPool = new List<GameObject> ();

        for (int i = 0; i < poolSize; i++) {
            GameObject enemy = GameObject.Instantiate(enemyPrefab) as GameObject;
            enemy.SetActive(false);
            enemyPool.Add(enemy);
        }
    }
//从对象池中拿出对象
    public GameObject GetEnemy()
    {
        foreach (GameObject enemy in enemyPool) {
            if (!enemy.activeInHierarchy) {
                enemy.SetActive(true);
                return enemy;
            }
        }

        GameObject newEnemy = GameObject.Instantiate(enemyPrefab) as GameObject;
        newEnemy.SetActive(true);
        enemyPool.Add(newEnemy);

        return newEnemy;
    }
//放回对象
    public void ReleaseEnemy(GameObject enemy)
    {
        enemy.SetActive(false);
    }
}

实际使用:

public class GameManager : MonoBehaviour
{
    public GameObject enemyPrefab;
    public int enemyPoolSize;

    private EnemyPool enemyPool;

    private void Start ()
    {
        enemyPool = new EnemyPool(enemyPrefab, enemyPoolSize);
    }

    private void Update () 
    {
        //从对象池中获取敌人对象
        GameObject enemy = enemyPool.GetEnemy();

        //对敌人对象进行操作
        enemy.transform.position += Vector3.forward * Time.deltaTime;

        //将敌人对象放回对象池中
        enemyPool.ReleaseEnemy(enemy);
    }
}

为什么要用对象池?

对象池可以使应用程序更高效地利用有限的线程资源,相比起“在编辑器里就把所有物品放到场景中”和“在游戏开始时实例化所有物品(这个方法会让游戏卡顿)”,对象池能动态操控物品的出现和隐藏。

线程效率受内存限制,而物体的实例化、销毁、隐藏显示都在线程中进行,为了节省资源,我们要尽量减少一次性的操作数量。

使用对象池,需要考虑的东西:物品创建和销毁的时机

物品创建时机:可以在游戏加载时一次性创建所有需要的物品对象,或者等到玩家进入游戏世界后,根据需要动态创建。

物品销毁时机:当物品离开玩家的视野范围时,可以将其销毁,或者等到玩家不再需要该物品时再销毁。

对象池的大小:需要考虑在游戏中最大需要创建的物品数量,确定对象池的大小。对象池的大小应该不要过小,否则可能会频繁地创建和销毁物品对象,造成性能损失。(不过用list就不用考虑这一点了,使用数组才需要考虑,用list只需要在不需要物品时及时把物品移出对象池)

对象池的回收和重复利用:一旦物品被销毁,其所占用的资源应该被释放,并将该物品对象重新放回对象池中,以便下次重复利用。

建立主线程以外的线程方法

1.Thread类

示例:

using System;
using System.Threading;

public class Program
{
    static void Main(string[] args)
    {
        // 创建一个新线程
        Thread newThread = new Thread(Compute);

        // 启动线程
        newThread.Start();

        // 在主线程中执行一些其他操作
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("Main thread is running.");
            Thread.Sleep(100);
        }
    }

    static void Compute()
    {
        // 在新线程中执行一些计算密集型的操作
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("New thread is running.");
            Thread.Sleep(100);
        }
    }
}

2.异步

3.协程(Coroutine类)

4.Job System

Job System是Unity自带的,可以使游戏逻辑转移到多线程中执行。使用Job、JobHandle和JobQueue等组件来管理和调度任务。

5.Entity Component System (ECS)

ECS是Unity中的一种数据驱动的编程模式,可以将游戏逻辑从主线程转移到其他线程中执行,并行处理大量数据。

6.Native Plugin

使用Native Plugin可以在C++或其他编程语言中编写独立于Unity的多线程代码,然后将其集成到Unity中。使用该方法可以获得更高的性能和更灵活的控制。文章来源地址https://www.toymoban.com/news/detail-477946.html

在主线程中运行的生命周期

  1. Awake()
  2. Start()
  3. Update()
  4. FixedUpdate()
  5. LateUpdate()
  6. OnGUI()
  7. OnDisable()
  8. OnEnable()
  9. OnDestroy()

在副线程中运行的生命周期

  1. OnApplicationFocus()
  2. OnApplicationPause()
  3. OnApplicationQuit()

到了这里,关于【Unity研究】进程、线程、对象池的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【多线程系列-01】深入理解进程、线程和CPU之间的关系

    多线程系列整体栏目 内容 链接地址 【一】深入理解进程、线程和CPU之间的关系 https://blog.csdn.net/zhenghuishengq/article/details/131714191 【二】java创建线程的方式到底有几种?(详解) https://blog.csdn.net/zhenghuishengq/article/details/127968166 【三】深入理解java中线程的生命周期,任务调度 ht

    2024年02月16日
    浏览(70)
  • IO进程线程,文件与目录,实现linux任意目录下ls -la

    注意文件的名字、路径是如何输入的。 函数opendir打开目录,struct dirent,struct stat这些结构体的含义。          readdir()函数是一个用于读取目录内容的系统调用或库函数,在类Unix操作系统中(如Linux)广泛使用。它用于遍历目录,并逐个获取目录中的条目(文件和子目录

    2024年02月10日
    浏览(41)
  • snakemake运行时,节点数, 进程数,线程数,任务数之间的关系,实例说明

    在使用 Snakemake 和 SLURM 运行并行计算作业时,理解节点数、进程数、线程数和任务数之间的关系是很重要的。这些参数决定了作业如何在集群上分配和执行。下面是这些参数的基本解释和它们如何相互作用: 节点数 ( -N ) : 指定作业需要使用的物理服务器(节点)数量。每个

    2024年04月25日
    浏览(38)
  • IO进程线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

          一、文件IO 1、文件io通过系统调用来操作文件 系统调用:系统提供给用户的一组API(接口函数)         open/read/write/close/lseek... 用户空间进程访问内核的接口 把用户从底层的硬件编程中解放出来 极大的提高了系统的安全性 使用户程序具有可移植性(同一系统下) 是操作

    2024年02月11日
    浏览(35)
  • 【Java基础教程】(四十二)多线程篇 · 上:多进程与多线程、并发与并行的关系,多线程的实现方式、线程流转状态、常用操作方法解析~

    理解进程与线程的区别; 掌握Java 中多线程的两种实现方式及区别; 掌握线程的基本操作方法; 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程 。多进程操作系统能同时运行多

    2024年02月16日
    浏览(48)
  • 1.Unity协程、进程、线程的区别

    1、 进程 拥有自己独立的堆和栈,堆和栈都不共享,进程由操作系统调度。 2、 线程 有自己独立的栈和共享的堆,栈不共享,堆共享,标准的线程也是由系统调度。 3、 协程 有自己独立的栈和共享的堆,栈不共享,堆共享,协程由程序员在协程的代码里面调度。 协程多与线

    2024年02月03日
    浏览(47)
  • 一文详解Python中多进程和进程池的使用方法

    这篇文章将介绍Python中多进程和进程池的使用方法,并提供一些实用的案例供大家参考,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下 目录 Python是一种高级编程语言,它在众多编程语言中,拥有极高的人气和使用率。Python中的多进程和进程池是其强大的功能之一

    2023年04月24日
    浏览(32)
  • Python开启线程和线程池的方法

    1、通过用户慢慢递增来进行性能压测,观察QPS(即每秒的响应请求数,也即是最大吞吐能力。),响应时间 2、根据公式计算:服务器端最佳线程数量=((线程等待时间+线程cpu时间)/线程cpu时间) * cpu数量 3、单用户压测,查看CPU的消耗,然后直接乘以百分比,再进行压测,一般这

    2024年02月03日
    浏览(47)
  • 【Linux】线程终结篇:线程池以及线程池的实现

    linux线程完结 文章目录 前言 一、线程池的实现 二、了解性知识 1.其他常见的各种锁 2.读者写者问题 总结 什么是线程池呢? 线程池一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行

    2024年02月12日
    浏览(35)
  • 线程池的核心线程数该怎么设置

    为什么要用线程池?线程池中的线程可以重复利用,避免了重复创建线程造成的资源开销。在线程的执行时间比较短,任务比较多的时候非常适合用线程池。 如果运行的线程少于核心线程,会尝试去开启一个新的核心线程(addWorker),如果有空间的核心线程,也不会去使用,

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包