OpenGL стандартный модуль


#41

Нет, будут оба класса.

Класс A добавит потому что есть поле с его типом. Поле добавляет всегда, и оно обязательно должно потянуть за собой свой тип.


#42

Это просто решается. Сделайте поле типа Object и скрытым. Тогда не добавит. А в функции преобразуйте его к A.

Вуаля!


#43

А, прекрасно, то есть вы предлагаете в функциях, многие из которых будут вызываться десятки тысяч раз на 1 кадр - проводить не только проверку на nil, но ещё и преобразование типов, которое в .Net кучу всего за собой тянет.


#44

А вы проверьте скорость прежде чем говорить. Для тех, которые вызываются десятки тысяч раз, можно истинный тип писать.

Еще раз повторю, если для прорисовки кадра используются все классы, то моё предложение бесполезно


#45

Какие функции будут вызываться больше всего - невозможно предугадать. Это зависит от того, что рисуют.

Не все, но обычно в нормальных программах будет использоваться хотя бы большинство не_устаревших функций ядра.

Устаревшие функции уже давно вынесены в класс glD, они мешаться не будут.


type
  t1 = sealed class
    
    public o1: procedure;
    public procedure p1;
    begin
      o1;
    end;
    
    public o2: object;
    public procedure p2;
    type dt = procedure;
    begin
      if o2=nil then
      begin
        var p: dt := ()->exit();
        o2 := p;
      end else
        dt(o2)();
    end;
    
  end;
  
begin
  var a := new t1;
  a.o1 := ()->exit();
  
  var lc1 := 1000;
  var lc2 := 1000000;
  
  var sw1 := new System.Diagnostics.Stopwatch;
  var sw2 := new System.Diagnostics.Stopwatch;
  
  for var i := 1 to lc1 do
  begin
    
    sw1.Start;
    loop lc2 do a.p1;
    sw1.Stop;
    
    sw2.Start;
    loop lc2 do a.p2;
    sw2.Stop;
    
    Console.Title := (i/lc1).ToString('P');
  end;
  
  Writeln(sw1.Elapsed);
  Writeln(sw2.Elapsed);
  Readln;
end.

Однако результаты таки близки, хотя второй всегда немного медленнее.

Сейчас ещё попробую сколько будут весить поля без всей остальной начинки.


#46

0.zip (111,8 КБ)

Если оставить только поля, без инициализаторов и их использования - компилируется в 300КБ, то есть треть от всего размера.

Примите во внимание что само содержимое того примера тоже что то весило, поэтому с тем примером размер будет ещё больше. Ну и там использовалось куча других типов-записей, многие из которых весят не мало.


#47

300 кб - это уже сильно лучше воспринимается чем 1 Мб.

Это я советую, как улучшить - воспринимайте мои посты так. Мы работаем над улучшением. Но вы - автор.

Еще одна идея. Не инициализировать все поля. А сделать специальные функции-инициализаторы, которые инициализировали бы нужные поля по возможности.

Например, сделать функцию, которая инициализировала бы основное - это скажем 200 кб.

Следующая инициализирует базовые возможности - это еще 300 Кб.

И так далее.

Если пойти по этому пути, то стоит провести кластерный анализ, разбив функции на такие группы как-то автоматически.


#48

Я перебрал ещё несколько вариантов, но во всех требовалось чем то жертвовать. И уже решил сам разобраться как добавить такой атрибут но тут… Вижу это:

И очень уж напоминает что я просил. Только, @ibond, применение к классам? Это получается при применении к классу - все не нужные поля выкидываются?

Может всё же лучше применять к полям напрямую?


#49

Однако, теперь размер .exe уменьшился до 200КБ.

Ну, что теперь видно - в .exe добавляет все эти операторы:

function operator*(m1: Mtr2x2f; m2: Mtr2x3f): Mtr2x3f; extensionmethod;

Хоть они и не использованы нигде в готовой программе. И за собой они тянут кучу типов матриц и векторов.

Если убрать эти операторы - размер .exe падает до 75КБ, что уже вполне приемлемо. Но модулю они нужны, так что удалять их надо тоже на уровне компилятора.