在 Swift 中动态更改 SCNView 的背景
Dynamically change background of SCNView in Swift
我正在制作一个 iOS 应用程序,其本质部分是通过 TCP 逐帧接收 JPEG 图像。
应用程序的另一部分有一个 ARSCNView
,需要根据这些帧动态设置背景。
我的伪代码如下所示:
while(phase == 1) {
let bytes = try tcpSocket.read(into: &jpegData)
sceneView.scene.background.contents = UIImage(data: jpegData)
// or the other way
let bgempty = backgroundImage == nil
backgroundImage = UIImage(data: jpegData)
if(bgempty) {
sceneView.scene.background.contents = backgroundImage
}
}
差不多就这些了。无论哪种方式,此循环都会造成内存泄漏。当我使用 CGImage
时相同
如何为 ARSCNView
分配不断变化的背景,避免内存泄漏?
一种解决方案是使用 autoreleasepool
块。这可以确保内存占用保持最小。您使用的循环占用了大量设备内存,要优化此代码,您可以添加自动释放池,如下所示:
while(phase == 1) {
autoreleasepool {
let bytes = try tcpSocket.read(into: &jpegData)
sceneView.scene.background.contents = UIImage(data: jpegData)
// or the other way
let bgempty = backgroundImage == nil
backgroundImage = UIImage(data: jpegData)
if(bgempty) {
sceneView.scene.background.contents = backgroundImage
}
}
}
我正在制作一个 iOS 应用程序,其本质部分是通过 TCP 逐帧接收 JPEG 图像。
应用程序的另一部分有一个 ARSCNView
,需要根据这些帧动态设置背景。
我的伪代码如下所示:
while(phase == 1) {
let bytes = try tcpSocket.read(into: &jpegData)
sceneView.scene.background.contents = UIImage(data: jpegData)
// or the other way
let bgempty = backgroundImage == nil
backgroundImage = UIImage(data: jpegData)
if(bgempty) {
sceneView.scene.background.contents = backgroundImage
}
}
差不多就这些了。无论哪种方式,此循环都会造成内存泄漏。当我使用 CGImage
如何为 ARSCNView
分配不断变化的背景,避免内存泄漏?
一种解决方案是使用 autoreleasepool
块。这可以确保内存占用保持最小。您使用的循环占用了大量设备内存,要优化此代码,您可以添加自动释放池,如下所示:
while(phase == 1) {
autoreleasepool {
let bytes = try tcpSocket.read(into: &jpegData)
sceneView.scene.background.contents = UIImage(data: jpegData)
// or the other way
let bgempty = backgroundImage == nil
backgroundImage = UIImage(data: jpegData)
if(bgempty) {
sceneView.scene.background.contents = backgroundImage
}
}
}