从记忆中找到和删除隐藏纹理的最佳方法
Best way to find and remove hidden textures from memory
我需要找到一种方法来跟踪绘制加载纹理的位置。当一些加载的纹理被覆盖时,我必须从内存中删除它们。
我有一个远程用户界面(RUI)服务器,它给我发送了很多小图像,这些图像被组装起来,然后显示在RUI客户端的屏幕上。在这种情况下,我不知道哪些纹理在其他纹理后面,所以我无法删除它们。此外,覆盖必须完成(后面的纹理必须完全隐藏)。是否有任何有效的方法来实现这种跟踪和删除?
我的用例是这样的:我有一个按钮图像存储在服务器上的菜单。整个屏幕是由片段(按钮、滚动条、动画等)组成的。例如,当我点击一个按钮时,服务器发送给我存储在其存储中的多个图片缩略图,我将它们显示在屏幕的右半部分。在其他按钮点击,歌曲,视频,电子书或其他东西的列表显示。我需要从记忆中删除图片缩略图的纹理,然后显示歌曲列表,例如。通过这种方式,覆盖将消失,并且我的内存使用将大大减少。
我的openGL ES 2.0是在Android平台上实现的,整个工作都是在JNI层完成的。没有复杂的绘图,只需解码png图像,转换为纹理,并显示基本纹理。
您可以通过引用计数来跟踪相同的图像被使用了多少次。当一个实例完全被遮挡或离开屏幕时,你减少引用计数,并删除所有0引用的纹理。
引用计数可以像std::map<Texture, int>
一样简单。
你的遮挡检查可能只是一个O(n^2) AABB交叉/包容测试和一个额外的O(n)测试针对屏幕的AABB。如果这对您来说不够快,请尝试更好的数据结构,如四叉树或空间散列。
根据你的应用程序是如何设置的,你也可以用一种智能指针来跟踪你的纹理实例,并找出你所有的隐藏视图何时被删除。
话虽这么说,这可能是浪费时间,除非你实际上受到设备上的VRAM数量的限制或接近它。
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 结构和双指针隐藏在其他结构中,多层混淆
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 使用 CUDA 和纹理进行图像减法
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何等待窗口隐藏在Qt中?
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 如何使用类型别名从模板化类中隐藏模板列表
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 从记忆中找到和删除隐藏纹理的最佳方法