1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

Непонятно куда расходуется память

Тема в разделе "MAXScript", создана пользователем Александр Якушев, 15 июн 2015.

Модераторы: Savin Denis
  1. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    Вот небольшой пример:
    Код:
    asd = #()
    
    for i = 1 to 1000 do( ts = Sphere radius:100; ts.material = Standardmaterial name:(uniquename "st_"); append asd ts;)
    
    fn quickAttche arr = (
        numArr = arr.count
        arNewObj = #()
        if numArr > 1 then(
            for i = 1 to numArr by 2 do(
                if arr[i+1] != undefined then (
                    meshop.attach (converttomesh arr[i]) (converttomesh arr[i+1]) attachMat:#IDToMat condenseMat:true
                   
                    gc()
                    clearUndoBuffer()
                   
                    append arNewObj arr[i]
                    ) else append arNewObj (converttomesh arr[i])
                )
            quickAttche arNewObj
            )else return arr[1]
        )
       
    newObj = quickAttche asd
    delete newObj
    gc() 
    
    После выполения несколько десятков мегабайт ОЗУ куда-то резервируется. Итак, если несоклько сотен - тысяч операций, то память просто исчезает вникуда.
    Обратно не возвращается даже после reset максовского файла.
    Подскажите, пожалуйста, куда может расходоваться память ???

    Никакие gc() не помогают. Хотя, если тоже делать вручную, то gc() прекрасно все сбрасывает.
     
  2. Александр Якушев

    Александр Якушев Активный участник

    С нами с:
    13.08.2009
    Сообщения:
    77
    Симпатии:
    1
    Баллы:
    7
    Еще пример. Прилагается максовский файл для теста.
    После применения скрипта (аттачит всю геометрию, затем удаляет полученный объект и пытается сбросить память):
    Код:
    (
    disableSceneRedraw() -- thanks U.S.S. Speed!
    displayColor.shaded = #object
    asd = geometry as array
    converttoMesh asd -- make unique
    
    
    fn quickAttcheMesh arr = (
        numArr = arr.count
        arNewObj = #()
        if numArr > 1 then(
            for i = 1 to numArr by 2 do(
                if arr[i+1] != undefined then (
                        meshop.attach arr[i] arr[i+1] attachMat:#IDToMat condenseMat:true
                        append arNewObj arr[i]
                        ) else append arNewObj arr[i]
                )
                    gc()
                    freescenebitmaps()
                    clearUndoBuffer()
            quickAttcheMesh arNewObj
            )else return arr[1]
        )
    newObj = quickAttcheMesh asd
    delete newObj
    newObj = undefined
    gc()
    freescenebitmaps()
    clearUndoBuffer()    
    enableSceneRedraw()
    completeRedraw()
    )
    В диспетчере задач наблюдается такая картина:

    2015-06-16 14-54-49 Диспетчер задач Windows.png

    Кто сталкивался, подскажите, пожалуйста, куда девается память?????
    Ведь сцена пустая!!!
     

    Вложения:

    • test_2014.rar
      Размер файла:
      1,4 МБ
      Просмотров:
      31
    Последнее редактирование: 16 июн 2015
  3. Фигли

    Фигли Пользователь сайта

    С нами с:
    20.01.2012
    Сообщения:
    23
    Симпатии:
    0
    Баллы:
    2
    Функции по идее должны быть всегда в самом начале, вне скрипта, вне циклов, вне скобок.
     
Модераторы: Savin Denis

Поделиться этой страницей