- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 OpenGL 应用程序编写一个文本渲染器。大小、颜色、字体和抗锯齿可以在运行时调整(因此多个字体可以同时出现在屏幕上)。组合太多,无法为每个字符串和属性组合分配一个纹理。但是,在任何给定时间,屏幕上只会显示整个字符串数据库的一小部分。
这使我有机会为逐帧打印的字符串创建缓存。强制我在整个操作中只使用一个纹理,因为创建多个纹理的缓存会导致从缓存打印的每个不同字符串的纹理交换惩罚。
所以我面前有一个 2048x2048 纹理,我可以在其中放置任何适合的字符串,因为它们是应用程序出于缓存目的而请求的。我很快意识到跟踪二维空间中的可用空间并非易事。
我一直在寻找 Best Fit 和 Next fit 之类的东西,但它们似乎适合一维空间。
我如何在 OpenGL 中管理这个缓存纹理?
编辑:从那以后我了解到这是“2d 打包问题”的一个实例。
最佳答案
您遇到的是装箱问题。
首先是坏消息:它是 NP-hard,因此值得找到最佳解决方案。
我也为字体做了这样的纹理缓存。我没有缓存整个单词,只是缓存了字形图像。这让事情变得容易多了,因为你所有的图像都是大致方形的。一个简单的基于网格的方法来跟踪纹理内存效果非常好。
如果我得到的字形大于我的一个网格框,我只是使用强力搜索分配了两个或更多框(这种情况并不经常发生)。如果我没有找到任何合适的 block ,我只是从缓存中随机删除了一些字形以腾出可用空间。
这比将内容保存在最近使用过的缓存中要容易得多,而且性能几乎一样好。
顺便说一句——对于这样的缓存,你总是会浪费一些纹理内存。除非您的内存非常紧张,否则这应该不是问题。您应该使用小的纹理格式(8 位 alpha 适用于字体)。
此外:如果您将网格 block 设置为 8 像素的倍数,并且可以将抗锯齿降低到 4 位,则可以将字形动态压缩为压缩的 DXT 或 S3TC 格式之一。这样,浪费的纹理空间就不是问题了。
关于c - 如何在 OpenGL 中管理缓存纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/688287/
我是一名优秀的程序员,十分优秀!