Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能快速地画出许多线_Java_Opengl_Jogl - Fatal编程技术网

Java 我怎样才能快速地画出许多线

Java 我怎样才能快速地画出许多线,java,opengl,jogl,Java,Opengl,Jogl,我正在为我的应用程序使用JOGL(OpenGL for Java),我需要一次在屏幕上绘制成吨的字符串,而我当前的解决方案太慢了。现在我正在使用TextRenderer使用draw3D方法绘制字符串,即使是中等数量的字符串(大约300-500),它也会杀死FPS。我开始在对象纹理上绘制文本,这要快得多,但也有一些问题。首先,分配所有这些纹理需要大量内存。第二,我需要找到一种方法来调整纹理的大小,使其仅与字符串一样大,然后将其映射到对象而不拉伸。存在的问题是,所有这数千个框都使用一个模型,该模型通

我正在为我的应用程序使用JOGL(OpenGL for Java),我需要一次在屏幕上绘制成吨的字符串,而我当前的解决方案太慢了。现在我正在使用TextRenderer使用draw3D方法绘制字符串,即使是中等数量的字符串(大约300-500),它也会杀死FPS。我开始在对象纹理上绘制文本,这要快得多,但也有一些问题。首先,分配所有这些纹理需要大量内存。第二,我需要找到一种方法来调整纹理的大小,使其仅与字符串一样大,然后将其映射到对象而不拉伸。存在的问题是,所有这数千个框都使用一个模型,该模型通过调用列表呈现。我不确定在这种情况下是否可以更改每个对象的纹理贴图

我不介意文本是平面的还是三维的,它只需要定位在三维空间中。我更愿意在不牺牲太多速度的情况下以尽可能高的质量呈现文本,因为文本的可读性是应用程序最重要的部分。而且,几乎所有的字符串都不同,没有太多重复的字符串


所以,我的问题是:我在纹理上绘制字符串的方法是否正确?如果是,我如何克服这两个问题?或者有其他方法可以满足我的需要吗?

这取决于TextRenderer的具体工作方式-您可以使用显示列表批量处理文本绘图命令

如果TextRenderer通过拥有单个字符字形的纹理并一次拼凑一个字符串和一个字形来工作:那就好了。只需使用和来结束文本绘图代码。一旦定义了列表,就可以使用它

但是,如果TextRenderer通过将完整的字符串绘制到纹理中并对每个字符串使用一个四元组来工作,则显示列表可能无法工作。如果一个批处理中的字符串不都适合TextRenderer的缓存,它将删除最近使用最少的字符串以回收一些空间。显示列表只会重新创建所做的OpenGL调用,因此TextRenderer更新字符串缓存纹理所做的工作将丢失,并且您将获得不正确的输出。通过对源代码的快速扫描,我怀疑TextRenderer是以这种方式工作的

总而言之:显示列表将大大加快渲染速度,但只有在定义显示列表后不溢出TextRenderer的字符串缓存纹理且不使用TextRenderer时,显示列表才会加快渲染速度


如果你不能满足这些限制,你将不得不去一点硬核,并编写自己的文本渲染器,渲染一个接一个的字形-然后它将是微不足道的缓存输出几何体和极快地重新渲染。有这样一个系统的例子,使用工具创建字体。它使用LWJGL而不是JOGL,但如果您想将其集成,则两者之间的转换将是您最不担心的问题-它与纹理管理等相结合。

相关:这看起来很有希望,但我想知道为什么TextRenderer本身不使用显示列表。另外,是否可以通过使用Java2D的文本/字形渲染功能来简化此过程?TextRenderer无法对代码做出任何假设:您将渲染多少字符串,如果这些字符串在帧之间发生变化,等等,所以它不知道定义显示列表是否值得。TextRenderer已经使用了Java2D文本呈现-这就是它所做的