iskander писал(а):Но имхо "шустро" с использованием Variant не будет.
Да, верно. Тестил тут. Если использовать в нескольких операциях +-* variant вместо double, производительность падает где-то 5-6 раз(возможно будет и больше). Если на входе в процедуру присваивать локальным простым переменным(double) данные из варианта, выполнять операции, и на выходе присваивать варианту получившиеся значения производительность падает "только" в 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 суть есть тот же массив, а длинные строки нужны однозначно.