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

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

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

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

Вуаля!

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

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

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

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

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

Устаревшие функции уже давно вынесены в класс 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.

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

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

0.zip (111,8 КБ)

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

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

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

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

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

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

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

И так далее.

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

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

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

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

1 лайк

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

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

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

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

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