Cheb's Game Engine

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: Cheb's Game Engine

Сообщение Alex2013 » 13.12.2019 20:19:06

"Поздравляю с компиляцией ! " (с) Трубо Поскакал (была когда-то такая веселая пародия на турбо паскаль ) :D

Добавлено спустя 6 минут 32 секунды:
Cheb писал(а):И теперь движок рисует серый квадрат Малевича, на внешние раздражители не реагируя

Я кстати считаю подобный результат пробного запуска небольшой но победой . (Сколько раз подобное было при адаптации примеров от OpenCV - не сосчитать )
Alex2013
долгожитель
 
Сообщения: 1662
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение Cheb » 13.12.2019 22:49:21

..а не, всё пучком. Оно крашилось. Просто механизм отлова исключений в логическом потоке мышей не ловил.

..догадайтесь дети, почему наваявший это - законченный мудак :oops:
Код: Выделить всё
function TChepersyMemoryManagerChunk.GetChunkInd(delta: longint): longint;
begin
  Result:= (delta shr CpsMMAllocGranPoT) div f_SizeGran;
end;

function TChepersyMemoryManagerChunk.GetChunkInd(o: TChepersyObject): longint;
begin
  Result:= (
    (Self.GetChunkInd(ptrint(pointer(o)) - ptrint(pointer(Self))))
    shr CpsMMAllocGranPoT
  ) div f_SizeGran;
end;

Рукалицо :oops:

Спойлер: потому что второй раз применял (<значение> shr CpsMMAllocGranPoT) div f_SizeGran к уже обработанному значению

P.S. Копипаста - зло. :x

Добавлено спустя 4 часа 20 минут 4 секунды:
Поздравляю с компиляцией !

Спасибо :D

Потихоньку додавливаю, уже смогает сохранить сессию, прежде чем упасть, пытаясь сдать матке ресурсы на хранение. И если открыть файл сессии текстовым редактором - там по попадающимся строкам видно, что даже класс меню выбора модуля успешно создаётся.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 16.12.2019 19:00:15

З.Ы. Вот и доверяй после этого коду, написанному на коленке в тесном кресле над Атлантикой когда двухлетка в ряду позади старательно изображает стаю диких обезьян.

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

А я, потом, такой: какое ещё, #%$@#, Out of Memory? :lol:

Добавлено спустя 34 минуты 14 секунд:
З.Ы. Документация нагло врёт: https://www.freepascal.org/docs-html/cu ... dword.html заявлено, что при нуле (ни один бит не установлен) возвращает 255 но на самом деле она возвращает ноль. Надо вручную проверять на ноль.

Код: Выделить всё
function TChepersyMemoryManagerChunk.Alloc: pointer;
var
  i, k: integer;
  j: cardinal;
  m: ptruint;
begin
  i:= 0;
  // the mask bits of non-valid indexes are pre-set to 1, see the constructor
  for i:= 0 to High(f_AllocMask) do begin
    m:= not f_AllocMask[i];

    if m = 0 then continue;
    // https://www.freepascal.org/docs-html/current/rtl/system/bsfdword.html
    // incorrectly states that BsfDWord returns 255 if no bits are set
    // while in fact it returns 0! (at least in fp 2.6.4 it does)
        j:= {$ifdef cpu64}BsfQWord( {$else}BsfDWord( {$endif} m );
addlog(' i=%0, j=%1, k=%2, mask=%3',[i,j,k,pointer(f_AllocMask[i])])    ;
//    if j < 255 then begin
      k:= (i * 8 * sizeof(pointer)) + j;
      Assert((k >= f_IdxLow) and (k <= f_IdxHigh)
            , 'TChepersyMemoryManagerChunk.Alloc: index ' + IntToStr(k)
            + ' is out of bounds (' + IntToStr(f_IdxLow) + ','
            + IntToStr(f_IdxHigh) + ')');
      Inc(f_AllocCount);
      Dec(f_FreeCount);
      if f_FreeCount = 0 then CpsMemoryManager.OnChunkBecomingFull(Self);
      f_AllocMask[i]:= f_AllocMask[i] or (ptruint(1) shl j);
      Exit(pointer(ptruint(Self) + ptruint(k) * f_Size));
//    end;
  end;
  Die(MI_ERROR_PROGRAMMER_NO_BAKA, [
                           'TChepersyMemoryManagerChunk.Alloc algorithm fail']);
end;


ИИИИ, ПОШЛА, РОДИМАЯ!!! :twisted:
Изображение
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 16.12.2019 20:57:44

>заявлено, что при нуле (ни один бит не установлен) возвращает 255 но на самом деле она возвращает ноль
Нет, всё правильно в документации. Я подозреваю, что и в 2.6.4 вернёт 255: изменение этого поведения тихо сломало бы абсолютно весь код с Bs[fr].*, поэтому вместо него ввели бы новую функцию. По-моему, ты этот 0 предварительно not'ишь.
Untitled-1.png
Untitled-1.png (12.03 КБ) Просмотров: 1584
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 440
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение Cheb » 16.12.2019 21:27:40

А вот хрен.

Код: Выделить всё
program test;
begin
  WriteLn(BsfDword(0));
  WriteLn(BsfQWord(0));
  WriteLn({$I %FPCVERSION%});
end.


d:chentrahmodulestests>c:FPC2.6.4bini386-win32fpc bsfdword.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling bsfdword.pas
Linking bsfdword.exe
7 lines compiled, 0.1 sec , 25616 bytes code, 1628 bytes data

d:chentrahmodulestests>bsfdword
0
4231860
2.6.4

d:chentrahmodulestests>c:FPC3.0.4bini386-win32fpc bsfdword.pas
Free Pascal Compiler version 3.0.4 [2017/10/06] for i386
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling bsfdword.pas
Linking bsfdword.exe
7 lines compiled, 0.1 sec, 25424 bytes code, 1252 bytes data

d:chentrahmodulestests>bsfdword
255
255
3.0.4


Добавлено спустя 20 минут 36 секунд:
Добавил себе в движок очередную заплатку для фпц 2.6.4:
Код: Выделить всё
{$if (FPC_FULLVERSION<30000)}
  // these are glitched in 2.6.4, returning trash on 0 instead of 255.
  function BsfDword(const v: dword): cardinal;
  begin
    if v = 0 then Result:= 255 else Result:= system.BsfDword(v);
  end;
  function BsfQword(const v: qword): cardinal;
  begin
    if v = 0 then Result:= 255 else Result:= system.BsfQword(v);
  end;
  function BsrDword(const v: dword): cardinal;
  begin
    if v = 0 then Result:= 255 else Result:= system.BsrDword(v);
  end;
  function BsrQword(const v: qword): cardinal;
  begin
    if v = 0 then Result:= 255 else Result:= system.BsrQword(v);
  end;
{$endif}
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 18.12.2019 00:41:14

После длительного применения кувалды и такой-то матери (забыл добавить ручное сохранение флагов объекта, давало запоротый сейв и крах при попытке чтения того, что в нём нету; неправильно применял DynArraySetLength, давало упоротые глюки и крах) сохранение и восстановление сессии снова работают. Однако, крашится при попытке сохранения, если выйти не через меню, а закрыв окно кнопкой с крестиком.
Хватит на сегодня, голова уже опухла от копания в шестнадцатеричных простынях.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение Cheb » 14.01.2020 02:18:56

Замечательно провёл две недели, добивая внезапный проект на работе. Кажется, были какие-то праздники?.. Не, не слышал :x

Обновил на второй малине операционку. Дебиан !внезапно! потолстела, 10-я в 8Гб уже не влезает. Переустановил с нуля на 32 Гб microSD. Получил лазарус 2.0.0 и фпц 3.0.4. Планирую вставить mseIDE, но руки пока не дошли. Лазарус на малине тормозит страшно из-за тормозной эмуляции функций WinAPI, выводящих текст. Нахрена козе баян, а IDE - сглаживание?

Собрал Чентру: интересно было, загрузится ли DLL модуля. До загрузки модуля не дошло, упало где-то в районе загрузки встроенного шрифта. И тут же выяснилось, что информация о строках stabs - битая, бектрейс кажет шум океанов Марса.

Доведу сначала до идеальной работы при сборке под фпц 3.0.4 под виндой, а потом уже полезу на малину опять.

Добавлено спустя 8 часов 29 минут 28 секунд:
Докопался: сраная glGetShaderiv() в ANGLE ничего не делает, молча оставляет переменную, в которой должна вернуть значение, как было. В результате моя система журналирования ошибок даваилась мегабайтами мусора вместо строки статуса компиляции шейдера.
Почему эта срань ничего не возвращает, сука :evil:

З.Ы. Она зависит от системной библиотеки d3dcompiler_47.dll которя является частью виндовс (лежит в /windows/system32 ). Вангую, что очередное обновление винды что-то поломало.
Попытки игнорировать эту срань пока дают белое окно.

З.З.Ы. Не, самдурак. ДЛЛа - от июля 2017-го.
Хотя... Когдая последний раз проверял под GLES ?
Блин.

Добавлено спустя 7 часов 8 минут 16 секунд:
Докопался до "гениальной" идеи использовать GetShortPathNameW в качестве хака вокруг невозможности использовать ANGLE из папки с юникодным именем, не укладывающимся в системную 8-битную кодировку.
Оно работало всегда, а не только когда нужно, и не только имя папки приводило в досовский формат, но и имя самой DLL.
Например, "libGLESv2.dll" в формат 8:3 уже не укладывается.
Nice Job Breaking It, Hero! :x

Попутно побил-таки стальную личинку - последнего босса перед финальным боссом - в прохождении на достижение "спасительница кальмаров" (меньше 3% пользователей Стима). Это, на самом деле, не сложно - всего-то пройти всю игру, ни разу не прокачав здоровье, с двумя сердечками из десяти возможных. Это не мазохизм, честно! Мне это нужно, чтобы лучше прочувствовать характер героини для моих фанфиков.
..тогда почему я это делаю, при этом ещё и НЕ используя авто-зелья, кои позволяют до девяти раз воскреснуть к полному здоровью вместо гамовера и продолжения с последней точки сохранения, которая могла быть километр назад?..
Всё чтобы прочувствовать крутизну и храбрость Шантэй. Не мазохизм, нет.
..Стойте, разве большинство атак финального босса не наносят 8 урона - ровно на два сердечка?..
..будет весело. :x

Добавлено спустя 1 час 10 минут 32 секунды:
Ха! :twisted: Я заставил таки не-юникодные дллы работать из папки с юникодным именем, не переводимым в 8-битную кодировку!
ANGLE запустилась и пошла рисовать из папки D:/人◕‿‿◕人\
Loading d:84BC~13rdpartyANGLEwin32libEGL.dll...Ok, d:84BC~13rdpartyANGLEwin32libEGL.dll
Loading the procedure addresses from the GL ES DLL ...
glActiveTexture() at 5F1742C0h in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
glAttachShader() at 5F1742C5h in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
glBindAttribLocation() at 5F1742CAh in d:84BC~13rdpartyANGLEwin32libGLESv2.dll
...


Насколько проще был бы моя юникодная заплатка для фпц 2.6.4 и 3.0, если бы я сразу создал эту пару чудовищ:
Код: Выделить всё
  function GetAnsiSafePath(s: TFileNameString): TFileNameString;
  {$ifndef windows}
  begin
    Result:= s;
  end; 
  {$else}
  // ASSUMING that the file name is safe anyway
  var
    u, b: UnicodeString;
    reqlen: dword;
    fn, pt: TFileNameString;
    a: Array of UnicodeString;
    i: integer;
  begin
    if Length(s) = 0 then Exit(s);
    fn:= ExtractFileName(s);
    // first, optimize the path correcting slashes and collapsing all '..'
    pt:= OptiPath(ExtractFilePath(s));
    u:= FileNameToUnicode(pt);
    if IsPathAnsiSafe(u) then Exit(s);
    a:= Explode('', u);
    u:= a[0] + ''; // assuming its the drive letter, not checking
    for i:= 1 to High(a) - 1 do begin
      u+= a[i] + '';
      if IsPathAnsiSafe(u) then continue;

      reqlen:= GetShortPathNameW(@u[1], nil, 0); //msdn sayd NOT INCLUDING
        // the terminating #0 but then where does that extra space
        // come from?
      if reqlen = 0 then begin
        GetLastError; // clear the error message
        Exit(s);
      end;
      SetLength(b, reqlen); // automatically creates extra space for the terminating zero
      SetLength(b, GetShortPathNameW(@u[1], @b[1], reqlen + 1));
      if Length(b) = 0 then Exit(s);
      u:= b;
    end;
    Result:= UnicodeToFileName(u) + fn;
  end;
  {$endif}


Код: Выделить всё
function IsPathAnsiSafe(u: UnicodeString): boolean;
{$ifndef windows}
begin Result:= Yes end;
{$else windows}
var
  a: UnicodeString;
  b: AnsiString;
  i: integer;
  res: longbool;
  ac: AnsiChar;
begin
  if Length(u) < 1 then Exit(Yes);
 
  res:= false;
  i:= WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK or WC_DISCARDNS,
                                           @u[1], length(u), nil, 0, nil, nil);
  if i < 1 then Exit(Yes); // graceful degradation
  SetLength(b, i);
  ac:= #7;
  WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK or WC_DISCARDNS,
                                        @u[1], length(u), @b[1], i, @ac, @res);
  Result:= Yes;
  for i:= 1 to Length(b) do
    if ord(b[i]) < 32 then begin
      Result:= No;
      break;
    end;
end;
{$endif windows}


Добавлено спустя 21 час 17 минут 47 секунд:
На самом деле падение на малине - это какой-то хтонический глюк из-за того, что я текстуру шрифта пересохранил в формате LUMINANCE_ALPHA (The GIMP вполне такое позволяет). Процедура загрузки говорит: конвертирую в формат ргба8 поскольку люминанс-альфа не поддерживается конвертирую ргба8 в целевой люминанс-альфа... И всё развозит нафиг. Что там за говнокод из глубины веков выполз?

Добавлено спустя 2 часа 23 минуты 46 секунд:
Разрулил. Теперь линуксовые версии испытывают классический crash-to-desktop, при чём в консоль высирается:
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 18 (X_ChangeProperty)
Resource id in failed request: 0x0
Serial number of failed request: 10
Current serial number in output stream: 11

Крах идентичный и на малине с новейшей распбиан, сборка под фпц 3.0.4, и на почти десятилетней лежалости убунте, сборка под фпц 2.6.4.
Вывод? Я когда-то что-то расковырял в оконном менеджере. Когда-то давно, теперь уже и не упомнить, что и где. Учитывая, что у меня в планах то-ли на 16-й, то-ли на 17-й год стоит поддержка полноэкранного режима и захвата мыши по образцу ZenGL...
[тяжкий вздох] :x

Добавлено спустя 3 часа 12 минут 41 секунду:
..это был типичный случай ССЗБ. На днях добавил непроверенную фичу, которая бомбила только в линуксе.

Ну что же, господа присяжные заседатели. Врсия для малины полностью запустилась, выдала звук через OpenAL, нарисовала логотип через GLES2, успешно загрузила DLL модуля, та запустила потоки, началась регистрация классов - и всё молча умерло.
Дальше - обычные рабочие моменты: выследить и удавить. И так - пока багов не останется.

Если бы ещё компиляция на малине занимала меньше, чем до отупения долго.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение runewalsh » 16.01.2020 15:02:34

Cheb писал(а):GetLastError; // clear the error message

Это не так работает. GetLastError ничего не сбрасывает, это только в OpenGL glGetError сбрасывает. Можно сделать SetLastError, а можно ничего не делать, потому что функции WinAPI, работающие с LastError, как правило, всегда выставляют его при ошибке (и возвращают FALSE, 0 или подобное, чтобы об этом сообщить), иначе бы их было невозможно использовать. Некоторые имеют багофичу с невыставлением и им действительно желателен вызов SetLastError(0) перед выполнением, но обычно про это говорится в документации.
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 440
Зарегистрирован: 27.04.2010 00:15:25

Re: Cheb's Game Engine

Сообщение debi12345 » 16.01.2020 17:31:56

Если бы ещё компиляция на малине занимала меньше, чем до отупения долго.

Можно установить "малину" в QEMU-виртуалке на мощном компе.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5552
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 18.01.2020 00:29:12

Это не так работает.

Ёлки :shock: А я ещё со времён 98-й был уверен...

Можно установить "малину" в QEMU-виртуалке на мощном компе.

Не прокатит: мой движок требует аппаратного ускорения и работает с специфичными API от Broadcom для дополнительного управления оборудованием, без чего аппаратного ускорения на малине нет. Почему, думаете, никто на неё не портирует?.. Потому что SDL2 там неработоспособна, требуются танцы с бубном, которые она не поддерживает.

Не, сначала выполю все баги под Win32, чтобы блестело как у кота яйца, а только потом вернусь к портированию.

..Ага, нашёл один: TAbstractThreadedTask наследовался от TCgeObject, хотя это нафиг не нужно, там даже пометка стоит никогда не регистрировать и поля этих типов должны быть опускаемые.
Но теперь-то TCgeObject использует мой новый диспетчер памяти, который строго однозадачный! Иии здравствуй, жопа, новый год.

Добавлено спустя 1 час 4 минуты 43 секунды:
З.Ы.: АРГХ. Понадобилось склонировать класс сортированного списка для работы с элементами, НЕ наследуемыми от TCgeObject. Вознамылился было применить дженерики, когда вспомнил, что Обратная Совместимость С FPC 2.6.4 - Священна, и шиш мне, а не дженерики.
Склонировал метод за методом :x
Код: Выделить всё
function TSortedList.ExtractFirst: TCgeObject;
begin
  if Self.High < 0 then exit(nil);
  Result:= Remove(0);
end;

function TNCSOList.ExtractFirst: TNonCgeSortableObject;
begin
  if Self.High < 0 then exit(nil);
  Result:= Remove(0);
end;

function TSortedList._GetLast: TCgeObject;
begin
  Result:= A[High];
end;

function TNCSOList._GetLast: TNonCgeSortableObject;
begin
  Result:= A[High];
end;

//... и тянется сия простыня, аки вводный текст в "Звёздных войнах".
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 18.01.2020 11:18:38

когда вспомнил, что Обратная Совместимость С FPC 2.6.4 - Священна, и шиш мне, а не дженерики.

Обширная клиентская база не дает сказать Bye-Bye 2 fpc 2.6- ?
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5552
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Cheb » 18.01.2020 16:07:57

1. Он мне дорог, как память
2. Принцип не класть все яйца в одну корзину
3. Всё ещё не доверяю дебильной дельфийской парадигме принудительной перекодировки строк. Есть одна утилитка на работе, жизненно важная, которая обменивается данными с федеральной информационной системой. В фпц 2.6.4 работает, при сборке в 3.х - данные гарантированно битые. Так и не смог разобраться, где там перекодирует, ломая строки. Где-то в недрах synapse, вероятно. Экспериментировать желания нет, т.к. отладка - только по живому, на боевой системе.
Вывод: фпц 2.6.4 - последний рабочий. 3.0.х - глючное говно, для реальных задач не пригодное. Пройдут годы, пока все библиотеки приспособят к его прибабахам. Смена парадигмы очень хорошо описываетяс фразой "сделай систему, воспользоваться которой сможет любой дурак - и только дурак захочет ею воспользоваться". Я ещё мог бы понять, если бы у меня, как программиста, был выбор. Если бы был тип строк "игнорировать кодировку, работать с сырыми байтами"... Но ведь нету. Принудительно заставляют. Типа, я мудак, не понимаю, что делаю.
Помноженное на дебильный алгоритм сложения строк - если строка пустая, то кодировка берётся текущая, а не из второй, непустой строки - полностью ломает данные там, где кодировка заранее (на этапе компиляции) неизвестна. Иии.. Я или могу выбрать утф-8 и уменя перестанут работать классы типа TFileStream с файлами с русскими буквами - или выбрать цп1251, и мне в хлам, в говно изуродует любые утф-8 данные - если, например, они собираются из кусков при парсинге и первый кусок оказался пустой строкой.
Причём не в моём, %$#%$#%, коде, а в сторонней библиотеке, которую я использую, как чёрный ящик!
Я пытался, прикидывал так и этак, как сделать свой тип TString, который потом можно было бы подсунуть synapse, не трогая её код. Но упёрся в тот факт, что невозможно переопределить Length, SetLength и иже с ними только для конкретного типа.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 816
Зарегистрирован: 06.06.2005 15:54:34

Re: Cheb's Game Engine

Сообщение debi12345 » 18.01.2020 17:50:35

То, что строки (а не байтовые массивы - фиксированные буферы, открытые и динамические) раньше "из коробки" (без перекодировки, без передачи информации о локали и т.д.) без искажения проходили через сетевые соедиения, само по себе было ненормальностью и частным солучаем, а любая ненормальность или частный случай рано или поздно фиксится или уходит в архив.
Аватара пользователя
debi12345
долгожитель
 
Сообщения: 5552
Зарегистрирован: 10.05.2006 23:41:15
Откуда: Ташкент (Узбекистан)

Re: Cheb's Game Engine

Сообщение Alex2013 » 18.01.2020 18:18:59

А что с еще более новыми сборками FPC? Или " этот дождь на долго" ?
Ps
Кстати пытался собрать fpc 3.3.1 trunk .... собирать собирает но не работает . :roll:
Последний раз редактировалось Alex2013 19.01.2020 00:01:00, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 1662
Зарегистрирован: 03.04.2013 11:59:44

Re: Cheb's Game Engine

Сообщение misha_lp » 18.01.2020 23:01:22

У меня в многолетней офлайн 7-ке winsxs - 4.4 гига ... терпимо ! :idea:
Инструкция по безопасной "зачистке" winsxs


Пробовал делать по той инструкции, после очистки папки полетела Windows. Правда, у меня была Десятка, может в этом дело. В любом случае, советую делать точку восстановления (ссылка), иначе экономия места может вылиться в расход времени.
misha_lp
незнакомец
 
Сообщения: 4
Зарегистрирован: 27.10.2019 17:54:28

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 0

Рейтинг@Mail.ru
cron