eDmk
> Треугольники тогда прыгать будут :) Как у боброва aka 122-й.
Похоже у него уже ничего не прыгает. К сожалению.
invis
> У кого-то там прыгают - слабый аргумент
Не у кого-то, а у Сергея Боброва, таланта визуального стиля и душевности картинки! А если посмотреть его ранние работы, то может и на грани гениальности работал.
#226 (Правка: 12:32)
12:07, 4 июня 2020
InfusionKRD
> то проблема только у меня
У меня тоже такие подозрения, т.к. на куче других машин ошибка не вылезает.
Проверял даже с ограниченными правами. Проблем нет.
#227 (Правка: 23 июня 2020, 13:38)
18:04, 14 июня 2020
Исправил:
1. Ускорение загрузки OBJ-файлов.
2. Сделал LOG-файл
3. Быстрый поиск дубликатов линий.
Архив с демо
+ Показать
− Скрыть
InfusionKRD
Кстати сделал подробное логирование. Можно посмотреть - где проблема.
Misanthrope
Спасибо за отзыв!
eDmk
Вот с неудачным стартом:
+ Показать
− Скрыть
3:44 [SR64] TApp64.Create
3:44 [SR64] TApp64.Variables
3:44 [SR64] TApp64.GetSystemInfo
3:44 [SR64] TApp64.UpdateResolution
3:44 [SR64] TApp64.SystemMetrics
3:44 [SR64] TApp64.ParseParams
Вот с удачным:
+ Показать
− Скрыть
3:45 [SR64] TApp64.Create
3:45 [SR64] TApp64.Variables
3:45 [SR64] TApp64.GetSystemInfo
3:45 [SR64] TApp64.UpdateResolution
3:45 [SR64] TApp64.SystemMetrics
3:45 [SR64] TApp64.ParseParams
3:45 [SR64] Путь приложения: C:\Test\SR64\
3:45 [SR64] TApp64.UpperCase(Params)
3:45 [SR64] Инициализация приложения
3:45 [SR64] Установка путей в папке Media
3:45 [SR64] C:\Test\SR64\Media\Images\
3:45 [SR64] C:\Test\SR64\Media\Models\
3:45 [SR64] C:\Test\SR64\Media\Shaders\
3:45 [SR64] C:\Test\SR64\Media\ScreenShots\
3:45 [SR64] C:\Test\SR64\Media\Swatches\
3:45 [SR64] Установка глобальных переменных
3:45 [SR64] Загрузчик изображений
3:45 [SR64] Загрузка ресурсов
3:45 [SR64] C:\Test\SR64\Media\Images\pt_sans_12.tif
3:45 [SR64] C:\Test\SR64\Media\Images\CheckBoxOn.bmp
3:45 [SR64] C:\Test\SR64\Media\Images\CheckBoxOff.bmp
3:45 [SR64] C:\Test\SR64\Media\Images\slider_left_btn.bmp
3:45 [SR64] C:\Test\SR64\Media\Images\slider_right_btn.bmp
3:45 [SR64] C:\Test\SR64\Media\Images\slider_top_btn.bmp
3:45 [SR64] C:\Test\SR64\Media\Images\slider_bottom_btn.bmp
3:45 [SR64] Создание окна приложения
3:45 [SR64] TApp64.Run
3:45 [SR64] Завершение
#232 (Правка: 11:24)
11:22, 23 июня 2020
InfusionKRD
После разбора параметров инициализируется путь программы:
+ Показать
− Скрыть
constructor TApp64.Create(AName: string);
var
SystemInfo: TSystemInfo;
i: Integer;
A, B: string;
begin
inherited Create;
FClass := ClassName + CDot;
Log.Add(FClass + 'Create');
FInstance := 0;
FMainWnd := 0;
FProgressWnd := 0;
FHiMode := True;
FLoMode := (not FHiMode);
FAppName := AName;
SetLength(FImagesPath, 0);
SetLength(FModelsPath, 0);
Log.Add(FClass + 'Variables');
GetSystemInfo(SystemInfo);
FNumProcessors := SystemInfo.dwNumberOfProcessors;
Log.Add(FClass + 'GetSystemInfo');
UpdateResolution;
FDesktop := FScreen;
Log.Add(FClass + 'UpdateResolution');
FTaskbarWnd := FindWindow(PChar(LC_TASKBARNAME), nil);
FBorder.X := GetSystemMetrics(SM_CXFRAME);
FBorder.Y := GetSystemMetrics(SM_CYFRAME);
FCH := GetSystemMetrics(SM_CYCAPTION);
Log.Add(FClass + 'SystemMetrics');
ParseParams(FParams, True);
Log.Add(FClass + 'ParseParams');
FAppPath := ExtractFilePath(FParams.Get(0));
if (FAppPath = '') then
FAppPath := GetCurrentDir;
Log.Add('Путь приложения: ' + FAppPath);
FZ64 := False;
B := CPRMS[0];
for i := FParams.Lo to FParams.Hi do
begin
A := UpperCase(FParams.Get(i));
if CmpStr(A, B) then
begin
FZ64 := True;
Log.Add('Использован параметр: ' + A);
Break;
end;
end;
Log.Add(FClass + 'UpperCase(Params)');
ResetTimers;
end;
В общем ошибка где-то тут:
+ Показать
− Скрыть
FAppPath := ExtractFilePath(FParams.Get(0));
if (FAppPath = '') then
FAppPath := GetCurrentDir;
Log.Add('Путь приложения: ' + FAppPath);
#233 (Правка: 13:37)
13:34, 23 июня 2020
InfusionKRD
В общем переработал всю систему загрузки :)
Должно помочь: Новое демо
eDmk
Нечем порадовать - тоже самое:
+ Показать
− Скрыть
21:26 [SR64] TApp64.Create
21:26 [SR64] TApp64.Variables
21:26 [SR64] TApp64.GetSystemInfo
21:26 [SR64] TApp64.UpdateResolution
21:26 [SR64] TApp64.SystemMetrics
21:26 [SR64] TApp64.ParseParams
Вангую, ваше вот это вот: FParams.Get(0) делает что-то грубое с кодировкой.
Почему не прописать напрямую: paramStr(0) ?
Еще на одной машине запустил ваш SR64.exe: Pentium G5400 - голдовый пенек, 2 ядра, 4 потока.
В FullHD, но режим кино + 3 источника света + B градиент + кинорамка + В помещении на сцене a10_Geos_(10x10x10).obj в самом трудном режиме выдает 34-39 FPS на FullHD
Кстати, а оно ведь теперь падает совсем с др. ошибкой:

#236 (Правка: 22:54)
22:29, 23 июня 2020
InfusionKRD
> 34-39 FPS на FullHD
Это прекрасно для одного ядра. Спасибо за тест.
InfusionKRD
> FParams.Get(0) делает что-то грубое с кодировкой
Ваще ничего не делает. Вот код:
+ Показать
− Скрыть
function ExtractFilePath(APath: string): string;
var
i, N, SlashPos: Integer;
C: Char;
R: string absolute Result;
const
BS: Char = #92;
FS: Char = #47;
begin
SetLength(R, 0);
N := Length(APath);
if (N > 0) then
begin
SlashPos := 0;
for i := N downto 1 do
begin
C := APath[i];
if (C = BS) or (C = FS) then
begin
SlashPos := i;
Break;
end;
end;
if (SlashPos > 0) then
begin
SetLength(R, SlashPos);
MoveBytes(@APath[1], @R[1], SlashPos * SizeOf(Char));
end;
end;
end;
function TStringArray.Get(AIndex: Integer): string;
begin
Result := FStringArray[AIndex].Value;
end;
У меня параметры из командной строки разбираются без проблем.
Там никаких выкрутасов. Можете проверить.
+ Показать
− Скрыть
const
DQ = #34;
SQ = #39;
CDot: Char = #46;
SPACE: Char = #32;
CPRMS: array[0..0] of string = ('-Z64');
ExcludeChars: array[0..2] of Char = (#0, DQ, SQ);
function FileExist64(AName: string): Boolean;
var
FD: _WIN32_FIND_DATAW;
H: THandle;
begin
H := WinApi.Windows.FindFirstFile(PChar(AName), FD);
if (H = INVALID_HANDLE_VALUE) then
Result := False else
Result := True;
if Result then
begin
if (FD.dwFileAttributes = FILE_ATTRIBUTE_ARCHIVE) or
(FD.dwFileAttributes = FILE_ATTRIBUTE_NORMAL) then else Result := False;
end;
WinApi.Windows.FindClose(H);
end;
function MemCmp64(A, B: Pointer; ACount: QWord): Boolean;
asm
.NOFRAME
cmp ACount, 0
je @NE
cmp ACount, 8
jl @B
mov R9, ACount
and R9, 07h
shr ACount, 3
@N:
mov rax, [A]
xor rax, [B]
jnz @NE
add A, 8
add B, 8
dec ACount
jnz @N
cmp R9, 0
je @Exit
mov ACount, R9
@B:
mov al, [A]
xor al, [B]
jnz @NE
inc A
inc B
dec ACount
jnz @B
@Exit:
mov al, 1
ret
@NE:
xor al, al
end;
function CmpStr(AStr, BStr: AnsiString): Boolean;
var
A, B: Integer;
begin
Result := False;
A := Length(AStr);
B := Length(BStr);
if (A = B) then
Result := MemCmp64(@AStr[1], @BStr[1], A);
end;
function CharInArray(C: Char; AChars: array of Char): Boolean;
var
i: Integer;
A: UInt64;
begin
Result := False;
A := UInt64(@AChars[0]);
for i := Low(AChars) to High(AChars) do
begin
if (PChar(A)^ = C) then Exit(True);
Inc(A, SizeOf(Char));
end;
end;
function ParamPossible(AValue: string): Boolean;
var
i: Integer;
A: string;
begin
Result := False;
A := UpperCase(AValue);
for i := Low(CPRMS) to High(CPRMS) do
begin
if CmpStr(A, CPRMS[i]) then Exit(True);
end;
end;
function CharPossible(AChar: Char): Boolean;
begin
Result := not CharInArray(AChar, ExcludeChars);
end;
function IncorrectChar(AChar: Char): Boolean;
begin
Result := CharInArray(AChar, ExcludeChars);
end;
procedure ParseParams(var AStrings: TStringArray; AZeroParam: Boolean);
var
AStr: string;
BStr: string;
CStr: string;
ZStr: string;
i, ALen, BLen, CLen, APos: Integer;
C: Char;
begin
AStr := GetCommandLine;
ALen := Length(AStr);
if not Assigned(AStrings) then
AStrings := TStringArray.Create;
SetLength(ZStr, 0);
APos := 1;
for i := 1 to ALen do
begin
C := AStr[APos];
Inc(APos);
if CharPossible(C) then
ZStr := (ZStr + C) else Continue;
if FileExist64(ZStr) then
begin
if AZeroParam then AStrings.Add(ZStr);
Break;
end;
end;
if (APos < ALen) then
begin
BLen := (ALen - APos) + 1;
SetLength(BStr, BLen);
MoveBytes(@AStr[APos], @BStr[1], BLen * SizeOf(Char));
SetLength(CStr, 0);
CLen := Length(CStr);
for i := 1 to BLen do
begin
C := BStr[i];
if IncorrectChar(C) then Continue;
if (C = SPACE) then
begin
if FileExist64(CStr) or ParamPossible(CStr) then
begin
AStrings.Add(CStr);
SetLength(CStr, 0);
CLen := Length(CStr);
Continue;
end
else
begin
if CharPossible(C) and (CLen <> 0) then
begin
CStr := (CStr + C);
CLen := Length(CStr);
end;
end;
end
else
begin
if CharPossible(C) then
begin
CStr := (CStr + C);
CLen := Length(CStr);
end;
end;
end;
if FileExist64(CStr) or ParamPossible(CStr) then
begin
AStrings.Add(CStr);
end;
end;
end;
InfusionKRD
> теперь падает совсем с др. ошибкой
Это печалька. Поэтому и тестирую. Иногда и у меня падает.
Одну ошибку не могу отловить - редко возникает. Выдает Floating Point Error.
InfusionKRD
> Почему не прописать напрямую: paramStr(0) ?
У меня все библиотеки свои. Такой фэншуй :)
Дельфёвые библиотеки отключены.
Если Вас еще не задолбал этот глюк - могу попробовать ParamStr(0),
хотя глядя на исходный код ParamStr могу сказать, что у меня ничем не хуже.
Сотни файлов парсит быстро и без глюков. Хоть с разделителями, хоть без.
#238 (Правка: 23:06)
23:02, 23 июня 2020
Кстати, запустил в линуксе через Wine с библиотеками Proton. Вроде все работает, только галочки себя странно ведут. Бывает что-то левое включается. Например, один раз как-то сама включилось отображение сетки на стенках комнаты.
Также при включении Z-сортировки в добавок к флагам на скрине начинают мерцать кубы в центре.
+ Показать
− Скрыть
UPDATE: Забыл разрешить процессору уходить в буст. Стандартные частоты 1.6 - 2.0, а с бустом 1.6 - 3.6 ГГц.
+ Показать
− Скрыть
eDmk
Если Вас еще не задолбал этот глюк
Да мне как в той шутке - индифферентно.
+ Показать
− Скрыть
Помню, когда у меня был пень250 MMX и небыло инета, достал я где то третью делфи.
Учебников небыло и я тыкал по клавишам как обезьяна.
Не знаю что я кодил (но что то связанное с линейной алгеброй), программы работали с ошибками, которые меня
очень печалили.
Некоторые ошибки я осознавал, некоторые я не мог найти, хотя и искал.
Пару лет назад, от скуки мне захотелось накидать код. Стал гуглить на чем сейчас люди кодят (ну не си же изучать), нашел несколько паскалей.
Паскаль ABC - крутой для "очень бегинеров", просидел на нем с месяц. Но я не понимаю как мне отлавливать вылеты, а они там постоянно случаются, если например к Byte прибавить 256 и т.д.
Случайно попался Lazarus (не знаю как нужно гуглить чтобы на него наткнуться, но точно не так как я)... Смотрю, да это же мой Делфи3 из 2000 года!
И... ни одной ошибки. Я осознаю что я пишу код уровня - "даже не юниор" - но все же, ни одной ошибки.
Но если что потестить - а чего бы и нет.