Java 编译显示列表会占用大量内存并冻结窗口

Java 编译显示列表会占用大量内存并冻结窗口,java,opengl,lwjgl,displaylist,Java,Opengl,Lwjgl,Displaylist,为了学习3D编程,我正在创建一个简单的Minecraft克隆。我从VBOs开始,但是因为所有的数据都是静态的,所以我切换到了显示列表 我有一个立方体每一面的显示列表,只渲染可见的面。显示列表是在游戏开始时为512*512*100的整个地图创建的 -->创建的显示列表:~3 000 000 当我启动程序时,我的电脑会变慢,然后停止更新屏幕。除了移动鼠标,我什么也做不了。我有另一个程序在倒计时,甚至倒计时也停止了。大多数时候我必须关掉电源。有一次,我的病毒扫描程序还报告我javaw.exe占用了4G

为了学习3D编程,我正在创建一个简单的Minecraft克隆。我从VBOs开始,但是因为所有的数据都是静态的,所以我切换到了显示列表

我有一个立方体每一面的显示列表,只渲染可见的面。显示列表是在游戏开始时为512*512*100的整个地图创建的

-->创建的显示列表:~3 000 000

当我启动程序时,我的电脑会变慢,然后停止更新屏幕。除了移动鼠标,我什么也做不了。我有另一个程序在倒计时,甚至倒计时也停止了。大多数时候我必须关掉电源。有一次,我的病毒扫描程序还报告我javaw.exe占用了4GB内存(8GB中)

我为块的每一侧创建一个显示列表,以便停止渲染看不到的一侧和块


我怎样才能解决这个问题?我应该把我的显示列表做大一点,以便每一块显示一个,还是每一块显示一个?

你是在每一帧重新创建显示列表吗?如果是的话,你会释放旧的吗?不确定我是否理解你的用例,但这听起来像是Flyweight设计模式可能会有所帮助。什么是显示列表?你想在一个列表中放置尽可能多的顶点,而不是30亿个显示列表。根本不需要从VBOs切换到显示列表。VBO适用于静态数据(另外还有一个好处,它们还允许动态数据)。显示列表仍不推荐使用。以任何标准衡量,每张脸都有一个单一的显示列表都是疯狂的。每个多维数据集面将有一个单独的draw调用,这将完全破坏性能(即使300万个数据列表不会使您的系统负担过重)。如果您想要在处理如此大量的数据时获得合理的性能,Ypu将需要非常先进的渲染技术。