当前位置: 首页 > article >正文

Unity学习日志4

Unity学习日志4

      • 1.Shift + ctrl + F将目前选中的物体移动到目前位置。
      • 2.将某个物体移动至鼠标位置
      • 3.Animation Transform相关选项
      • 4.怎样减少Unity的GC
        • ①减少对象的创建
        • ②优化字符串操作
        • ③ 及时释放不再使用的资源
        • ④ 优化数据结构
      • 5.Unity的拆装箱机制
        • 先导知识:
        • 拆装箱:

1.Shift + ctrl + F将目前选中的物体移动到目前位置。

2.将某个物体移动至鼠标位置

 private void GetMousePoint()
 {
     Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
     Physics.Raycast(ray, out RaycastHit hit);
     if(Input.GetMouseButtonDown(0)) unit.Instance.tragetPosition = hit.point;
     transform.position = hit.point;
     //Debug.Log(Physics.Raycast(ray, out RaycastHit hit));
 }

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);用于把鼠标位置转化为一个射线。
Physics.Raycast(ray, out RaycastHit hit);射线检测,out保证有Raycast返回值hit。
if(Input.GetMouseButtonDown(0)) unit.Instance.tragetPosition = hit.point;
如果点击鼠标左键那么移动木标点到鼠标位置。
transform.position = hit.point;指针位置更新

3.Animation Transform相关选项

在这里插入图片描述

4.怎样减少Unity的GC

	1、C#变量分为两种类型:值类型和引用类型,值类型分配在栈区,引用类型分配在堆区 GC关注引用类型

2、GC卡顿原因:堆内存垃圾回收,向系统申请新的堆内存

3、GC触发条件:堆内存分配而当内存不足时、按频率自动触发、手动强行触发(一般用在场景切换)

4、GC负面效果:内存碎片(导致内存变大,GC触发更加频繁)、游戏顿卡

5、GC优化方向:减少GC次数、降低单次GC运行时间、场景切换时主动GC

6、GC优化策略:减少对内存分配次数和引用次数、降低堆内存分配和回收频率
  
  7、结构体数组:如果结构体中含有引用类型变量,对结构体数组进行拆分,避免GC时遍历所有结构体成员

原文链接:https://blog.csdn.net/Songxianzhang/article/details/141027315

①减少对象的创建

使用对象池:对于频繁创建和销毁的对象,如子弹、敌人等,可以使用对象池来管理。对象池的基本原理是预先创建一定数量的对象,当需要使用对象时,从对象池中取出;当对象使用完毕后,将其放回对象池中,而不是销毁。这样可以避免频繁的对象创建和销毁,减少 GC 的压力。避免在循环中创建对象:在循环中创建对象会导致大量的临时对象被创建,增加 GC 的压力。可以将对象的创建移到循环外部,或者使用对象池来管理这些对象。

②优化字符串操作

避免频繁的字符串拼接:在 C# 中,字符串是不可变的,每次进行字符串拼接操作都会创建一个新的字符串对象。可以使用StringBuilder来代替字符串拼接操作,减少临时对象的创建。

using System.Text;
using UnityEngine;

public class StringBuilderExample : MonoBehaviour
{
    private void Start()
    {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 10; i++)
        {
            sb.Append(i.ToString());
        }
        string result = sb.ToString();
        Debug.Log(result);
    }
}
③ 及时释放不再使用的资源

手动销毁不再使用的对象:当某个对象不再使用时,及时调用Destroy方法将其销毁,以便释放内存。
释放非托管资源:对于一些非托管资源,如纹理、音频等,需要手动调用相应的释放方法来释放资源。例如,使用Resources.UnloadUnusedAssets方法来释放未使用的资源。
非托管资源: 不能被GC自动回收的对象,需手动回收。

④ 优化数据结构

选择合适的数据结构:不同的数据结构在内存使用和性能方面有不同的表现。根据实际需求选择合适的数据结构,避免使用过于复杂或占用内存过多的数据结构。
减少数据结构的频繁扩容:对于一些动态数组,如List,在添加元素时可能会发生扩容操作,导致内存重新分配和临时对象的创建。可以预先分配足够的容量,减少扩容的次数。

5.Unity的拆装箱机制

先导知识:

①引用类型与引用类型之间赋值操作
当把一个引用类型的变量赋值给另一个引用类型的变量时,实际上传递的是对象的引用(内存地址),而非对象本身。这意味着两个变量会指向堆内存中的同一个对象。因此,对其中一个变量所引用对象的属性进行修改,会反映到另一个变量上。
②值类型与值类型之间赋值操作
值类型变量赋值时,会把变量的值复制一份给新的变量。两个变量在内存中是相互独立的,对其中一个变量进行修改,不会影响到另一个变量。
因此值类型赋值的时候如果数据量较大可能会影响到程序的性能,然而引用类型的时间复杂度低一般不会有性能的问题。

拆装箱:

拆装箱指的是:
:把引用类型转换回值类型,在进行拆箱操作时,首先会检查引用类型所指向的对象是否是目标值类型的装箱实例,如果是,则将堆上存储的值复制到栈上的目标值类型变量中。
首先会检查引用类型所指向的对象是否是目标值类型的装箱实例
意思是在拆箱的时候会先检查引用类型装的变量是否为要赋值给的值类型是的话转化并赋值,否则抛出异常。
:将值类型转换为引用类型,当进行装箱操作时,会在堆上分配一块内存,将值类型的数据复制到这块内存中,然后返回一个指向该内存地址的引用。

由于装箱会涉及到内存分配和赋值所以性能开销及大。拆箱过程也需要涉及到赋值。
因此使用泛型集合可以很好的避免拆装箱,因为在集合定义之初已经定义变量类型了。

原文地址:https://blog.csdn.net/Yuze_miao/article/details/146244182
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/589059.html

相关文章:

  • vscode打不开
  • Pytest深度集成Playwright让测试自动化变得轻松简单
  • Cisdem Video Converter for Mac v8.4.1 视频格式转换 支持M、Intel芯片
  • Java 常用工具类大全:高频工具类及代码示例(后续继续补充)
  • 区块链与去中心化技术
  • 基于SpringBoot的公司财务管理系统+LW示例参考
  • 工作记录 2017-01-06
  • N皇后问题——dfs解法(回溯+减枝+深搜)
  • 7、基于osg引擎实现读取vtk数据通过着色器实现简单体渲染(1)
  • go 安装swagger
  • 1.Qt SDK 的下载和安装
  • matlab 三维桥式起重机系统数学模型
  • 2025高频面试算法总结篇【递归回溯动态规划】
  • windows 下用docker 部署nginx
  • unity基础——Navigation导航系统
  • 网络安全设备系统集成方案 系统集成和网络安全
  • 命令行参数和环境变量【Linux操作系统】
  • 【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models
  • BigEvent项目后端学习笔记(一)用户管理模块 | 注册登录与用户信息全流程解析(含优化)
  • 数据增强常见问题与解决方案:提升AI模型性能的关键技巧