Unity 之 RenderTexture 的性能问题

场景

在Unity中,往往需要使用到一张新的RenderTexture来做一些画面处理的情况,如UI的滤镜、模糊等;

以UI弹窗的模糊背景为例,我们的一个实现思路是,编写一个BlurShader,在打开模糊背板时,获取相机的渲染内容CameraRenderTexture,对该CameraRanderTexure应用BlurShader生成BlurRenderTexture并赋值给背景RawImage组件的texture属性,以此达到模糊背景的作用;

问题

重要的一点在于,RenderTexture的内存并不会被Unity自动回收于管理。在Unity中,新建的RenderTexture会存放在内存中,必须时刻注意任何渲染纹理的生命周期, 并牢记在使用完渲染纹理后使用Release函数释放它们, 因为系统不会像对待常规托管类型那样对它们进行垃圾回收;

在该场景中,很显然我们会想要在游戏的各种不同地方都能拿到当前显示内容的BlurRenderTexture,也就意味着,不论是CameraRenderTexture还是BlurRenderTexture都是临时的(因为一张画面的BlurRenderTexture只适用于当前打开的位置的相机画面内容)。如果在每个模糊背板的调用代码中都去new RenderTexture,会在每次打开一个需要模糊背景的弹窗时都往内存中塞入新的RenderTexture(它们不会自动被回收),从而造成内存泄漏;

解决

一个简单的办法是,在打开模糊背板时,我们都使用RenderTexture.GetTemporary方法来获得一个临时的渲染纹理,然后在关闭面板时使用RenderTexture.ReleaseTemporary方法来释放使用GetTemporary分配的临时纹理,这样就避免了RenderTexture的内存泄露问题;

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇