Сообщения на форуме пользователя Andrey (61 стр.)
Modern Warfare 2 | 7 дек. 2009 | 12:56 | #108 |
---|
killbot
Executor
спасибо прояснили ситуацию.
Executor
спасибо прояснили ситуацию.
Modern Warfare 2 | 7 дек. 2009 | 10:06 | #104 |
---|
Я совсем запутался Modern Warfare 2 это COD 5 или COD 4?
perfHUD и многопоточное приложение | 7 дек. 2009 | 9:54 | #2 |
---|
Kloun
>при превможе обращении к dx из другого потока ;( ?
ну значит синхронизируй доступ. Либо создай device с флагом D3DCREATE_MULTITHREADED.
>при превможе обращении к dx из другого потока ;( ?
ну значит синхронизируй доступ. Либо создай device с флагом D3DCREATE_MULTITHREADED.
inline | 18 ноя. 2009 | 20:54 | #100 |
---|
asvp
> И посмотри какой код скомпилется если ты уберешь virtual.
он подставляет код функции.
> И посмотри какой код скомпилется если ты уберешь virtual.
он подставляет код функции.
inline | 18 ноя. 2009 | 18:31 | #98 |
---|
asvp
> > про то что виртуального вызова может не быть по факту
> Ты сам понял что сказал? Как это не может быть вызова по факту виртуального
> метода. Есть большая разница создавать объект в стеке и создавать объект
> динамический. И естественно код вызова виртуальных методов разный.
Я все прекрасно понял что сказал.
меняем код таким образом:
получаем тот-же asm код
разве этот не говорит о том что теперь это просто обычный вызов метода класса?
> > про то что виртуального вызова может не быть по факту
> Ты сам понял что сказал? Как это не может быть вызова по факту виртуального
> метода. Есть большая разница создавать объект в стеке и создавать объект
> динамический. И естественно код вызова виртуальных методов разный.
Я все прекрасно понял что сказал.
меняем код таким образом:
A a; A* ptr = &a; ptr->func();
; 45 : A a; ; 46 : A* ptr = &a; ; 47 : ptr->func(); 00001 8d 0c 24 lea ecx, DWORD PTR _a$[esp+4] 00004 c7 04 24 00 00 00 00 mov DWORD PTR _a$[esp+4], OFFSET ??_7A@@6B@ 0000b ff 15 00 00 00 00 call DWORD PTR ??_7A@@6B@
Вы используете ID3DXEffect? | 18 ноя. 2009 | 15:12 | #14 |
---|
Z
> Ибо очень часто часть фичь в ID3DXEffect - ненужная. И из-за них он тормозит
> (внутрение memcpy можно увидеть в профайлере очень часто).
ух ты не знал, Еще 1 камень в огород к ID3DXEffect. Чем смотрел если не секрет?
> Ибо очень часто часть фичь в ID3DXEffect - ненужная. И из-за них он тормозит
> (внутрение memcpy можно увидеть в профайлере очень часто).
ух ты не знал, Еще 1 камень в огород к ID3DXEffect. Чем смотрел если не секрет?
inline | 18 ноя. 2009 | 15:10 | #93 |
---|
asvp
> Инлайн - это когда вместо команды call подставляется тело функции.
я не про inline, а про то что виртуального вызова может не быть по факту, причем ты это и спросил. А заинлайнить виртуальную функцию не получиться естественно, даже через __forceinline в обоих случаях.
> Инлайн - это когда вместо команды call подставляется тело функции.
я не про inline, а про то что виртуального вызова может не быть по факту, причем ты это и спросил. А заинлайнить виртуальную функцию не получиться естественно, даже через __forceinline в обоих случаях.
inline | 18 ноя. 2009 | 14:07 | #81 |
---|
asvp
> > заменив виртуальную функцию как вызов не виртуального метода
> Это как? Покажи мне компилятор, который так делает.
для второго
Microsoft Visual С++ 2005
Release.
/O2 /Ob1 /Oi /Ot /GL /FD /MT /fp:fast /GR- /FAcs /Fa"Release\\" /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
Правка орфография.
> > заменив виртуальную функцию как вызов не виртуального метода
> Это как? Покажи мне компилятор, который так делает.
class Base { public: virtual void func() = 0; }; class A : public Base { public: virtual void func() { fprintf(stderr, "%s", "A "); } A() { } }; int main(int argc, char* argv[]) { #if 0 A a; Base* ptr = &a; #else Base* ptr = new A; #endif ptr->func(); return 0; }
для первого случая asm код:
; 116 : A a; ; 117 : Base* ptr = &a; ; 118 : ptr->func(); 00001 8d 0c 24 lea ecx, DWORD PTR _a$[esp+4] 00004 c7 04 24 00 00 00 00 mov DWORD PTR _a$[esp+4], OFFSET ??_7A@@6B@ 0000b ff 15 00 00 00 00 call DWORD PTR ??_7A@@6B@
; 45 : Base* ptr = new A; 00000 6a 04 push 4 00002 e8 00 00 00 00 call ??2@YAPAXI@Z ; operator new 00007 83 c4 04 add esp, 4 0000a 85 c0 test eax, eax 0000c 74 11 je SHORT $LN3@main 0000e c7 00 00 00 00 00 mov DWORD PTR [eax], OFFSET ??_7A@@6B@ ; 46 : ptr->func(); 00014 8b 10 mov edx, DWORD PTR [eax] 00016 8b c8 mov ecx, eax 00018 8b 02 mov eax, DWORD PTR [edx] 0001a ff d0 call eax
Release.
/O2 /Ob1 /Oi /Ot /GL /FD /MT /fp:fast /GR- /FAcs /Fa"Release\\" /Fo"Release\\" /Fd"Release\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
Правка орфография.
Правка: 18 ноя. 2009 14:08
inline | 18 ноя. 2009 | 13:02 | #74 |
---|
asvp
> Примечание: виртуальные функции никогда не создаются как подставляемая функция.
> Как бы вы не просили.
ну почему-же, если известен предок то компилятор может произвести оптимизацию, заменив виртуальную функцию как вызов не виртуального метода(ну а там можно и заинлайнить).
> Примечание: виртуальные функции никогда не создаются как подставляемая функция.
> Как бы вы не просили.
ну почему-же, если известен предок то компилятор может произвести оптимизацию, заменив виртуальную функцию как вызов не виртуального метода(ну а там можно и заинлайнить).
Оформление кода | 16 ноя. 2009 | 13:34 | #17 |
---|
Одно скажу ненавижу пробелы.
inline | 15 ноя. 2009 | 20:54 | #19 |
---|
cNoNim
> > делай ее static const.
> в matrix_rotate этого делать нельзя
это почему-же ?
можно по идее первый параметр у функции matrix_multiply не константный, и туда пишется результат, а второй можно сделать таким.
> > делай ее static const.
> в matrix_rotate этого делать нельзя
это почему-же ?
можно по идее первый параметр у функции matrix_multiply не константный, и туда пишется результат, а второй можно сделать таким.
inline | 15 ноя. 2009 | 20:46 | #17 |
---|
cNoNim
>я в matrix_multiply развернул циклы и делаю forceinline... эти функции тоже не инлайнятся
а с чего бы? у тебя сколько их вызовов то? развертка цикла не уменьшило код особо, вот компилятор и решил функция тяжелая не буду ее встраивать.
> и вообще есть ли смысл заморачиваться с этим всем на SSE и чемнить подобном?
> или компилятор сам с оптимизирует?
задача какая? если тебе нужно рассчитывать иерархию костей для скелетной анимации для сотни моделей с сотнями костей то тут да, SSE + __forceinline даст прирост.
сделай ее static const.
>я в matrix_multiply развернул циклы и делаю forceinline... эти функции тоже не инлайнятся
а с чего бы? у тебя сколько их вызовов то? развертка цикла не уменьшило код особо, вот компилятор и решил функция тяжелая не буду ее встраивать.
> и вообще есть ли смысл заморачиваться с этим всем на SSE и чемнить подобном?
> или компилятор сам с оптимизирует?
задача какая? если тебе нужно рассчитывать иерархию костей для скелетной анимации для сотни моделей с сотнями костей то тут да, SSE + __forceinline даст прирост.
float newmatrix[16] = IDENTITY_MATRIX;
inline | 15 ноя. 2009 | 16:58 | #13 |
---|
cNoNim
>да... а как для __inline будет?
не использую __inline и не знаю какая разница с inline/__forceinline. А так смотри документацию для компилятора.
к примеру вот http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Function-Attributes.html
> я праильно понимаю это намек мне перенести функцию в хидер и пометить inline...
> сам компилятор ни как не может это сделать?
я не встречал такого варинига.
>да... а как для __inline будет?
не использую __inline и не знаю какая разница с inline/__forceinline. А так смотри документацию для компилятора.
к примеру вот http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Function-Attributes.html
> я праильно понимаю это намек мне перенести функцию в хидер и пометить inline...
> сам компилятор ни как не может это сделать?
я не встречал такого варинига.
inline | 15 ноя. 2009 | 15:47 | #10 |
---|
Executor
> Про __forceinline забудь, принуждая инлайнить то, что инлайнить не надо, ты
> только усугубишь всё... Позволь компилятору самому определиться...
да нет. это нет так. Вот типичный пример авторитетного проекта.
http://unigine.blogspot.com/2009_09_01_archive.html
cNoNim
> я тут пишу код, и хочу что б он соответствовал ANSI С... т.е. без ms специфик,
> и соответственно на plain С.
делай платформ о зависимые макросы без этого ни как не обойтись. Для gcc будет __attribute__ ((always_inline))
>которая инлайнится нормально, хотя вроде не особо отличается от matrix_perspective по набору функций... ?
тут компилятор решил что можно сделать встраивание даже с директивой inline, тело функции маленькое. А вот другие функции содержат много кода.
> Про __forceinline забудь, принуждая инлайнить то, что инлайнить не надо, ты
> только усугубишь всё... Позволь компилятору самому определиться...
да нет. это нет так. Вот типичный пример авторитетного проекта.
http://unigine.blogspot.com/2009_09_01_archive.html
cNoNim
> я тут пишу код, и хочу что б он соответствовал ANSI С... т.е. без ms специфик,
> и соответственно на plain С.
делай платформ о зависимые макросы без этого ни как не обойтись. Для gcc будет __attribute__ ((always_inline))
>которая инлайнится нормально, хотя вроде не особо отличается от matrix_perspective по набору функций... ?
тут компилятор решил что можно сделать встраивание даже с директивой inline, тело функции маленькое. А вот другие функции содержат много кода.