Resurs-cachning i python

I Pixel Wizard instansieras nya objekt relativt ofta under spelets gång, eldbollar och andra magier som spelaren skapar och projektiler som fiender skjuter iväg. Objekten skapas raskt men när grafik och ljud laddas märks en tydlig prestandaminskning. För att komma runt detta skrev jag ett mycket enkelt system för att cacha ljud och grafik:

"""Resource loader for images and sound"""

import pygame
import re

resource_dict = {}

def load(filename):
    if not filename in resource_dict:
        if re.match(".+\.wav", filename):
            r = pygame.mixer.Sound(filename)
        elif re.match(".+\.png", filename):
            r = pygame.image.load(filename)
        resource_dict[filename] = r
    return resource_dict[filename]

def clear():
    resource_dict = {}

Koden ovan utnyttjar pythons dictionary datatyp för att enkelt med väldigt få rader kod bygga ett caching system. resource_dict är en dictionary där en sökväg/filnamn används som nyckel och värdet är ett objekt som innehåller en referens till ett objekt för datat som filen innehåller.

load() kontrollerar ifall sökvägen filename är en nyckel i resource_dict, om den finns returneras objektet som är kopplat till nyckeln. Ifall den inte finns laddas datat från filen (en kontroll ifall det är en bild eller en ljudfil görs) och sökvägen läggs in i dictionaryn tillsammans med det nya objektet, efter detta returneras objektet.

clear() nyttjar pythons garbage collector och tar helt enkelt bort referensen till objektet, när alla andra referenser till objektet har tagits bort kommer det raderas automatiskt.

Detta system gör också att samma grafik inte laddas in flera gånger även om ett det finns 17 kopior av en fiende refererar grafiken (och ljuden) till ett och samma objekt.

Flera monster men ett grafikobjekt

Flera monster men ett grafikobjekt

Etiketter: , , ,

Kommentera

Fyll i dina uppgifter nedan eller klicka på en ikon för att logga in:

WordPress.com Logo

Du kommenterar med ditt WordPress.com-konto. Logga ut / Ändra )

Twitter-bild

Du kommenterar med ditt Twitter-konto. Logga ut / Ändra )

Facebook-foto

Du kommenterar med ditt Facebook-konto. Logga ut / Ändra )

Google+ photo

Du kommenterar med ditt Google+-konto. Logga ut / Ändra )

Ansluter till %s


%d bloggare gillar detta: