You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyOpenGL:如何释放不再使用的旧纹理与glGenLists显示列表?

如何释放PyOpenGL中的显示列表和纹理资源

嘿,这是个非常关键的问题——不少刚接触PyOpenGL的开发者都会踩这个坑,毕竟Python的自动垃圾回收容易让人误以为GPU资源也会跟着自动清理。

先给你明确结论:只把my_list或my_texture设为False/None完全不够!你只是清理了CPU里存储的ID变量,但GPU上的实际资源(显示列表的编译指令、纹理的像素数据等)还会一直占用显存,时间久了会导致内存泄漏,甚至拖垮程序性能。必须手动调用OpenGL的专用函数,明确告知GPU释放这些资源。

下面分两种资源具体说明:

1. 释放显示列表

你用glGenLists(1)生成了单个显示列表,对应的释放函数是glDeleteLists(),需要传入两个参数:

  • 要删除的显示列表的起始ID(也就是你存在my_list里的值)
  • 要删除的列表数量(这里是1)

示例代码:

# 当确定不再需要这个显示列表时
glDeleteLists(my_list, 1)
my_list = None  # 可选但推荐:把变量置空,避免后续误用到无效的ID

2. 释放纹理

用glGenTextures(1)生成的纹理,对应的释放函数是glDeleteTextures(),它接受一个纹理ID的序列(哪怕只有一个ID也要用列表/元组包裹)。

示例代码:

# 当纹理不再需要时
glDeleteTextures([my_texture])
my_texture = None  # 同样推荐置空,防止误用无效ID

额外提醒

  • 一定要确保你释放的ID是有效的(也就是之前通过glGenLists/glGenTextures生成的、还未被释放的ID),如果传入无效ID,OpenGL通常不会报错,但也不会做任何操作。
  • 如果你的程序会频繁创建和销毁这类资源(比如游戏中的动态场景、交互式可视化),及时释放尤为重要——显存是有限的,堆积的未释放资源会快速耗尽GPU内存,导致程序卡顿甚至崩溃。

内容的提问来源于stack exchange,提问作者matousc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:55:18