Ты ей GL-текстуры создаёшь или что? Если нет, то почему просто не взять что-нибудь реентераб... не лочить?
Нет, просто она настолько древняя и кривая. Но удобная!
GL текстуры создаются и загружаются в память только в основном потоке, а картинки распаковываются только в конкретном фоновом потоке. В целом КПД заметно ниже 100%, но мне на КПД начхать, главное - плавность, которую даёт многопоточность. А будет игра запускаться 15 секунд, или 25 секунд - это уже не принципиально.
И вообще я из принципа не собираюсь связываться с распараллеливаанием OpenGL. Основной поток и так отдан ей на откуп чуть менее, чем полностью, а целевая платформа -
двухъядерная.
опять первая загрузка повисла
А нет, не только первая...
фиксированная дельта времени в менюшном режиме — это неправильно. Сейчас там заметно, как сфера крутится быстрее, если двигать мышкой.
Это специально для наглядности отладки.
Если такое будет в игре - то игра будет становиться на паузу, или, наоборот, уходить в ускоренную промотку (при крафте, например, или путешествии по карте, когда первую минуту внутириигрового времени продолжает крутиться полная физика, только персонаж берётся под управление ИИ бота)
Но вообще - да, неправильно. Буду всегда и везде логику гонять на 120 кадрах в секунду.
Так... Это переполнение арифметики с указателями. НЕНАВИЖУ
Вот тут:
- Код: Выделить всё
{$ifdef windows}
{***TODO parse whole 256TB if Windows NT 6.2 or higher
he first versions of Windows for x64 did not even use the full 256 TB;
they were restricted to just 8 TB of user space and 8 TB of kernel space.[18]
Windows did not support the entire 48-bit address space until Windows 8.1,
which was released in October 2013.}
procedure LogProcessAddressSpace; cdecl;
var
current, next: pointer;
Des: UnicodeString;
S: UnicodeString;
mm, mm2: _MEMORY_BASIC_INFORMATION;
A, step: ptruint;
TST: array[0..Max_Path + 1] of AnsiChar;
Protect: ptruint;
gapsz, maxgapsz, gapstep: ptruint;
type
TMMEnum = (meReserved, meCommitted, meFree, meUnknown, meShared, meGuarded, meNoCache);
var
MTSize: array[TMMEnum] of ptruint;
MTName: array[TMMEnum] of UnicodeString;
mi, mimax: TMMEnum;
const
MaxAddr: ptruint = {$ifdef cpu32}$FFFFFFE0{$else}$000007FFFFFFFFE0{$endif};
begin
if Mother^.Debug.Verbose then AddLog(RuEn(
' Адресное пространство процесса:',
' The address space of the process:'));
current:= nil;
FillChar(MTSize, sizeof(MTSize), 0);
repeat
if VirtualQuery(current, @mm, SizeOf(mm)) <> SizeOf(mm) then begin
gapstep:= 64 * 1024;
maxgapsz:= MaxAddr - gapstep - ptruint(mm.BaseAddress);
gapsz:= 0;
next:= nil;
repeat
{$ifdef cpu64}
if gapsz > $0fffffff then gapstep:= Math.min(maxgapsz - gapsz - 1, 1024*1024);
//if gapsz > $fffffffff then gapstep:= Math.min(maxgapsz - gapsz, 1024*1024*1024);
{$endif}
if (gapstep > maxgapsz) or (gapsz > (maxgapsz - gapstep))
then break;
gapsz+= gapstep;
if VirtualQuery(current, @mm, SizeOf(mm)) = SizeOf(mm) then begin
next:= mm.BaseAddress;
gapsz:= ptruint(next) - ptruint(current);
break;
end;
until false;
if Mother^.Debug.Verbose then AddLog(' %0..%1 (%2K): %3',
[current, current + //вот на этм месте переполнение
gapsz - 1, gapsz div 1024, RuEn(
'неизвестно (отказано в доступе)', 'unknown (access denied)')]);
MTSize[meUnknown]+= gapsz;
if not Assigned(next) then break;
current:= next;
end
else begin
Des:= '';
Case mm.State of
MEM_RESERVE: begin
Des:=RuEn('зарезервирована', 'reserved');
MTSize[meReserved]+= mm.RegionSize;
end;
MEM_FREE: begin
Des:= RuEn('свободна', 'free');
MTSize[meFree]:= MTSize[meFree] + mm.RegionSize;
end;
MEM_COMMIT: begin
MTSize[meCommitted]+= mm.RegionSize;
if
{$ifdef che_unicode}
GetModuleFileNameW
{$else}
GetModuleFileName
{$endif}
(THandle(mm.AllocationBase), @TST, SizeOf(TST) div SizeOf(TST[0]))
<> 0
then Des:= PervertedFormat(RuEn('выделена %0','committed by %0'), [PFileNameCharToFileNameString(@TST)])
else Des:= PervertedFormat(RuEn('выделена (база %0)','committed (base %0)'), [mm.Allocationbase]);
If (mm._Type <> MEM_PRIVATE) then begin
Des+= RuEn(', общая',', shared');
MTSize[meShared]+= mm.RegionSize;
end;
If (Protect and PAGE_NOCACHE > 0) then begin
Des+= RuEn(', некэшируемая',', non-cached');
MTSize[meNoCache]+= mm.RegionSize;
end;
If (Protect and PAGE_GUARD > 0) then begin
Des+= RuEn(', охраняемая',', guarded');
MTSize[meGuarded]+= mm.RegionSize;
end;
Des+= ', ';//RuEn(', доступ: ',', access: ');
Protect:= mm.Protect and not (PAGE_NOCACHE + PAGE_GUARD);
case Protect of
PAGE_READONLY: Des+= RuEn('только чтение','read only');
PAGE_READWRITE: Des+= RuEn('чтение/запись','read/write');
PAGE_WRITECOPY: Des+= RuEn('копируется при записи','copy-on-write');
PAGE_EXECUTE: Des+= RuEn('только выполнение кода','execute only');
PAGE_EXECUTE_READ: Des+= RuEn('чтение и выполнение кода','read and execute');
PAGE_EXECUTE_READWRITE: Des+= RuEn('полный','full');
PAGE_EXECUTE_WRITECOPY: Des+= RuEn('выполнение кода/копируется при записи','execute/copy-on-write');
PAGE_NOACCESS: Des+= RuEn('запрещён','denied');
else
Des+= RuEn('неизвестен','unknown');
end;
end;
end;
if Mother^.Debug.Verbose then AddLog(' %0..%1 (%2K): %3',
[mm.BaseAddress, mm.BaseAddress + mm.RegionSize - 1, mm.RegionSize div 1024, Des]);
if pointer(MaxAddr) - mm.RegionSize <= mm.BaseAddress then break;
end;
current+= mm.RegionSize;
until false;
MTName[meReserved]:= RuEn('Зарезервировано','Reserved');
MTName[meCommitted]:= RuEn('Выделеннная память','Committed');
MTName[meFree]:= RuEn('Свободно','Free');
MTName[meUnknown]:= RuEn('Нет данных, отказано в доступе','Unknown, access denied');
MTName[meShared]:= RuEn('Память, общая с другими процессами','Shared memory');
MTName[meGuarded]:= RuEn('Охраняемая память','Guarded memory');
MTName[meNoCache]:= RuEn('Некешируемая память','No-cache memory');
Des:= '';
AddLog(RuEn(
{$ifdef cpu32}
' 4 Гб адресного пространства делятся следующим образом:',
' Of the 4 Gb total adress space, there are:'
{$else}
' 8 Тб адресного пространства делятся следующим образом:',
' Of the 8 Tb total adress space, there are:'
{$endif}
));
if Mother^.Debug.Verbose
then mimax:= High(TMMEnum)
else mimax:= meFree;
for mi:= Low(TMMEnum) to mimax do
if MTSize[mi] > 0 then AddLog(RuEn(
' %0: %1 Гб',
' %0: %1 Gb'),
[MTName[mi], FormatFloat('0.00', MTSize[mi] / (1024*1024*1024))]);
end;
{$else windows}
procedure LogProcessAddressSpace; cdecl;
begin
if Mother^.Debug.Verbose then AddLog(RuEn(
' Адресное пространство процесса:'#10#13' Нет данных, поддерживается только для MS Windows.',
' The address space of the process:'#10#13' Sorry, this is only supported for MS Windows.'));
end;
{$endif windows}
Unable to open file "" - это всегда вылезает, никогда ничему не мешало. В смысле, починить надо бы, но раз не мешает - всё руки не доходят.
это просто утечки или
Спасибо, буду разбираться.
Это, скорее всего, в механизме что-то расколбасило при переделывании с менеджед на счётчик ссылок.
Добавлено спустя 10 минут 19 секунд:З.Ы. Насчёт переполнения - перезалил, обновив порядок операций на (current - 1) + gapsz
Добавлено спустя 4 минуты 6 секунд:З.З.Ы. По какой-то, пока не выясненной, причине, debug версия работает нестабильно. Надо разбираться - возможно, это WriteLn или запись в файл из потоков, которые сам екзешник не создавал? Вроде, лочу везде.
З.З.З.Ы. Ноутбук не гремит, и работает как новый! Я довольный, как слон!
Добавлено спустя 6 часов 3 минуты 59 секунд:Windows 10 перестала определяться даже с манифестом
Озверел, запилил былинный хак, и...
От меня не скроешься
- Код: Выделить всё
Detecting operating system...
Trying to detect Wine...
..system directory is C:\WINDOWS\system32
..trying to open C:\WINDOWS\system32\kernel32.dll for read...
..scanning for signature string "Wine placeholder DLL"...
..detected = False
It's Windows NT 6.2.
Testing Windows NT version...
loading kernel32.dll...
VerifyVersionInfoA() at 74907900h in C:\WINDOWS\System32\KERNEL32.DLL
VerSetConditionMask() at 77BCF950h in C:\WINDOWS\SYSTEM32\ntdll.dll
5.1 or greater: True
6.0 or greater: True
6.1 or greater: True
6.2 or greater: True
6.3 or greater: False
10.0 or greater: False
Seems like Windows 8. Let's use dirty hacks to double-check this "fact"...
Querying registry key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProductName ...
= "Windows 10 Pro"
..scanning for signature string "Windows 8.1"...
..scanning for signature string "Windows 10"...
..FOUND at offset 1!
HA! Take that, Micro$oft!
Result: ostWin10
Кстати, перезалил с этим добавлением
P.S. Зависание загрузки - где-то заклинивает одну из фоновых задач ассета TTextureFromImage. Разберусь в следующие выходные. Может быть любая хворь, от неправильно выставленного приоритета до глюков при неверной работе с OpenGL, до дырки в парадигме.
Добавлено спустя 8 минут 32 секунды:Проблема в том, что на ноуте у меня этот глюк *никогда* не вылазит, а на игровой машине - пожалуйста!