Podczas kopiowania zmiennej TBitmap ulega kasacji zawartość zmiennej źródłowej.

0

Otóż w kodzie nie mam żadnego kodu, który by ingerował w źródło kopiowania.
kopiuje to kodem:

   b := textures[i];  //b:TBitmap
    r1 := rect(0, 0, b.Width, b.Height);
    r2 := Rect(ix*x,iy*y,ix*x+ix,iy*y+iy);
      bmp.Canvas.CopyRect(r2,b.Canvas,r1);
 

Textures[i] jest usuwane, ale nie przy pierwszym przejściu pętli (bo całość pracuje w pętli), nie drugim, a np,: w 100, 150, itp.
Zależy od przypadku.
Próbowałem przenosić za pomocą "assign" i ":=", lecz efekt taki sam.

Cały kod źródłowy procedury w załączniku (sorki, że nie sformatowany).

Procedura "loading" to ładowanie zmiennych bitmap z plików na tablicę.
Nie chcę tego powtarzać 100 razy na sekundę.
Zamieniłem także bitmapy na komponenty wirtualne TImage, lecz było to samo.
Nie przeczę,że robię jakiś banalny błąd.
Proszę o pomoc.

PS Kod źródłowy (ten sformatowany) nie był jeszcze optymalizowany i oczyszczany ze zbędnych komentarzy.

2

Przypisanie kopiuje ci tylko referencje czyli zmienna b będzie tak naprawdę textures[i] jeśli namażesz coś na b albo zwolnisz b to zwolniona zostanie też textures[i]. To tylko tak na marginesie bo i tak nie zwalniasz nigdy b... w zasadzie to nigdy nic nie zwalniasz -,-'
Problemem głównym jest tu raczej brak synchronizacji wątków. Nie możesz jednocześnie korzystać z tego samego komponentu w wątku głównym i pobocznym. Bitmapa ma co prawda wewnętrznie porobione sekcje krytyczne, ale teraz niestety nie mam ochoty się w to zagłębiać. Poczytaj na temat Synchronize. Jeśli odwołujesz się do komponentów z wątku pobocznego to prosisz się o kłopoty (oczywiście nie zawsze, ale jest to bardzo prawdopodobne) więc albo dogłębnie musisz analizować źródła VCL, albo profilaktycznie wrzucać każde takie odwołanie do Synchronize.
Wątki mogą wydawać się proste na początku, ale jest z nimi związane bardzo wiele problemów, które nie zawsze wychodzą od razu.

0

Ze znikaniem sobie poradziłem:

 
    r1 := rect(0, 0, textures[i].Width, textures[i].Height);
    r2 := Rect(ix*x,iy*y,ix*x+ix,iy*y+iy);
      bmp.Canvas.CopyRect(r2,textures[i].Canvas,r1);

Zanikanie następuje rzadko, ale raz na 100 "fps-ów" (min 1s odstępu - praktycznie 2-3 - wcześniej było 22000 razy/s, ale to było grzejące dysk twady w moim laptopie i dlatego zmieniłem na zmienne) mogę sobie pozwoloć na załadowanie z dysku.
Co do

synchronize 

to niegdy tego nie używałem. Muszę o tym poczytać
od podstaw.
Dzięki za pomoc i wskazówki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1