powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с объектами DirectX
5 сообщений из 5, страница 1 из 1
Работа с объектами DirectX
    #40116316
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наткнулся в одном проекте на такой код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    FD3DDevice: IDirect3DDevice9;
    FID3DXFont: ID3DXFont;
    FD3DVB: IDirect3DVertexBuffer9;
    FD3DIB16: IDirect3DTexture9;
    FID3DSurface: IDirect3DSurface9;

procedure Init;
begin
  D3DXCreateFont(FD3DDevice, FFont.Handle, FID3DXFont);
  FD3DDevice.CreateVertexBuffer(C_COUNT_POINT_VERTEXBUFFER_MIN *
    SizeOf(TCUSTOMVERTEX), D3DUSAGE_WRITEONLY, D3DFVF_CUSTOMVERTEX,
    D3DPOOL_DEFAULT, FD3DVB, nil);
  CreateTexture(C_WIDTH_TEXTURE_DIB16, C_HEIGHT_TEXTURE_DIB16, 0, 0,
    D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, FD3DIB16, nil);
  FD3DDevice.GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, FID3DSurface);
end;

procedure CleanUp;
begin
  if Assigned(FID3DXFont) then
  begin
    FID3DXFont._Release;
    FID3DXFont := nil;
  end;
  if Assigned(FD3DIB16) then
  begin
    FD3DIB16._Release;
    FD3DIB16 := nil;
  end;
  if Assigned(FD3DVB) then
  begin
    FD3DVB._Release;
    FD3DVB := nil;
  end;
  if Assigned(FID3DSurface) then
  begin
    FID3DSurface._Release;
    FID3DSurface := nil;
  end;
end;

Вопрос: CleanUp написан правильно? Или явный вызов _Release это ошибка? _AddRef явно нигде не вызывается. Direct3D объекты не требуют же дополнительного _Release?

Код похож на Copy-Paste из С++

С уважением, Vasilisk
...
Рейтинг: 0 / 0
Работа с объектами DirectX
    #40116407
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, ошибка.
Точнее заплатка дурацкой фичи компилятора дельфей делать скрытые ссылки для интерфейсных переменных.
Видимо если это убрать при завершении приложения будет AV из-за того что библиотеки уже выгружены, а ссылки остались.
Да и заплатка так себе, ничего не гарантирует.
...
Рейтинг: 0 / 0
Работа с объектами DirectX
    #40116435
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соколинский Борис
Видимо если это убрать при завершении приложения будет AV из-за того что библиотеки уже выгружены, а ссылки остались.
Так достаточно оставить
Код: pascal
1.
Obj := nil;

Тогда это была бы заплатка. А явный _Release тут не пойми откуда
...
Рейтинг: 0 / 0
Работа с объектами DirectX
    #40116447
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в древних исходниках старую реализацию и соседний метод
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
procedure Cleanup;
begin
  if Assigned (FID3DXFont) then begin
    try
      FID3DXFont._Release;
      FID3DXFont := nil;
    except
    end;
  end;
  if Assigned (FD3DIB16) then begin
    try
      FD3DIB16._Release;
      FD3DIB16 := nil;
    except
    end;
  end;
  if Assigned (FD3DIB32) then begin
    try
      FD3DIB32._Release;
      FD3DIB32 := nil;
    except
    end;
  end;
  if Assigned (FD3DIB64) then begin
    try
      FD3DIB64._Release;
      FD3DIB64 := nil;
    except
    end;
  end;
  if Assigned (FD3DVB) then begin
    FD3DVB._Release;
    FD3DVB := nil;
  end;
  if Assigned (FID3DSurface) then begin
    FID3DSurface._Release;
    FID3DSurface := nil;
  end;
end;

function DestroyDevice : boolean;
begin
  if Assigned (FID3DXFont) then begin
    try
//       FD3DDevice._Release;
      FFont.Free;
      FID3DXFont:=nil;
    except
    end;
  end;
  if Assigned (FD3DDevice) then begin
    try
//       FD3DDevice._Release;
      FD3DDevice:=nil;
    except
    end;
  end;
  if Assigned (FD3D) then begin
    try
//      FD3D._Release;
      FD3D := nil;
    except
    end;
  end;
  Result:=true;
end;

Пустые except секции намекают, что что-то происходило не так, а в DestroyDevice уже сообразили, что лишний
...
Рейтинг: 0 / 0
Работа с объектами DirectX
    #40116485
Sapersky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да вроде всегда всё уничтожалось присвоением nil.
_Release - наверное, действительно калька с Си.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Работа с объектами DirectX
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]