【Unity3D杂谈】记一次修复BufferMetal::EndWrite崩溃的问题

文章讲述了在Unity2021.3.26f1版本升级后,iOS端出现BufferMetal::EndWrite崩溃问题,怀疑是版本bug导致的内存访问错误。作者发现此问题与粒子系统有关,通过查阅更新日志找到升级到2021.3.28f1或关闭多线程渲染作为临时解决方案,以确保在线项目稳定运行。
摘要由CSDN通过智能技术生成

一、问题描述

自从Unity3D升级到2021.3.26f1这个版本之后,在崩溃监控后台就看到iOS端有一条新增的崩溃BufferMetal::EndWrite,具体崩溃对战如下:

Crashed: UnityGfxDeviceWorker
0  UnityFramework                 0x10c5748 BufferMetal::EndWrite(BufferMetal::MetalVersionedBuffer*, unsigned long, bool) + 54 (MetalScratchBuffer.h:54)
1  UnityFramework                 0x10d2630 GfxDeviceMetalBase::EndBufferWrite(GfxBuffer*, unsigned long) + 3349 (GfxDeviceMetal.mm:3349)
2  UnityFramework                 0xf5d8dc GeometryJobTasks::PutGeometryJobTask(GfxDevice&, GeometryJobTasks::GeometryJobTask*) + 176 (GeometryJob.cpp:176)
3  UnityFramework                 0xf5d7b8 GeometryJobTasks::EndFrame(GfxDevice&) + 65 (mpsc_node_stack.h:65)
4  UnityFramework                 0x104a0cc GfxDeviceWorker::RunCommand(ThreadedStreamBuffer&) + 1470 (GfxDeviceWorker.cpp:1470)
5  UnityFramework                 0x10d82dc GfxDeviceWorkerAutoreleasePoolProxy + 5750 (GfxDeviceMetal.mm:5750)
6  UnityFramework                 0x104b868 GfxDeviceWorker::RunExt(ThreadedStreamBuffer&) + 381 (GfxDeviceWorker.cpp:381)
7  UnityFramework                 0x10433ac GfxDeviceWorker::RunGfxDeviceWorker(void*) + 339 (GfxDeviceWorker.cpp:339)
8  UnityFramework                 0xba2550 Thread::RunThreadWrapper(void*) + 82 (Thread.cpp:82)
9  libsystem_pthread.dylib        0x19ac _pthread_start + 148
10 libsystem_pthread.dylib        0xe68 thread_start + 8

表现上是低内存,像是内存占用满了导致的崩溃。但是从理性分析,这个版本的内容,内存中占用理论上不应该与之前版本有重大变化。而且正好是升级了Unity的时候,所以最大的可能性是触发了什么Unity版本bug,导致访问了无效内存导致。
于是就开始搜集跟这个崩溃有关的资料。

在Unity官方论坛上,发现了如下的帖子:

BufferMetal::EndWrite crash

大致问题原因是,粒子系统出了问题导致的崩溃。

二、修复版本

于是,便开始大量翻阅Unity的版本更新日志,查找符合描述的崩溃修复,看能不能通过后续的版本升级来修复这个崩溃。

在Unity3D 2021.3.28f1版本的更新日志中,发现了如下的修复:

在这里插入图片描述

Unity3D 2021.3.28f1 Release Note

那么根本上的解决方案就是升级到比这个版本更新的Unity版本。

三、临时方案

升级Unity3d对于在线上稳定运营的项目来说还是需要谨慎的,需要更多时间测试。

通过帖子和Release Note描述可知,其实是因为Unity3D的多线程渲染功能(multi-thread rendering)的bug导致的。所以有一个临时方案是,在Unity升级测试完毕之前,可以先发一个把多线程渲染关闭的版本争取点时间,然后后续升级完再打开。多线程渲染对性能有影响,经过线上历史数据测得,在现有玩家群体,这个功能对Android平台的性能更大,而iOS影响小一些。而这次崩溃影响的又是iOS平台,于是临时只关闭了iOS平台的多线程渲染,然后升级Unity,等测试完毕Unity升级的版本再打开多线程渲染即可。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

留待舞人归

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值