Belegt draw.replace memory ?

Fragen zur Bedienung und Funktionsweise des CHDKs
Forumsregeln
Überprüfe folgende Dinge:
Bist stets der Dokumentation gefolgt?
Hast du im Forum schon nach ähnlichen Problemen gesucht?
Hast du bei deiner Frage das Problem umfassend beschrieben?
Welche Kamera und CHDK-Version betrifft das Problem?

Probleme mit einem Skript sollten möglichst und wenn vorhanden in dem zugehörigen Thema zum Skript besprochen werden.

Belegt draw.replace memory ?

Beitragvon gominu404 » 04.04.2016, 16:11

An die Spezialisten.

Ein Lua-Code, bei dem ein Rechteck mittels "draw.add" angelegt wird und mittels "draw.replace" in einer Loop veraendert wird, fuehrt bei mehrmaligem Aufruf von "draw.replace" zu einem Abbruch durch " not enough memory" . Im Beispiel werden nur die Farben geaendert.

Code: Alles auswählen
nn=100
c1=259
c2=265
r1=draw.add("rectf", 120,120,200,200,c1,c2,10)

sleep(500)
for i=1,nn do
   draw.replace(r1,"rectf", 120,120,200,200,c2,c1,10)
   --draw.overdraw()
    draw.redraw()
   sleep(300)
   draw.replace(r1,"rectf", 120,120,200,200,c1,c2,10)
   --draw.overdraw()
   draw.redraw()
   sleep(300)
end


Wenn ich diesen Code an das bekannte script "drawtest.lua" anfuege dann wird nn=50 ausgefuehrt, 100 stopt mit " not enough memory".

Gruss
Reinhard

Kamera: SX220HS 101b
CHDK: 1.5.0 4309
gominu404
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 25.07.2011, 08:58
Kamera(s): A620
IXUS 160

Re: Belegt draw.replace memory ?

Beitragvon msl » 04.04.2016, 22:12

Hallo,

ein Lua-Skript (auch uBASIC) benötigt Platz im Arbeitsspeicher. Normalerweise wird der benötigte Platz von Lua selbst verwaltet. D.h., nicht mehr benötigter Speicher wird in einem bestimmten Zyklus wieder freigegeben. Ist aber vor dieser Freigabe nicht mehr genügend Speicherplatz verfügbar, kommt es zur Fehlermeldung "not enough memory".

Das hat zwei Gründe. 1. Die SX220 kann nur sehr wenig Arbeitsspeicher zur Verfügung stellen. 2. Die verwendete Lua-Routine benötigt sehr viel Speicher.

Den zweiten Punkt kann man optimieren, indem man auf die Draw-Bibliothek verzichtet. Diese basiert auf sehr vielen Tables, welche einen sehr hohen Speicherbedarf haben.
Syntax: [ Download ] [ Verstecken ]
Benutze Lua Syntax Highlighting
--[[
@title Test
@chdk_version 1.3
]]


nn=100
c1=259
c2=265

sleep(500)
for i=1,nn do
   draw_rect_filled(120,120,200,200,c2,c1,10)
   sleep(300)
   draw_rect_filled(120,120,200,200,c1,c2,10)
   sleep(300)
end
Erstellt in 0.006 Sekunden, mit GeSHi 1.0.8.9
Die Draw-Bibliothek eignet sich mehr für Aufgaben, bei denen Objekte mehrfach verändert dargestellt werden sollen. Die Anzahl der Objekte und Veränderungen ist aber je nach Speicherangebot limitiert. Für einfache Aufgaben wie den Farbwechsel im Beispiel sind die normalen Draw-Funktionen besser geeignet.

Gruß msl
Benutzeravatar
msl
Super-Mod
Super-Mod
 
Beiträge: 4567
Bilder: 271
Registriert: 22.02.2008, 11:47
Wohnort: Leipzig
Kamera(s): A720 1.00c
SX220 1.01a

Re: Belegt draw.replace memory ?

Beitragvon gominu404 » 05.04.2016, 09:27

Danke fuer den Tip,

mir war nicht bewusst, dass der wiederholte Aufruf von draw.add bzw draw.replace jedes mal memory schluckt.

Zu Beginn des scripts ( nach dem Initialisieren einiger Variablen) steht laut meminfo (free_size) 280824 Byte zur Verfuegung.
Danach werden etliche Rechtecke mit draw.add etc gezeichnet und vor dem gezeigten Code sind es nur noch 22104, so werden wohl ueber 200 kB in internen Tabellen verbraten.
Auch nach dem Aufruf von draw.clear aendert sich an free_size nichts.
table.getn(SCREEN_DRAWINGS) liefert immer noch die Anzahl der ehemals angelegten Objekte, obwohl alle
Objekte geloescht werden. Es wird wohl nur der Wert "nil" eingetragen.



Gruss und Dank
Reinhard
gominu404
CHDK-Einsteiger
CHDK-Einsteiger
 
Beiträge: 8
Registriert: 25.07.2011, 08:58
Kamera(s): A620
IXUS 160


Zurück zu Probleme

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron