workaround for %33 texture memory bug

原帖链接:http://www.cocos2d-iphone.org/forum/topic/29121

PS:

为什么要关心 NPOT 呢?

因为苹果的OpenGL驱动有一个bug,导致如果使用 POT 的纹理,则会产生额外33%的内存消耗。

So,

If you didn't know, when you create a texture, iOS will allocate 33% more memory, presumably to have enough room in case mipmaps are needed.
http://www.cocos2d-iphone.org/forum/topic/23887#post-129097 )

But it is worth noting that this bug is only present on POT (Power Of Two) textures ( Mipmapping is only supported on POT textures ).
So, in order to reduce memory, what you have to do is two create NPOT textures.

eg:
If you are using a 2048x2048 textures, convert it into a 2048x2047 textures (and you will save 33% memory).
In case you can't make it smaller, then make it bigger. eg:
If you have a 2048x1024 texture, create a 2048x1025 texture.

If you are using cocos2d v1.0, then you have to edit ccConfig.h with:

#define CC_TEXTURE_NPOT_SUPPORT 1

If you are using v1.1 or v2.0, then you are OK, since they already support NPOT textures by default.

Ways to know if you are using POT / NPOT textures:
A) Parse your PNG, GIF, BMP, JPEG files with file:

$ find . -name "*.png" -print0 | xargs -0 file

B) Run this line of code and see your debug console:

[[CCTextureCache sharedTextureCache] dumpCachedTextureInfo];

Further info:
https://devforums.apple.com/thread/113889?start=0&tstart=0

Important: NPOT textures can't have mipmaps, and also they only accept GL_CLAMP_TO_EDGE in GL_TEXTURE_WRAP_{S,T}

Important 2: PVRTC (2bpp and 4bpp) textures can't be converted to NPOT


内容概要:本文详细探讨了双馈风力发电机(DFIG)在Simulink环境下的建模方法及其在不同风速条件下的电流与电压波形特征。首先介绍了DFIG的基本原理,即定子直接接入电网,转子通过双向变流器连接电网的特点。接着阐述了Simulink模型的具体搭建步骤,包括风力机模型、传动系统模型、DFIG本体模型和变流器模型的建立。文中强调了变流器控制算法的重要性,特别是在应对风速变化时,通过实时调整转子侧的电压和电流,确保电流和电压波形的良好特性。此外,文章还讨论了模型中的关键技术和挑战,如转子电流环控制策略、低电压穿越性能、直流母线电压脉动等问题,并提供了具体的解决方案和技术细节。最终,通过对故障工况的仿真测试,验证了所建模型的有效性和优越性。 适用人群:从事风力发电研究的技术人员、高校相关专业师生、对电力电子控制系统感兴趣的工程技术人员。 使用场景及目标:适用于希望深入了解DFIG工作原理、掌握Simulink建模技能的研究人员;旨在帮助读者理解DFIG在不同风速条件下的动态响应机制,为优化风力发电系统的控制策略提供理论依据和技术支持。 其他说明:文章不仅提供了详细的理论解释,还附有大量Matlab/Simulink代码片段,便于读者进行实践操作。同时,针对一些常见问题给出了实用的调试技巧,有助于提高仿真的准确性和可靠性。
3D纹理内存绑定失败(3D texture memory bind fail)通常出现在使用3D纹理进行图形编程时,尤其是在使用OpenGL或DirectX等图形API时。这种错误通常意味着在尝试将纹理数据绑定到3D纹理对象时发生了问题。以下是一些可能的原因和解决方法: ### 可能的原因 1. **纹理大小不符合要求**:纹理的长、宽、高可能超出了硬件或API的限制。 2. **内存不足**:系统内存或显存不足,无法分配足够的空间给3D纹理。 3. **API调用顺序错误**:在绑定纹理之前没有正确初始化纹理对象或其他相关对象。 4. **数据类型不匹配**:纹理数据的格式与预期的格式不匹配。 5. **驱动程序问题**:显卡驱动程序可能存在问题,导致纹理绑定失败。 ### 解决方法 1. **检查纹理大小**:确保纹理的长、宽、高在硬件和API的支持范围内。 2. **检查内存使用情况**:确保系统内存和显存有足够的空间。 3. **验证API调用顺序**:确保在绑定纹理之前已经正确初始化了所有相关对象。 4. **验证数据类型**:确保纹理数据的格式与预期的格式一致。 5. **更新驱动程序**:确保显卡驱动程序是最新版本,并且没有已知的bug。 ### 示例代码(OpenGL) ```cpp GLuint textureID; glGenTextures(1, &textureID); glBindTexture(GL_TEXTURE_3D, textureID); // 设置纹理参数 glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 加载纹理数据 glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, width, height, depth, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); if (glGetError() != GL_NO_ERROR) { // 处理错误 std::cerr << "3D texture memory bind fail" << std::endl; } glBindTexture(GL_TEXTURE_3D, 0); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值