从记忆中找到和删除隐藏纹理的最佳方法

Best way to find and remove hidden textures from memory

本文关键字:纹理 隐藏 最佳 方法 删除 记忆      更新时间:2023-10-16

我需要找到一种方法来跟踪绘制加载纹理的位置。当一些加载的纹理被覆盖时,我必须从内存中删除它们。

我有一个远程用户界面(RUI)服务器,它给我发送了很多小图像,这些图像被组装起来,然后显示在RUI客户端的屏幕上。在这种情况下,我不知道哪些纹理在其他纹理后面,所以我无法删除它们。此外,覆盖必须完成(后面的纹理必须完全隐藏)。是否有任何有效的方法来实现这种跟踪和删除?

我的用例是这样的:我有一个按钮图像存储在服务器上的菜单。整个屏幕是由片段(按钮、滚动条、动画等)组成的。例如,当我点击一个按钮时,服务器发送给我存储在其存储中的多个图片缩略图,我将它们显示在屏幕的右半部分。在其他按钮点击,歌曲,视频,电子书或其他东西的列表显示。我需要从记忆中删除图片缩略图的纹理,然后显示歌曲列表,例如。通过这种方式,覆盖将消失,并且我的内存使用将大大减少。

我的openGL ES 2.0是在Android平台上实现的,整个工作都是在JNI层完成的。没有复杂的绘图,只需解码png图像,转换为纹理,并显示基本纹理。

您可以通过引用计数来跟踪相同的图像被使用了多少次。当一个实例完全被遮挡或离开屏幕时,你减少引用计数,并删除所有0引用的纹理。

引用计数可以像std::map<Texture, int>一样简单。

你的遮挡检查可能只是一个O(n^2) AABB交叉/包容测试和一个额外的O(n)测试针对屏幕的AABB。如果这对您来说不够快,请尝试更好的数据结构,如四叉树或空间散列。

根据你的应用程序是如何设置的,你也可以用一种智能指针来跟踪你的纹理实例,并找出你所有的隐藏视图何时被删除。

话虽这么说,这可能是浪费时间,除非你实际上受到设备上的VRAM数量的限制或接近它。

从磁盘或网络位置加载/卸载映像将比仅将其保存在VRAM中要慢几个数量级,如果您有可用的话。