Форум » Media » Прога » Ответить

Прога

Bloodiness: Тут есть пргограммизды или кодеры? Если идея принципиально новой игры :3

Ответов - 179, стр: 1 2 3 4 5 6 7 8 9 All

c4tnt: Зачем писать велосипед? Python уже есть. а с какой скоростью на нём будет осуществляться скиннинг модели джоинтов так на сто?

Bloodiness: >> а с какой скоростью на нём будет осуществляться скиннинг модели джоинтов так на сто? Профилируйте. Я не знаю. Вы сперва ответьте на все мои вопросы, прежде чем задавать ваши провокационные. ADDED: >> что адекватное и быстрое ядро для игры проще сделать на си Я сказал что-то против? Я за Си. Этот ЯП у меня не вызывает неприязни.

c4tnt: Ладно, вопросы так вопросы. 1. Зачем объяснять китайцу, что палочками не удобно? Затем, что в этот раз китайцу попался борщ вместо риса. 2. Вы думаете я так хорошо знаком с технической частью? Откуда мне это знать??? 3. Я сказал что-то против? Я за Си. Плюсы - это просто расширение возможностей си. Если виртуальные функции не используются, то они не попадут в результат. Если не используются классы, то они тоже не попадут в результат. Если код подходит для си компилятора, то разница нулевая, был ли использован компилятор C или C++. Но в C++ есть то, что поможет убрать сишную избыточность кода, почему бы это не использовать? 4. а с какой скоростью на нём будет осуществляться скиннинг модели джоинтов так на сто? Скрипт из блендера тратит на это около четверти секунды. Для игры это миллиарды световых лет. Отворматировал тот примерчик красиво - за что там отрывать руки то? [pre]#include <stdio.h> #include <string.h> #include <winsock2.h> #include <windows.h> #define PORT 31337 // Порт, через который идет подключение к серверу....21,80,25,110 и т.п. #define SERVERADDR "127.0.0.1" // Адрес сервера int main ( int argc, char* argv [ ] ) { char buff [ 1024 ] ; printf ( "TCP Client \n" ); if ( WSAStartup ( 0x202, ( WSADATA * ) &buff [ 0 ] ) ) { printf ( " WSAStart error %d \n ", WSAGetLastError ( ) ); return -1; } SOCKET my_sock ; my_sock=socket ( AF_INET, SOCK_STREAM, 0 ); if ( my_sock < 0 ) // { printf (" Socket ( ) error %d \n ", WSAGetLastError ( ) ); return -1; } sockaddr_in dest_addr ; dest_addr.sin_family=AF_INET; //инет коннектинг dest_addr.sin_port=htons ( PORT ); //порт HOSTENT *hst; // хост if ( inet_addr ( SERVERADDR ) !=INADDR_NONE ) dest_addr.sin_addr=inet_addr ( SERVERADDR) ; else if ( hst=gethostbyname ( SERVERADDR ) ) ( ( unsigned long * ) &dest_addr.sin_addr ) [ 0 ] = ( ( unsigned long ** ) hst->h_addr_list ) [ 0 ] [ 0 ] ; else { printf ( " invalid address %s \n ", SERVERADDR ) ; closesocket ( my_sock ) ; WSACleanup ( ) ; return -1; } if (connect ( my_sock, ( sockaddr * ) &dest_addr, sizeof ( dest_addr ) ) ) { printf (" Connect error %d \n ", WSAGetLastError ( ) ); return -1; } printf (" Соединение с %s успешно установлено \n\ Type quit for quit \n\n" , SERVERADDR ); int nsize; while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR ) { buff[ nsize ] =0; printf ( " S=>C: %s ", buff ) ; printf ( "S<=C: " ) ; fgets ( &buff [ 0 ] , sizeof ( buff ) -1, stdin ); if ( !strcmp ( &buff [ 0 ], "quit \n " ) ) { printf ( " Exit " ); closesocket ( my_sock ); WSACleanup ( ) ; return 0; } send ( my_sock, &buff [ 0 ], nsize, 0 ) ; } printf ( " Recv error %d \n", WSAGetLastError ( ) ); closesocket ( my_sock ) ; WSACleanup ( ) ; return -1; } [/pre]


Bloodiness: Опять таки вы преувеличиваете. 1. Игрушку эту можно написать и на питоне. 2. А таки не так хорошо с ней знаком. 3. Си++ никому не нужное, кроме геймдева, расширение. А вы все же проигнорировали один из моих вопросов. Ну что ж. Я повторюсь. Вы знакомы с каким либо ЯП, кроме Си/Си++? ADDED: >> char* >> if ( WSAStartup ( 0x202, ( WSADATA * ) &buff [ 0 ] ) ) Плюсисты опять не знают ставить ли звездочку с пробелом или без. Я же говорю для них не писаны стандарты. Вторая строка выглядит как говно. Я бы расстрелял. >> ( ( unsigned long * ) &dest_addr.sin_addr ) [ 0 ] = ( ( unsigned long ** ) hst->h_addr_list ) [ 0 ] [ 0 ] ; Кеп комментирует только определенные участки кода. Хлоп-хлоп. Это тоже по читабельности чуть выше брейнфака. >> if (connect ( my_sock, ( sockaddr * ) &dest_addr, sizeof ( dest_addr ) ) ) Codestyle такой codestyle. Питонщики негодуют. Даже PEP рекомендует не выделять скобки пробелами ибо это опять же чушь. Как обычно пихать в if выражения дабы снизить читабельности в разы. Fi-i-i-ine! >> while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR ) Это к примечанию выше. Такое выражение внутри цикла вызывает желание оторвать руки.

c4tnt: тут: http://freed00m.forum24.ru/?1-3-0-00000016-000-140-0#122 Кстати да, поставим вопрос иначе. Чем C лучше C++?

Bloodiness: Вы игнорируете мой вопрос.

c4tnt: PPS. Знакомы и видели там те же самые прелести, что и в си. Нид моар? Вот, к примеру, ява-скрипт от программистов одной достаточно уважаемой конторы: http://css.yandex.net/css/images/r10/_images.js

Bloodiness: >> Нид моар? Я задал вопрос, ожидая конкретного ответа. >> Вот, к примеру, ява-скрипт от программистов одной достаточно уважаемой конторы: Слышали про такую штуку как обфускация кода? http://www.kalinin.ru/programming/cpp/09_07_01.shtml а за 9 лет ничего не изменилось.

c4tnt: Слыхали, и даже делали обратную операцию вручную. По поводу статьи - лично я придерживаюсь варианта C++ - это си с плюшками, а всяческие идеологии мне не особо интересны. Ну может я тоже получу сегодня ответы?

Bloodiness: >> Ну может я тоже получу сегодня ответы? А на все ваши вопросы я ответил, вот только вы на мои отвечали изворачиваясь. Ксо жалению сейчас довольно поздно, если будут еще вопросы, я продолжу дискуссию завтра. ADDED: Вопросы идеологии в статье не рассматривались. Вы видимо просто невнимательно читали.

c4tnt: Конечно же, проблемы, связанные с ошибками в компиляторах, проявляются очень редко. Собственно поэтому можно уже сейчас оценить круг задач, которые лучше решать при помощи C++, чем C (при наличии, конечно же, хороших навыков программирования в обоих языках): это практически все программы, от которых не требуется беспрерывная работа 24 часа в сутки. Оттуда. Или игра будет крутиться сутками? Кроме компилятора, большую сложность при программировании на C++ вызывает использование STL. Несомненно, библиотека шаблонов очень удобна и полезна, но это в идеале. К примеру, очень часты случаи, когда смена поставляемой с компилятором STL на STLport, приводит к тому, что программа начинает работать стабильнее. Про использование STL в играх я уже говорил - оно криво, не надо этого делать. А на ошибки компилятора я не натыкался уже так давно... Вот пример потенциальной ошибки - исключение, возникшее в конструкторе класса. Класс после такого нельзя ни использовать ни корректно удалить. Но ведь исключения на самом деле - это именно исключительная ситуация. Я не знаю, зачем некоторые погромисты используют исключения как стандартный способ исполнения программы. Ошибка два - синглтон мейерса в многопоточных системах. Но существует мнение, что синглтон на самом деле сам по себе - одна большая ошибка... while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR ) Внимание - вопрос! Как было бы красивше?

Bloodiness: >> Оттуда. Или игра будет крутиться сутками? Вырывать абзац из контекста привычный софистский прием. В той статье написано не многозначно, что Страуструп вместо того, чтобы сделать свой язык с блекджеком, начал усложнять уже готовый, да и с процедурным подходом. И сейчас продолжают усложнять. Идея фейловая изначально. >> Но ведь исключения на самом деле - это именно исключительная ситуация. Забивать на обработку исключительных ситуаций? Очень смешно. Раз. >> Я не знаю, зачем некоторые погромисты используют исключения как стандартный способ исполнения программы. Вам не доводилось встречаться с такими ситуациями, когда ввод неправильный? Или еще что-нибудь испорченно? try/catch в девяти случаях из десяти используется для того, чтобы записать что-то полезное в лог, что может потом пригодится при отлове багов выполнения. Вообще я не понял шутка это сейчас была или нет. Наверное да. >> Внимание - вопрос! Как было бы красивше? Никак. Конструкции в Си++ настолько убоги от рождения, что все время будут выглядеть так. Но Цикл сделать в do/while. nsize присваивать какую-то шнягу внутри. -1 и 0 вынести в константы с именами, которые хоть что-то прояснят в этом убогом выражении. SOCKET_ERROR это вообще убийство. Опять же нет, чтобы взять нормальный человеческий try/catch плюсисты сделали какое-то говно. Хорстманн писал, чем нехороши функции, признак ошибки которых есть некое значение возврата. Нет, я бы еще понял, если бы программист писал это чисто для себя, но это, блджад, пример работы с сотеками! Если бы там были выполнены хотя бы те четыре пункта, что я назвал, было бы хоть капельку читабельнее. И не надо мне сейчас писать, что мол это все криворукие программисты, ибо вы сами подкинули мне этот пример и сами спросили как было бы читабельнее - значит для вас это типичный codestyle. Значит я не ошибался и плюсисты плюют на соглашения и читабельность. Два. Я искренне боюсь, что у вас Си++ головного мозга. Городская поликлиника имени тов. Керригана и Ричи принимает всех желающих с 8:30 до 16:00.

c4tnt: Внимание - вопрос! Как было бы красивше? Не обязательно в си, в чём угодно, но именно с указанной функцией Вообще я не понял шутка это сейчас была или нет. Наверное да Увы.. это была не шутка. У некоторых отдельных товарищей исключение используется вполне штатно... Вот и сейчас... try-catch - это как бы блок отлова исключений. Функция доступа к сокету может вообще в норме крутиться в вечном цикле, пока наконец не подключится. То есть получаем использование исключений в штатном режиме? SOCKET_ERROR это вообще убийство. Опять же нет, чтобы взять нормальный человеческий try/catch плюсисты сделали какое-то говно. Хорстманн писал, чем нехороши функции, признак ошибки которых есть некое значение возврата. Пиши гневное письмо в микрософт - это их творчество.

Bloodiness: Я раскрыл ваш секрет. Знаете, люди видят не глазами, но мозгом. Причем наш здравый смысл уберегает наш мозг от того, чего нам видеть не следует. Вот и вас ваш здравый смысл уберегает от прочтения самых колких в вашу сторону абзацев. >> Увы.. это была не шутка. У некоторых отдельных товарищей исключение используется вполне штатно... А разве вы не должны, программируя класс, предоставить другим возможность обработать исключение так, как им это хочется? Использовать исключения по назначению как раз то, что нужно. >> Не обязательно в си, в чём угодно, но именно с указанной функцией Как я понял в проге реализуется следующее: [pre2] #!/usr/bin/env python #-*- coding:utf-8 -*- from socket import socket from socket import error as SocketError from socket import timeout as SocketTimeout connection = socket() # а это сокет. connection_props = ('localhost', 10999) # параметры соединения. buffersize = 1024 # совершенно ненужная константа. # Не будем забывать, что сервер может забить на нас. connection.settimeout(10) # 10 секунд должно хватить, да? # Пытаемся подключиться: try: # Следующая строчка собственно и осуществяет подключение. connection.connect(connection_props) except SocketError, error: # Может случиться так, что "Connection Refused". print error.strerror exit(1) # Пытаемся провернуть передачу/прием данных: try: while True: nsize = connection.recv(buffersize) print 'Мы получили', nsize nsize = raw_input('Отправляем: ') if nsize == 'quit': break connection.send(nsize) except SocketTimeout, timeout: # Такое тоже случается. Вышло время ожидания. print str(timeout) except SocketError, error: # Если соединение было разорванно во время работы. print error.strerror finally: connection.close() [/pre2]

c4tnt: а теперь той же питоновской функцией делаем проверку возможности подсоединения к порту от 0 до 65536 (сканер портов) и получаем прекрасный пример программы, которая 95% своей жизни проводит внутри исключения, ведь так? Или это хорошо? nsize = connection.recv(buffersize) print 'Мы получили', nsize nsize = raw_input('Отправляем: ') Как бы nsize в оригинале был размером полученного пакета, но пофиг... nsize = connection.recv(buffersize) << здесь наверняка происходит выделение памяти под эту самую nsize, хотя в питоне строки константные и там выделение памяти вообще внезапная операция. Будем считать, что connection.recv(buffersize) выделяет каждый раз фиксированную строку по размеру входящего пакета. В сишном коде буфер один на всё и он выделяется только один раз, здесь - в каждом цикле один alloc? Выделение памяти - операция достаточно долгая, поэтому питон и тормозит.

Bloodiness: >> а теперь той же питоновской функцией делаем проверку возможности подсоединения к порту от 0 до 65536 (сканер портов) и получаем прекрасный пример программы, которая 95% своей жизни проводит внутри исключения, ведь так? Или это хорошо? А чем это плохо? В яве это нехорошо, ибо генерация исключения дорогая операция. Ладно. Специально для таких назойливых как вы: [pre2] #!/usr/bin/env python #-*- coding:utf-8 -*- from socket import socket availports = list() tmp = socket() x = 0 while x <= 65536: if not tmp.connect_ex(('localhost', x)): availports.append(x) tmp.close() tmp = socket() x = x + 1 for x in availports: print x [/pre2] Но это моя быдлоподелка. Уже есть готовые решения: http://www.coderholic.com/python-port-scanner/ и вариант с многопоточностью: http://code.activestate.com/recipes/286240-python-portscanners/ >> питон тормозит. Опять фигню сморозили.

c4tnt: not tmp.connect_ex(('localhost', x)) Но это же другая функция???

Bloodiness: >> Но это же другая функция??? Я поражен вашей внимательностью, сэр.

c4tnt: и кстати да, аналога того кода тоже с использованием recv из WSA, но более красивого по причине смены ЯП до сих пор нету.



полная версия страницы