- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在测试我的 iOS 游戏,发现它占用的内存量与它认为应该占用的内存量之间存在差异。最终,我将问题缩小到纹理占用的内存比我认为应该占用的多 33%。
例如,我认为 256x256 未压缩的 32 位纹理应该占用 256*256*4 字节 = 256k。但是,当分配 256x256 纹理时,我会注意到应用程序的内存增加了 340k。就好像设备分配了足够的内存来存储纹理及其所有 mipmap,但我没有使用 mip map 或以任何方式请求空间。
这个额外的内存很突出,因为它只会在某些设备上发生。在 iPod Touch 4 上测试游戏时,我注意到额外的内存。但是,在 iPhone 3GS、iPod 3G 或 iPad 1 上没有出现此问题。
设备上的操作系统版本为:
iPod 3G - iOS 3.1.2 (7D11)iPhone 3GS - iOS 4.3.5 (8L1)iPod 4 - iOS 4.2.1 (8C148)iPad - iOS 4.3 (8F190)
编辑
这里有更多信息。我像这样测量应用程序的内存
int PlatformIOS::GetProcessMemUsage()
{
task_basic_info info;
mach_msg_type_number_t size = sizeof( info );
kern_return_t kerr = task_info( mach_task_self(), TASK_BASIC_INFO, (task_info_t)&info, &size );
if ( kerr == KERN_SUCCESS )
return info.resident_size;
return 0;
}
这将返回您将在 Real Mem 的 Insturments 程序中看到的相同值。它实际上非常有用。
这是我分配纹理的方式:
bool GL3DTextureDataPiece::CreateTextureSurface(X3DInterfaceImpl *theInterface, int theWidth, int theHeight, PixelFormat theFormat, RefCount *thePalette, bool generateMipMap)
{
glGenTextures(1,&mTexture);
theInterface->SetCurTexture(this);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,mLinearFilter?GL_LINEAR:GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, theWidth, theHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
return true;
}
这些都是非常基本的东西。唯一让我首先发现内存问题的是不同设备之间的差异。事实上,正是应用总内存和资源内存(我自己跟踪图像和声音内存)之间的差异,才让我进行了调查以找到这个错误。
最佳答案
我已经找到了解决方法,所以我将回答我自己的问题。但我想我会发布这个,因为它似乎是需要注意的重要信息。
其他人发现了这个错误。例如,请参见此处:
http://www.cocos2d-iphone.org/forum/topic/29121
好消息是该错误有一个解决方法。解决方法是仅使用非 2 次幂 (npot) 纹理。 NPOT 纹理不能被 mip 映射,因此 iOS 不会尝试分配额外的 mip 映射内存(至少这是它起作用的理论。)
幸运的是,这在我的引擎中很容易做到,因为它已经在必要时将图像划分为多个纹理,只是为了适应 2 次幂纹理而不使用太多内存。所以,我只是调整了我的代码,不分割图像以适应 2 次幂纹理,并进一步强制任何在两个维度上恰好是 2 次幂的图像加载到大于 1 像素的纹理中必要的宽度。因此,例如,我会将 256x256 的图像放入 257x256 的纹理中。
这消除了 33% 的额外内存增长。
请注意,iPod 3G 等较旧的设备无法处理 npot 纹理,因此在进行此修复之前检查其是否可行非常重要。要检查这一点,您可以查询 GL_APPLE_texture_2D_limited_npot 扩展。另外,在添加这个额外的像素以强制纹理为 npot 时,请注意不要超过最大纹理大小。
关于iOS 纹理占用 33% 额外内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9438009/
我配置了我的RouteInitializer如下: class AppRouteInitializer implements RouteInitializer { init(Router rout
我正在尝试从 Android 应用程序发送短信。我正在使用 PendingIntent 以便我可以使用 Broadcast Receiver 检查它是否发送正常。由于 sendTextMessage
目录 简介 1 "额外"字段是什么 1.1 "额外"是指与业务无关 1.2 产生
应用程序读取 JSON 数据。然后它会将其放入 ListView (正确),但在按下某个项目后,我总是会得到显示的相同值。下面的代码我认为是问题所在,但我找不到。 try{ JSONArray
我正在使用以下代码 (Kotlin) 创建通知 val builder = NotificationCompat.Builder(ctx) ........ .set
我有一个问题。现在我正在使用 3 个面板,mainPanel 和其他 2 个面板(btnPanel 和 iconPanel)。所以问题是当我按下“重置”按钮时,我删除了 iconPanel 并再次添加
这是我的 html: Settings Export Import 和CSS: span.button { float:right; margin-righ
我正在尝试将一个结构编码为 JSON,然后将其插入我的 Mongo 数据库,但不断出现此错误:%!(EXTRA main.Test={575590180 Me})。我究竟做错了什么?我完全从我从事的另
嘿,我遇到了这些 latex 格式问题,有人可以提供一些帮助吗? .tex 文件: \begin{table}{} \renewcommand{\arraystretch}{1.1} \c
我在 FragmentPagerAdapter 中使用了 Fragment 的 ArrayList。 我想在 saveState() 中保存此 ArrayList 的状态,并在 restoreStat
我做了this MapKit-教程 一切正常,但如何为我的 pin 添加额外的属性? 这是我的课车: import Foundation import MapKit class Car: NSObje
关于 Android intent 将提供的附加功能有哪些文档? 更新: 我做了一些进一步的调查。我知道我们可以假设每个 Intent 都不会解析任何数据或额外内容,除非有明确记录。此外,一些(但不是
我在 python3.4.3 上使用 SqlAlchemy 来管理 MySQL 数据库。我正在创建一个表: from datetime import datetime from sqlalchemy
我正在使用 bootstrap 创建网页。我在两个 block (内容和标题)上派生了正文。在内容 block 中,我有 div 类 .container .sameTable 在里面我有 div 类
我在Windows 7上的MinGW和MSYS下使用gfortran构建了一些fortran程序。但是当我在未安装MinGW和MSYS的其他计算机上运行它们时,系统总是要求一些dll,例如libgfo
第一个元素的右侧似乎有额外的间距,我不知道它是从哪里来的。有人可以帮助我吗? 这是我使用的代码: http://jsfiddle.net/srabeat/tenx4y1c/1/ for (i = 0;
我使用 fs-extra 收到以下错误: ERROR { [Error: EPERM: operation not permitted, unlink 'C:\Projects\xxx\branche
我正在尝试在 CBC 模式下使用 AES-128 加密 320 字节的二进制数据,并将密码存储到一个文件中。输出文件应该是 320 字节,但我得到了 336 字节。这是我的代码: #include
我有一个特定的要求,我必须从我的 Activity 中触发浏览器上的 url。我可以使用以下代码执行此操作: Intent browserIntent = new Intent( Intent.A
我正在使用 JMS DI 注入(inject)带有注解的服务: use JMS\DiExtraBundle\Annotation as DI; /** * @DI\Service("foo.bar.
我是一名优秀的程序员,十分优秀!