前言 观看 bilibili @Metaverse大衍神君 视频记录笔记,是本来作者留下的笔记经整理也有自己不太懂的地方扩展延伸,如有错误还请海涵指正!
环境搭建 使用如下命令拉起测试项目并使用 Unity 打开
git clone https://github.com/lwwhb/Unity2022_SUNTAIL_Stylized_Fantasy_Village_Optimization 个人使用的 2022.1.16 版本打开,会出现一个 com.unity.render-pipelines.universal 的包错误,个人解决方案是在 PackageManage 里删除这个包后,Unity 会自动提示升级材质,点击后会自动安装新版的 URP 包,也会自动配置好渲染管线
{% note warning%} 注意这里我将项目设置为了 URP(SRP) 渲染管线会导致下面无法查看场景 Mipmap 选项,在视频教程中的内置渲染管线(built-in)可以查看 {% endnote %}
打开项目的 Autoconnect Profiler 并在场景加入 DebugCanvas 方便移动设备的调试
关闭移动平台的 VSync Count 选项,以发挥最大性能
{% note primary %}
VSync Count:每帧之间应传递的垂直同步数量 Unity 通过将平台的默认目标帧速率除以 VSyncCount 的值来计算目标帧速率
{% endnote %}
未优化时的性能指标 生成的 Android APK大小 550M 三角形平均面熟 150-200 万,峰值 230 万 渲染批次 1500-1800 次 SetPassCall 200 次以上 小米11 ultra平均 FPS :10 FPS,iPhone XS Max 15FPS 内存 小米 11 ultra 1....
查阅 MSDN 异步编程以了解更多
异步编程 在 C# 中,异步编程是一种编程范式,它允许程序异步执行任务,而不会阻塞主线程或其他任务的执行。在异步程序中,程序可以继续执行其他任务,而无需等待一个任务完成
优势 异步编程可以为需要执行 I/O 操作或其他耗时任务的应用程序提供显著的优势,例如访问数据库、下载文件或执行网络通信。通过使用异步编程,应用程序可以提高性能、响应性、可扩展性和资源效率,同时简化代码并提高容错性
误解 异步编程总是更快:虽然异步编程可以提高性能,但它并不能保证在所有情况下都能提供更快的执行速度,如果一个应用程序没有大量的 I/O 操作或耗时任务,使用异步编程可能不会提供任何性能优势,甚至可能引入不必要的复杂性
异步编程总是优于同步编程:虽然异步编程可以提高应用程序的可扩展性和响应性,但它可能并不总是最好的解决方案。异步编程可能会引入额外的复杂性,而且对于所有的用例可能都不是必需需要的
异步编程可以完全消除对线程的需求:虽然异步编程可以减少显式线程的需求,但它并不能完全消除它。异步编程仍然依赖于底层线程和线程池在后台执行任务
还有并不能完全消除锁和同步的需求、或认为异步容易调试等等
关键字 async 和 await
目标 支持读起来像一连串语句的代码,但会根据外部资源分配和任务完成时间以更复杂的顺序执行
内容 async 用以标记函数的关键字,例如:
public async Task TestAsync(){ } 但仅这还不是真正的异步函数
await 必须在 async 标记下的函数内使用的关键字,例如:
public async Task TestAsync() { await Task.delay(1000); Console.WriteLine("TestDone"); } async 和 await 一起使用才构成了异步函数
如此例所示,await 关键字将暂停 TestAsync 方法的执行,并返回不完整的 Task,在此期间,线程将返回到线程池,以便自己可用于另一个请求,await 完成后将恢复继续向下执行
但是,如何知道 await 已经完成呢?这里就需要用到 Task,可先了解一下此站另一个 blog - 线程
总结 该操作不会在线程池线程运行
如果仅使用 async 关键字,那么函数内容仍会以同步方式进行
一般异步函数命名的最后结尾都是 Async...
Threads 定义 线程被定义为程序的执行路径。每个线程定义了一个唯一的控制流,如果应用程序涉及复杂而耗时的操作,那么设置不同的执行路径或线程通常很有帮助,每个线程执行特定的工作
线程是轻量级过程。使用线程的一个常见例子是现代操作系统实现并发编程。使用线程可以节省 CPU 周期的浪费,并提高应用程序的效率
Thread 对象代表了一个线程的执行状态和行为,它可以直接创建和管理线程。线程是操作系统调度的最小执行单位,一个进程可以包含多个线程,线程之间可以并行执行,但需要注意线程安全的问题。开发人员需要手动控制线程的生命周期、线程的同步和互斥等问题,否则容易引起线程竞争、死锁等问题
在 .Net Framework 4.0 之前都是都是用 Thread 类来进行操作并发编程,此类实例表示操作系统内部调度的托管线程
创建实例 public static void Main() { double i = 0; var t = new Thread(() => { i = Math.Exp(1); }); // Math.Exp() 中的 e 是欧拉数,常数大约为 2.71828,记作 e 的 d 次方 t.Start();// 启动线程 t.Join();// 会等待目标线程结束,将值传回 i Console.WriteLine(i); // output: 2.718281828459045 } 这里我们演示了一遍创建子线程操作,思考一下,如果我们频繁对一些操作处理要开线程的话,其加载初始化对操作系统的负载未免加大
这时,微软在 CLR 引入了线程池和其中的可配置线程池参数,线程池不包含线程,只有当需要用到时,才会按需创建,并当线程完成时不会立即销毁而会以暂停状态返回线程池,会保留一段时间直至唤醒,长时间不使用则会销毁
管理 可用 Thread.Sleep(int millisecondsTimeout) 方法来暂停主线程
销毁 以前可见 Abort() 销毁方法,但在 .Net 5....
“The missing package manager for macOS (or Linux)” – Homebrew
前言 Homebrew 是 macOS 下非常优秀的包管理软件解决方案,只需要几行命令就能找到并下载软件,可以省去查找、下载、解压、拖拽等步骤,但相信各位朋友在安装过程会遇到一些麻烦,以下是我针对自己网络环境和计算机情况写下记录,接下来一起讨论解决下吧
安装 在终端下输入以下指令进行安装:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" 报错 可能会遇到类似以下报错
>>> csscurl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused 原因:可能因为是网址被墙或者是域名被污染
适用于自己情况的解决步骤 安装环境 在这里首先需要安装 Command Line Tools for XCode(CLT) 这个工具,为安装 Homebrew 提供环境,如果已经安装过 XCode 的朋友可跳过,因为软件自带环境,没有的朋友则输入以下指令进行安装
xcode-select --install 其中会有安装软件的提示,根据要求点下来即可,过程十分钟左右
自定义增加 host 映射 目的:跳过自己 DNS 的解析
在终端输入以下命令
sudo vim /etc/hosts 输入自己密码后回车以使用 vim 进入命令模式,按下 i 进入插入模式,在最下面添加以下内容,输入完成后按下 ecs 退出插入模式并输入 :wq 保存后退出...
起因 使用了破解
修改了 IDE 的 .vmoptions 文件
心路路程 服了 无法正常从启动台启动…
几近疯狂!!!
尝试措施 彻底卸载 https://www.jetbrains.com/help/rider/Uninstall.html#standalone
但好像没用
其实思路没问题,就还是没卸载干净 =(
删除用以破解的 VMS 每个朋友路径、IDE 可能不同
以我举例:通过用包打开软件,依次找到文件 Content - MacOS - rider.Unix ,双击打开可以看到前面有行 parseVMOptions 找到你电脑这个 .vmoptions 文件所处位置,删除,卸载,重新安装,发现没用 :/
原因猜测:虽然删除了用以启动的破解配置文件,但并没有更改 IDE 启动用以的前破解配置文件路径
解决 YouTrack 解决原文
打开文件 /Users/{USER_NAME}/Library/LaunchAgents/jetbrains.vmoptions.plist ,删除所有 launchctl setenv "*_OPTIONS". 然后重启
完成!
原因猜测:更改了用以启动的配置文件路径
用正版用正版 ToT