内存警告后在 iOS 上运行 OpenGL 崩溃

2024-03-30

我遇到了带有 OpenGL 组件的应用程序在 iPad 上崩溃的问题。该应用程序抛出内存警告并崩溃,但它似乎没有使用那么多内存。我错过了什么吗?

该应用程序基于 Vuforia 增强现实系统(大量借鉴了 ImageTargets 示例)。我需要在应用程序中包含大约 40 个不同的模型,因此为了节省内存,我根据需要在应用程序中动态加载对象(并渲染纹理等)。我试图复制 UIScrollView 延迟加载的想法。这三个 4mb 分配是我已加载到内存中的纹理,可供用户选择要显示的不同模型时使用。

这里面有什么奇怪的吗?

我对 OpenGL 不太了解(这也是我选择 Vurforia 引擎的部分原因)。下面的屏幕截图中有什么值得我担心的吗?请注意,Vurforia 的 ImageTgets 示例应用程序还具有未初始化的纹理数据(大约每帧一个),因此我认为这不是问题。

任何帮助,将不胜感激!!

以下是生成 3D 对象的代码(在 EAGLView 中):

// Load the textures for use by OpenGL
-(void)loadATexture:(int)texNumber {

if (texNumber >= 0 && texNumber < [tempTextureList count]) {
    currentlyChangingTextures = YES;

    [textureList removeAllObjects];
    [textureList addObject:[tempTextureList objectAtIndex:texNumber]];

    Texture *tex = [[Texture alloc] init];
    NSString *file = [textureList objectAtIndex:0];

    [tex loadImage:file];



    [textures replaceObjectAtIndex:texNumber withObject:tex];
    [tex release];

    // Remove all old textures outside of the one we're interested in and the two on either side of the picker.
    for (int i = 0; i < [textures count]; ++i) {

        if (i < targetIndex - 1 || i > targetIndex + 1) {
            [textures replaceObjectAtIndex:i withObject:@""];
        }
    }


    // Render - Generate the OpenGL texture objects
    GLuint nID;
    Texture *texture = [textures objectAtIndex:texNumber];
    glGenTextures(1, &nID);
    [texture setTextureID: nID];
    glBindTexture(GL_TEXTURE_2D, nID);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, [texture width], [texture height], 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)[texture pngData]);


    // Set up objects using the above textures.
    Object3D *obj3D = [[Object3D alloc] init];

    obj3D.numVertices = rugNumVerts;
    obj3D.vertices = rugVerts;
    obj3D.normals = rugNormals;
    obj3D.texCoords = rugTexCoords;

    obj3D.texture = [textures objectAtIndex:texNumber];

    [objects3D replaceObjectAtIndex:texNumber withObject:obj3D];
    [obj3D release];

    // Remove all objects except the one currently visible and the ones on either side of the picker.
    for (int i = 0; i < [tempTextureList count]; ++i) {

        if (i < targetIndex - 1 || i > targetIndex + 1) {
            Object3D *obj3D = [[Object3D alloc] init];
            [objects3D replaceObjectAtIndex:i withObject:obj3D];
            [obj3D release];
        }
    }


    if (QCAR::GL_20 & qUtils.QCARFlags) {
        [self initShaders];
    }


    currentlyChangingTextures = NO;
}

}

这是纹理对象中的代码。

- (id)init
{
self = [super init];
pngData = NULL;

return self;
}


- (BOOL)loadImage:(NSString*)filename
{
BOOL ret = NO;

// Build the full path of the image file
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
NSString* fullPath = [resourcePath stringByAppendingPathComponent:filename];

// Create a UIImage with the contents of the file
UIImage* uiImage = [UIImage imageWithContentsOfFile:fullPath];

if (uiImage) {
    // Get the inner CGImage from the UIImage wrapper
    CGImageRef cgImage = uiImage.CGImage;

    // Get the image size
    width = CGImageGetWidth(cgImage);
    height = CGImageGetHeight(cgImage);

    // Record the number of channels
    channels = CGImageGetBitsPerPixel(cgImage)/CGImageGetBitsPerComponent(cgImage);

    // Generate a CFData object from the CGImage object (a CFData object represents an area of memory)
    CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));

    // Copy the image data for use by Open GL
    ret = [self copyImageDataForOpenGL: imageData];
    CFRelease(imageData);
}

return ret;
}


- (void)dealloc
{
if (pngData) {
    delete[] pngData;
}

[super dealloc];
}

@end


@implementation Texture (TexturePrivateMethods)

- (BOOL)copyImageDataForOpenGL:(CFDataRef)imageData
{    
if (pngData) {
    delete[] pngData;
}

pngData = new unsigned char[width * height * channels];
const int rowSize = width * channels;
const unsigned char* pixels = (unsigned char*)CFDataGetBytePtr(imageData);

// Copy the row data from bottom to top
for (int i = 0; i < height; ++i) {
    memcpy(pngData + rowSize * i, pixels + rowSize * (height - 1 - i), width * channels);
}

return YES;
}

您很可能看不到应用程序的真实内存使用情况。正如我所解释的这个答案 https://stackoverflow.com/questions/5518918/instruments-with-ios-why-does-memory-monitor-disagree-with-allocations/5627221#5627221,分配工具向 OpenGL ES 隐藏内存使用情况,因此您无法使用它来测量应用程序的大小。相反,请使用内存监视器工具,我打赌它会显示您的应用程序使用的 RAM 比您想象的要多得多。这是人们尝试使用 Instruments 在 iOS 上优化 OpenGL ES 时遇到的常见问题。

如果您担心哪些对象或资源可能在内存中累积,则可以使用分配工具的堆快照功能来识别在应用程序中执行重复任务时已分配但从未删除的特定资源。这就是我追踪纹理和其他未正确删除的项目的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内存警告后在 iOS 上运行 OpenGL 崩溃 的相关文章

  • 如何在 UICollectionView 的节标题中动态添加标签和按钮?

    请帮助我如何水平添加标签和水平添加类似的按钮 但每个按钮应像另一个部分一样在每个标签的下方对齐 这应该在 UICollectionView 的标题中动态发生 因为标签和按钮的数量根据我的数据 我想制作一种 Excel 类型的布局 并在标题中
  • 使用 NSURLSessionDataTask 显示文件下载进度

    我想显示特定文件的文件下载进度 收到了多少字节 它与 NSURLSessionDownloadTask 配合得很好 我的问题是我想用 NSURLSessionDataTask 实现同样的效果 以下是将文件接收到 NSData 并写入文档文件
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • “同时创建 xib 文件”按钮已禁用

    我在创建时遇到这个问题UIView s子类 创建 例如 UIViewControllers or UITableViewCells没关系 为什么会出现这种情况 I create view using cmd N and Xcode Vers
  • 尝试复制文件时出错

    我正在尝试使用 NSFileManager 将临时文件复制到另一个位置 但是它失败并抱怨其中一个文件不存在 Copy temp file NSError error BOOL exists fileManager fileExistsAtP
  • ubuntu 16.04.1 LTS 启动 Android 模拟器时崩溃

    我已经尝试过 Android studio 上的 AVD 和 Genymotion 模拟器 我的 ubuntu 16 04 1 在启动 android 模拟器时崩溃 冻结 我的电脑内存是16G 在我于 2016 年 9 月 19 日安装了
  • 带有 Core Data 对象的动态 UITableView 高度

    过去几天我一直在试图解决一个谜团 即为什么我的批处理大小为 20 的 NSFetchedResultsController 总是在获取完成后立即错误 即加载到内存中 我的所有对象 从而导致请求需要约 20 秒 事实证明 这是因为在我的 he
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 用 UIView 像翻书一样翻页?

    我正在尝试在之间切换UIViews让它看起来就像你正在翻书的一页 The UIViewAnimationTransitionCurlUp如果我能让它向左或向右卷曲 那就非常接近了 这可能吗 我尝试过使用CATRansition但没有一种动画
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项
  • 如何在 Apple Watch Extension/App 和 iOS App 之间建立通信通道

    我正在探索 WatchKit SDK 当我有 WatchKit 应用程序时 是否可以在 WatchKit 应用程序上从 iPhone 应用程序设置值 例如文本 设置 我可以从 iPhone 应用程序调用 WatchKit 应用程序扩展中的函
  • 由于语言错误,Itunes Connect 无法提交

    Thats all it shows https i stack imgur com 0aZm8 png 我不确定它没有告诉我出了什么问题 it shows its linked to the language https i stack
  • jQuery:如果使用 html() 从 DOM 中删除事件处理程序,是否会从对象中删除事件处理程序

    我担心应用程序中的内存泄漏 因为我经常使用 jquery 的 html 方法来替换 DOM 中的内容 我只是想确保这些事件侦听器不会停留在浏览器内存中 我搜索了 jquery 文档没有明确的答案 有人知道吗 多谢你们 是的 他们是 如果你使
  • 致命信号 11 (Sigsegv) 位于 0x00000000(代码=1)?

    为什么会出现这个问题呢 public static String path private VideoView mVideoView mVideoView VideoView findViewById R id surface view m
  • ITMS-90535 无法使用最新的 Google Signin SDK 发布 iOS 应用程序

    我正在使用 xcode 7 GM 种子并通过 cocoapods 安装了最新的 Google Signin SDKpod Google SignIn 当我尝试将我的应用程序发布到苹果应用程序商店时 我收到附加错误 Help 以下是 Goog
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • iOS7 中“-webkit-overflow-scrolling: touch” 最初的屏幕外元素被破坏

    既然转基因种子已经发布了 我们现在可以谈谈了 看起来 iOS7 中的 webkit overflow scrolling touch 已损坏 最初不在屏幕上的元素的触摸事件不会触发 或者在某些情况下只是不可靠 这是一个例子
  • 在 iOS 上从 GPS 获取时间

    我正在开发一个跟踪器应用程序 该应用程序需要高精度地了解设备位置 即它使用位置服务并忽略水平精度低于 20 米的位置 CLLocation没有明确声明是否通过 GPS 确定 但是 如果水平精度为 20 米或更好 则可以认为它是来自 GPS
  • XCode 4.2.1 在 Lion 10.7.2 上启动时崩溃

    这周我买了大约 10 年来的第一台 Mac 是的 这是一台二手 Mac Pro 2x2GHz 双核 Xeon 2GB RAM 它全新安装了 Mac OS X Lion 10 7 2 我只安装了 OmniOutlner Pro Textmat

随机推荐

  • 在散景 vbar 工具提示中显示高度

    我想制作一些简单数据的条形图 例如像这样的 pandas 数据框 Cats 4 Dogs 3 Mice 27 我想要一个工具提示 当鼠标悬停在栏上时显示如下内容 Name Cats Count 4 对于条形图 这适用于 hover tool
  • 在 Java 中通过引用传递数组

    在Java中可以将数组作为参数传递吗 int 5 result 我想传递对数组的引用 因为我想更改调用函数中的数组 语法是什么 private void demo int array new int 5 System out println
  • 无法部署firebase功能

    Node js 命令提示符只是忽略此函数 而其他函数正在部署 我也没有收到任何错误 var database admin database var postsRef database ref posts postsRef on child
  • PyInstaller - FileNotFoundError:没有这样的文件或目录:“”

    我看过很多关于这个完全相同的错误代码的帖子 但有许多不同的答案 但我仍然无法解决我的问题 我的帖子与所有其他帖子的不同之处在于我得到以下内容 317 INFO Building PKG because PKG 00 toc is non e
  • 使用 pyodbc 从 Python 应用程序将值插入 Access 2003 数据库

    我过去经常检查 stackoverflow 并且总是能够找到我一直在寻找的东西 但我似乎无法让这个工作 所以我问我的第一个问题 我并不是一个真正的程序员 但我在工作中提到过Python 现在我有一个Python项目 实际上 我已经把一切都弄
  • Spring Security 与 Struts 的集成

    我正在尝试在一个简单的应用程序中将 spring security 与 struts1 2 使用 LDAP 集成 我有 applicationContext security xml
  • ASP.NET MVC 5 和 Web API 2 .NET 要求

    我的主机提供商仅支持 NET 4 是否可以在 NET 4 计算机中运行 MVC 5 和 Web API 2 简短回答 不 您需要 NET 4 5 仅当添加依赖项时 剃须刀 v3 0 ASP NET 网页 v3 0
  • iPhone 在个人热点模式下不发送网络广播/组播

    根据最近的实证研究结果以及网络上的各种帖子 在启用了个人热点的 iPhone 上运行的应用程序似乎无法将广播和 或多播发送到个人热点的网络上 任何人都可以阐明这个问题的原因吗 应用程序 我有一个用跨平台 C 代码构建的 IOS 应用程序 它
  • 将图像添加到 Facebook 分享

    我正在尝试通过以下方式将图像添加到页面共享https developers facebook com docs plugins share button https developers facebook com docs plugins
  • 用于恢复保存后更改的宏

    我在网上找到了一个旧脚本来关闭文档而不保存更改 然后重新打开文档 Sub RevertFile wkname ActiveWorkbook Path ActiveWorkbook Name ActiveWorkbook Close Save
  • SQL Server while循环联合所有[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在尝试
  • SQL Server 日期时间过滤查询

    我在 SQL Server 中有这样的查询 SELECT Order Date SUM Profit FROM sample dbo superstore WHERE Order Date BETWEEN 2012 06 21 00 00
  • 获取Weblogic服务器上部署的所有应用程序的列表

    使用以下代码 我可以连接到 weblogic 服务器 现在我想获取服务器上部署的所有应用程序的列表 命令提示符下的 listapplications 列出了应用程序 但是当我执行terpreter exec listapplications
  • CXF 客户端安全

    我正在创建 Java Soap Web 服务的客户端 但无法弄清楚如何正确传递密码 这是我的 硬编码 密码示例 Test public void exploratorySecurityTest String username user St
  • WebClient Unicode - 哪种 UTF8?

    当我创建 WebClient 来使用一些 RESTful xml 时 我可以通过两种方式指定 unicode 编码 WebClient wc new WebClient wc Encoding Encoding UTF8 wc Encodi
  • 使用 CloudFront 部署在 S3 上的 VueJS 应用程序“指定的密钥不存在”

    我已经使用 Route53 部署了带有 S3 和 CloudFront 的 VueJS 应用程序 看起来一切都很顺利 我可以访问该网站https my domain com 我可以导航到我使用 Vue 路由器设置的不同路线 但是 当我尝试访
  • 在 Ionic 2 中使用图像资源的正确方法

    Ionic 2 中图像资源的最佳实践是什么 我有一堆 SVG 想用作非系统图标 我发现了一些关于使用 Gulp 的旧技巧 但似乎 Ionic 团队已决定将 Rollup 作为首选构建工具 到目前为止还没有相关文档 有人告诉我只需将它们添加到
  • 有没有办法通过 QueryDSL 中的 Predicate API 急切地获取惰性关系?

    我正在使用QueryDslPredicateExecutor来自 Spring Data JPA 项目 我面临着急于获取惰性关系的需要 我知道我可以在 Repository 接口中使用本机 JPA QL 查询 甚至可以使用 Query DS
  • 如何使用恢复按钮进入上一个活动?

    我的应用程序工作正常 但我的目的是当我关闭应用程序然后再次运行它时 我的应用程序将在最后一个活动中打开 我希望当我再次打开时 主要活动会显示出来 如果我单击 恢复 则最后一个活动将打开 所以我有4个Activity called Main
  • 内存警告后在 iOS 上运行 OpenGL 崩溃

    我遇到了带有 OpenGL 组件的应用程序在 iPad 上崩溃的问题 该应用程序抛出内存警告并崩溃 但它似乎没有使用那么多内存 我错过了什么吗 该应用程序基于 Vuforia 增强现实系统 大量借鉴了 ImageTargets 示例 我需要