HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > Общие вопросы программирования
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 26.02.2021, 00:31
atizoff
Познавший АНТИЧАТ
Регистрация: 02.08.2018
Сообщений: 1,295
С нами: 4095395

Репутация: 183


По умолчанию

Всем привет, добавил в свой код рисование картинки с байтов:

C++:





Код:
void
CRender
::
DrawTexture
(
int
x
,
int
y
,
LPDIRECT3DTEXTURE9 pTexture
,
LPD3DXSPRITE pSprite
)
{
pSprite
->
Draw
(
pTexture
,
NULL
,
NULL
,
&
D3DXVECTOR3
(
x
,
y
,
0.0f
)
,
0xFFFFFFFF
)
;
}
void
CRender
::
DrawImage
(
int
x
,
int
y
,
LPDIRECT3DTEXTURE9 pTexture
,
LPD3DXSPRITE pSprite
,
PBYTE pByte
,
std
::
size_t size
)
{
if
(
pTexture
==
NULL
)
D3DXCreateTextureFromFileInMemory
(
this
->
pDevice
,
pByte
,
size
,
&
pTexture
)
;
//Create image from array
if
(
pSprite
==
NULL
)
D3DXCreateSprite
(
this
->
pDevice
,
&
pSprite
)
;
//sprite
pSprite
->
Begin
(
D3DXSPRITE_ALPHABLEND
)
;
DrawTexture
(
x
,
y
,
pTexture
,
pSprite
)
;
pSprite
->
End
(
)
;
}


Всё работает, но 1 но, как его ресетать? При смене разрешения соответсвенно вылет приложения. Можете пожалуйста подсказать код для ресета?
 
Ответить с цитированием

  #2  
Старый 26.02.2021, 00:56
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

У спрайта есть методы onLostDevice и onResetDevice, текстуры только релизить и загружать заново, если они не в managed пуле
 
Ответить с цитированием

  #3  
Старый 26.02.2021, 01:16
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от SR_team  

текстуры только релизить и загружать заново, если они не в managed пуле
Ну, в данном случае не требуется:

Цитата:

Remarks​The function is equivalent to D3DXCreateTextureFromFileInMemoryEx(pDevice, pSrcData, SrcDataSize, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppTexture).
 
Ответить с цитированием

  #4  
Старый 26.02.2021, 01:39
ALF
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами: 4472205

Репутация: 163
По умолчанию

Посмотри в исходниках собейта, там вроде как было это.

Если конечно мне не изменяет память
 
Ответить с цитированием

  #5  
Старый 26.02.2021, 02:10
SR_team
Флудер
Регистрация: 26.10.2013
Сообщений: 4,924
С нами: 6603505

Репутация: 183


По умолчанию

Цитата:
Сообщение от KiN4StAt  

D3DPOOL_MANAGED
Странно, у меня при загрузке через D3DXCreateTextureFromFileInMemory были траблы с релизом текстур. Документация точна тут, или как и обычно с DX9?
 
Ответить с цитированием

  #6  
Старый 26.02.2021, 02:35
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от SR_team  

Странно, у меня при загрузке через D3DXCreateTextureFromFileInMemory были траблы с релизом текстур. Документация точна тут, или как и обычно с DX9?
Дока с msdn, верна или нет - хз

D3DXCreateTextureFromResource - точно создавал в managed пуле, проверял
 
Ответить с цитированием

  #7  
Старый 26.02.2021, 12:30
atizoff
Познавший АНТИЧАТ
Регистрация: 02.08.2018
Сообщений: 1,295
С нами: 4095395

Репутация: 183


По умолчанию

Цитата:
Сообщение от SR_team  

У спрайта есть методы onLostDevice и onResetDevice, текстуры только релизить и загружать заново, если они не в managed пуле
При вызове их краш. Проблему решил сам, буду дома напишу тут как решил
 
Ответить с цитированием

  #8  
Старый 26.02.2021, 16:08
atizoff
Познавший АНТИЧАТ
Регистрация: 02.08.2018
Сообщений: 1,295
С нами: 4095395

Репутация: 183


По умолчанию

собстсвенно фикс, если кто-то стоклнётся с такой же проблемой.

иницализация переменных где вам удобно:

C++:





Код:
LPDIRECT3DTEXTURE9 pTexture
;
LPD3DXSPRITE pSprite
;


иницализация функций:

C++:





Код:
void
CRender
::
DrawTexture
(
int
x
,
int
y
,
LPDIRECT3DTEXTURE9 pTexture
,
LPD3DXSPRITE pSprite
)
{
pSprite
->
Draw
(
pTexture
,
NULL
,
NULL
,
&
D3DXVECTOR3
(
x
,
y
,
0.0f
)
,
0xFFFFFFFF
)
;
}
void
CRender
::
DrawImage
(
int
x
,
int
y
,
LPDIRECT3DTEXTURE9 pTexture
,
LPD3DXSPRITE pSprite
)
{
pSprite
->
Begin
(
D3DXSPRITE_ALPHABLEND
)
;
DrawTexture
(
x
,
y
,
pTexture
,
pSprite
)
;
pSprite
->
End
(
)
;
}


в dllmain.cpp -> hook present/end scene, там где вы иницилизируете фонты (его также нужно вызвать 1 раз), вставляем это (LI_FN - LAZY IMPORT):

C++:





Код:
LI_FN
(
D3DXCreateTextureFromFileInMemory
)
(
draw
.
pDevice
,
myFile
,
sizeof
(
myFile
)
,
&
draw
.
pTexture
)
;
LI_FN
(
D3DXCreateSprite
)
(
draw
.
pDevice
,
&
draw
.
pSprite
)
;


вызов где хотим там и ставим, главное чтобы потом это вызвалось в хуке сцены после инициализации фонта и прочего шлака:

C++:





Код:
draw
.
DrawImage
(
pViewport
.
Width
-
100
,
-
30
,
draw
.
pTexture
,
draw
.
pSprite
)
;


Всем хорошего дня!
 
Ответить с цитированием

  #9  
Старый 27.02.2021, 18:27
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

А не будет ли тут утечки памяти?
 
Ответить с цитированием

  #10  
Старый 27.02.2021, 19:52
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от Dark_Knight  

А не будет ли тут утечки памяти?
С чего бы это?
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.