Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 17, 2013 09:36:41

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

У меня возникла проблема, когда запустил свой скрипт на домашнем (более мощном) компе (код писал на рабочем). Pygame как таковой не виснет, но почему то ВНЕЗАПНО окно pygame не рисует анимацию. Тупо рисует первую картинку и все. Дальше окно обновляется только при щелчке на заголовок окна. На рабочем компе такого не было (все отрисовывалось и обновлялось в режиме реального времени), хотя питоны и софт (портабельные) скопированы с одной папки.

На всякий случай прикладываю DxDiag домашнего компа

Прикреплённый файлы:
attachment DxDiag.txt (36,4 KБ)

Офлайн

#2 Авг. 17, 2013 14:45:43

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

И у меня возникла проблема, когда подъехал по дороге домой(дорога лучше), машина перестала работать. Как бы работает, но не заводится. Возле работы машина ездила нормально.

На всякий случай прикладываю фото дороги возле дома.



Офлайн

#3 Авг. 17, 2013 15:22:49

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

sp3
И у меня возникла проблема, когда подъехал по дороге домой(дорога лучше), машина перестала работать. Как бы работает, но не заводится. Возле работы машина ездила нормально.На всякий случай прикладываю фото дороги возле дома.
Охренеть как остроумно!!! Ответь по существу, когда мозг включится.

Офлайн

#4 Авг. 17, 2013 18:43:51

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

caufman
Не обижайтесь. Шутка достаточно оригинальная :)
sp3 имел ввиду, что DxDiag не иформативен. Информативен код. Как минимум, его запустят на своих машинах другие форумчане и Вы сможете узнать как этот код работает у них.
Если код представляет тайну, предварительно упростите его “до немогу” и потом выкладывайте.

P.S. Я вообще не работаю с pygame, просто рекомендую :)



Отредактировано 4kpt (Авг. 17, 2013 18:44:18)

Офлайн

#5 Авг. 17, 2013 20:27:11

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

4kpt
Информативен код.
три разных программера сказали, что дело не может быть в коде. Да это и логично. при всех равных (софт, версия языка, код, ос) тормоза только на одной машине. ==> проблема в машине, а не в коде. Вернее в окружении. Либо драйвер, либо видео, либо что-то из стороннего, что пользует pygame. Но что именно потыкать? Ибо pygame знаю поверхностно, а уж тем более его взаимоотношения с внешним окружением.

Сам код до ужаса банален и никакого секрета не представляет. Но если для диагностики проблем окружения нужен код питона (шизофрения, привет тебе!!!), то ладно… Выложу.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#--------------------------
# !!! Python 3.2
import pygame
from pygame.locals import *
from math import modf
white 	= (255,		255,	255	)
black 	= (0,		0,		0	)
red 	= (255,		0,		0	)
blue 	= (0,		0,		255	)
green 	= (0,		255,	0	)
yellow 	= (255,		255,	0	)
purple	= (255,		0,		255	)
grey	= (128,		128,	128	)
pygame.init ()
mainloop = True
# initial screen
screen_size = (640, 480)
screen = pygame.display.set_mode (screen_size, 0, 32)
pygame.display.set_caption('PyGame Project')
# initial clock
clock = pygame.time.Clock()
milli = 0.0
sec = 0.0
# initial data
osn = 32
shag_osn = 1
pers = Rect (osn*3, osn*3, osn, osn)
pers_color = blue
pers_speed = osn*8
new_pos = (pers.x, pers.y)
dest = Rect (0, 0, 30, 30)
dm = 0
while mainloop:
	for event in pygame.event.get():
		# "if-else" events
		if event.type == KEYDOWN:
			if event.key == K_w:
				pers.move_ip (0, osn)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_s:
				pers.move_ip (0, -osn)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_a:
				pers.move_ip (-osn, 0)
				new_pos = (pers.x, pers.y)
		if event.type == KEYDOWN:
			if event.key == K_d:
				pers.move_ip (osn, 0)
				new_pos = (pers.x, pers.y)
		if event.type == MOUSEBUTTONDOWN:
			if event.button == 1:
				new_pos = (int((modf(event.pos[0]/osn))[1]*osn),int((modf(event.pos[1]/osn))[1]*osn))
				print (new_pos, new_pos[0]/osn, new_pos[1]/osn)
		if event.type == QUIT:
			mainloop = False
		if event.type == KEYDOWN:
			if event.key == K_ESCAPE:
				mainloop = False
	# calc clock --------------------------------------
	milli = clock.tick() 
	sec = milli / 1000.0
	# -------------------------------------------------
	screen.fill(white)
	# create frame ------------------------------------
	dm = pers_speed*sec
	if pers.x != new_pos[0]:
		if (new_pos[0]-pers.x)>0:
			pers.move_ip(dm, 0)
		if (new_pos[0]-pers.x)<0:
			pers.move_ip(-dm, 0)
	if pers.y != new_pos[1]:
		if (new_pos[1]-pers.y)>0:
			pers.move_ip(0, dm)
		if (new_pos[1]-pers.y)<0:
			pers.move_ip(0, -dm)
	pygame.draw.rect(screen, pers_color, pers)
	pygame.display.update()
pygame.quit()

Офлайн

#6 Авг. 17, 2013 22:30:01

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

milli = clock.tick() 
milli = clock.tick(50) 
ps передавай привет трем программистам :)



Отредактировано sp3 (Авг. 17, 2013 22:31:55)

Офлайн

#7 Авг. 18, 2013 18:29:09

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

sp3
ps передавай привет трем программистам
привет от программистов. Нихрена не изменилось

Офлайн

#8 Авг. 19, 2013 00:12:15

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

milli = clock.tick() - не ограничивая фпс на мощном компе и минимуме расчетов milli стремится к 0
sec = milli / 1000.0 - 0 разделить на 1000 будет 0
dm = pers_speed*sec - 0 умножить на что то будет 0
pers.move_ip(dm, 0) - передвинуть рект на 0 => оставить на месте
при тыкании в заголовок окна, движок приостанавливается, отдавая управление оси и поэтому получается задержка.
решение:
1. занизить производительность системы, понизить частоту проца или поменять на менее быстрый
2. загрузить какими либо расчетами каждый тик
3. поставить ограничение фпс
4. написать грамотно механизм анимации



Офлайн

#9 Авг. 19, 2013 12:56:57

caufman
Зарегистрирован: 2013-02-15
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

sp3
решение:
1. занизить производительность системы, понизить частоту проца или поменять на менее быстрый
2. загрузить какими либо расчетами каждый тик
3. поставить ограничение фпс
4. написать грамотно механизм анимации
Вот за такой ответ - честь и хвала.
Исходя из этого, понятно почему код работает на рабочей машине (слабой с встроенной видеосистемой) и не работает на домашней.
Вариант 1-2 логичные, но кажутся костылями, причем дикими и грубыми. Думаю так делать нежелательно.
Вариант 3 погуглю. Думаю такое точно есть в pygame
Вариант 4 было бы любопытно взглянуть собственными глазами. Есть ссылки на готовый код, а лучше не описание правильных алгоритмов? А то что сам нашел - представлено выше.

Офлайн

#10 Авг. 19, 2013 13:16:49

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

Анимация в окне PyGame (техническая проблема)

caufman
Вариант 3
Я уже писал
milli = clock.tick(50)
ограничение в 50 фпс

caufman
Вариант 4
Ищи исходники игр. Скорее всего там будет грамотная реализация.
Туториалов в сети то же полно.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version