iskander писал(а):Но имхо "шустро" с использованием Variant не будет.
Да, верно. Тестил тут. Если использовать в нескольких операциях +-* variant вместо double, производительность падает где-то 5-6 раз(возможно будет и больше). Если на входе в процедуру присваивать локальным простым переменным(double) данные из варианта, выполнять операции, и на выходе присваивать варианту получившиеся значения производительность падает "только"
 в 2 раза.
 в 2 раза.Пока не вышел релиз 3.2 буду делать через варианты, оптимизация - потом. Главное концепцию отработать.
 
 iskander писал(а):Если непременно нужно, чтобы Data: Variant торчал наружу, то может быть так?
Ну почему "неприменно". Просто это универсальный вариант.
Вообще общая картина видится как-то так:
- Код: Выделить всё
- TECSElement = record
 Name: string;
 Data: Variant; // ?????
 end;
 TECSComponent = class
 ...
 Name: string;
 Elements: array of TECSElement;
 ....
 end;
 TECSEntity = class
 ...
 Name: string;
 Component: array of TECSComponent;
 ....
 end;
 TECSEntityArray = class
 ...
 Name: string;
 Entity: array of TECSEntity;
 ....
 end;
 Var
 MyWorld:TECSEntityArray;
Ну и как-бы выражение
- Код: Выделить всё
- MyWorld.Entity[i].ComponentByName('speed').ElementByName('actualspeed').data:=MyWorld.Entity[i].ComponentByName('speed').ElementByName('actualspeed').data+MyWorld.Entity[i].ComponentByName('speed').ElementByName('acceleration').data ;
более менее рабочее и понятное. И можно будет структуры создавать из файла или БД например.
Есть еще один вариант универсальной записи. Data:WideString. Возможно преобразование string->int64,Currency,array будет работать шустрее чем варианты.
У, еще нужно тип bool поддерживать, но это не важно походу.
Добавлено спустя 23 минуты 22 секунды:
iskander писал(а):Если непременно нужно, чтобы Data: Variant торчал наружу, то может быть так?
А такой вариант не работает на 3.2 ???
- Код: Выделить всё
- class operator TECSElement.:=(const aValue: array of byte): TECSElement;
 begin
 Result.dataType:=ecsArray;
 DynArrayToVariant(Result.data,Pointer(aValue),TypeInfo(aValue));
 end;
Добавлено спустя 5 минут 1 секунду:
Может конечно и не пихать массивы в структуру, раз с ними такие заморочки, но просто WideString суть есть тот же массив, а длинные строки нужны однозначно.



 ) в 3.0.4:
) в 3.0.4: