亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 pyglet.image 和 texture 這么重?

為什么 pyglet.image 和 texture 這么重?

慕桂英546537 2021-12-29 10:27:41
環境:蟒蛇: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 倍的內存優勢。


查看完整回答
反對 回復 2021-12-29
  • 1 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號