環境:蟒蛇:3.6.6pyglet:1.3.2這是我的代碼和結果:import pygletimages = []textures = []with_textures = Truecount = 10for x in range(count): image = pyglet.image.load("big.png") # 2.1 Mb source 2400*2400px images.append(image) if with_textures: texture_grid = pyglet.image.ImageGrid(image, 10, 10).get_texture_sequence() textures.append(texture_grid)# RES in htop result without textures# count = 10 - 300Mb# count = 20 - 553Mb# count = 30 - 753Mb# count = 40 - 973Mb# ~23Mb just for each Image# RES in htop result with textures# count = 10 - 996Mb# count = 20 - 1878Mb# count = 30 - 2716Mb# count = 40 - 3597Mb# ~86Mb for Image and prepared gridinput("Press enter to exit")問題:為什么每個 2.1Mb 文件會導致 pyglet.image.AbstractImage 使用23Mb內存?如果ImageGrid用于創建精靈表 -> 它會導致額外的 ~60Mb如何處理?因為如果游戲包含 50 多個大型精靈,那么將如此多的內存僅用于紋理是不現實的。也許在創建使用精靈的游戲時還有其他一些方法?或者我應該為客戶端更改我的堆棧技術(pyglet 作為主庫,也嘗試使用 pygame)?PS:我第一次從pygameto重寫我的應用程序pyglet,因為我沒有考慮事件循環的某些方面pygame,現在我還沒有pyglet為我的用例測試庫的資源使用情況。
1 回答

叮當貓咪
TA貢獻1776條經驗 獲得超12個贊
#1 的答案很簡單:PNG 是一種壓縮格式。2400×2400的圖片解包后只需要在RAM中占用2400×2400×32bit = 23040000字節,即使它的磁盤大小是2 MB。
處理這個問題的可能方法有很多,但所有這些都歸結為在內存要求、圖像質量和訪問速度之間找到合適的權衡。
例如,在 Pyglet 中有一個名為CompressedImageData的類,它允許您在使用 OpenGL 進行渲染時使用 GPU 內置紋理壓縮。如果沒有,您可能會堅持在軟件中實現其中一種方法,因為 PNG 壓縮通常不適合快速像素訪問。在這里您可以找到有關 GPU 紋理壓縮的更多信息。
作為一種快速而骯臟的解決方法,您可以嘗試將圖像中的顏色數量減少到 ≤ 256 并使用調色板。這將立即提供 4 倍的內存優勢。
添加回答
舉報
0/150
提交
取消