Blitzmax
Пятница, 17.05.2024, 11:54
Приветствую Вас Гость | RSS
 
Главная Утечка памяти. - ФорумРегистрацияВход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Главный » BlitzMax » Утечка памяти.
Утечка памяти.
AirWolFДата: Суббота, 24.10.2009, 16:29 | Сообщение # 1
Группа: Пользователи
Сообщений: 1
Статус: Offline
Занимаюсь созданием настраиваемой РПГ игры на БМаксе. Минидвиг, так сказать :). Но вот недавно увидел такое дело: утечка памяти из-за .png тайлов, которые перезагружаются при переходе с одной тайловой карты на другую. Это можно как нибудь обойти? Я знаю 2 способа - это менять формат и делать карту прозрачности через pixmap, или сделать менеждер ресурсов. Как делать и то и другое, не знаю, ввиду того, что никогда с такими вещами не работал и не сталкивался. Буду признателен если посоветуешь что лучше сделать и буду еще более признателен, если покажешь как это сделать smile
 
oxidДата: Суббота, 30.01.2010, 13:06 | Сообщение # 2
Группа: Администраторы
Сообщений: 3
Статус: Offline
Лучше через менеджер ресурсов.
Принцип:
Загружаешь картинки не через стандартную LoadImage, а через менеджер ресурсов. При первой загрузке сохраняешь картинку, а потом считываешь ее уже из памяти, а не с диска, увеличивая утечки.
Вот пример моего менеждера:
Code

Type TResources
  Global _images:TScriptVars = New TScriptVars
  Global _fonts:TScriptVars = New TScriptVars
  Global _loopSounds:TScriptVars = New TScriptVars
  Global _sounds:TScriptVars = New TScriptVars
  Global _pixmaps:TScriptVars = New TScriptVars
   
  rem
  bbdoc: Loads image
  about:
  С размерами картинок, не играемся - трудно учитывать. Вытягиваем их скейлом.
  Хендл надо задавать при загрузке. После загрузки не трогаем хендл в основном коде, чтобы не было смещений у остальных картинок.
  Не путать анимированные и полные картинки - не предусмотрено
  На внутренних пиксмапах не рисовать - используются общие пиксмап для экономии памяти
  endrem
  Function LoadImage:TImage( url:String, midhandle%=True, hx#=0, hy#=0, flags%=MASKEDIMAGE|FILTEREDIMAGE )
   ?Debug
   xAssert( FileSize(url) > 0, "File '"+url+"' is not exist!" )
   ?
   Local img:TImage'
   Local list:TList = _images.RetVars(url)
    
   'find identical image
   If list
    For Local m:TImage = EachIn list
     If imgCompareParams( m, midhandle, hx, hy, flags )
      img = m
      Exit  
     End If
    Next
   End If
    
   'load from pixmap
   If Not img
    Local pm:TImage = TImage( _images.RetVar(url) )
    If pm
     img = .LoadImage( pm.pixmaps[0], flags )
    End If
   End If
    
   'load from file
   If Not img
    img = .LoadImage( url, flags )
   End If

   'sets handles
   ?Debug
   Assert img
   ?
   If midhandle
    MidHandleImage(img)
   Else
    img.handle_x = hx
    img.handle_y = hy
   End If

   'add image to list
   _images.AddVar( url, img )
    
   If autoPoll Then PollSystem  
   Return img
  End Function
...
End Type

Точка перед именем функции ".LoadImage" вызывает оригинальную функцию.
Код придется доработать, так как в нем есть другие либы. По принципу действия там понятно. Например _images - это просто карта (TMap).
 
Форум » Главный » BlitzMax » Утечка памяти.
  • Страница 1 из 1
  • 1
Поиск:

Copyright Oxid © 2024
Сайт создан в системе uCoz