2013-12-25 2 views
0

Мой проект - это большая карта, которая может быть развернута вокруг, содержащей «информационные пятна», которые можно щелкнуть. На данный момент я использую четыре больших изображения, каждый из которых имеет размер 5000x5000 пикселей (так что общий размер карты составляет 20'000x20'000 пикселей). На моем четырехъядерном процессоре AMD Phenom 9950 с оперативной памятью 8 ГБ и NVIDIA GeForce 610 требуется некоторое время, чтобы загружать его, когда он довольно быстрый после панорамирования изображения. Я попробовал намотать его, но нет видимого улучшения скорости загрузки, так как изображение все равно должно быть загружено полностью, прежде чем оно будет разделено на плитки.PyGame: Загрузите информацию об изображении плитки прямо перед бьющим?

Единственный способ добиться реального улучшения скорости и использования памяти - это загрузить только те части отображаемого изображения карты. Предлагает ли PyGame любой способ сделать это? Я думаю о «теоретической» карте плитки, которая содержит необходимые значения x и y для каждой плитки (я группирую их немного, меньше, чтобы вычислить каждый кадр) и теоретической информации изображения (например: какое изображение и какое положение в нем) , Только когда плитка приближается к видимой части экрана, ее информация об изображении загружается, в противном случае она остается числом и строковым значением.

Будет ли это иметь какой-то смысл? Есть ли способ достичь этого?

+0

Вы хотите загрузить только часть файла изображения за раз? – SimonT

+0

Да, я пытаюсь найти способ только загрузить эту часть из всего изображения, которое покрывается видимыми в настоящее время плитами (плюс некоторые границы безопасности) вокруг –

+0

Я сомневаюсь, что Pygame имеет встроенную поддержку для этого ; вы должны просто разбить изображения самостоятельно. – SimonT

ответ

0

После прочтения @lukevp «s ответ, я был заинтересован и попытался это:

http://imgur.com/Q1N2UtU

Go получить это изображение и создайте папку с именем 'test_data'. Теперь поместите это изображение, код вне папки test_data и запустите. Результатом будут обрезанные фигуры, названные в соответствии с их порядком (немного по краям, так как изображение 1920 * 1080). Вы можете попробовать его с вашим обычным размером. Также обратите внимание, что я нахожусь на ubuntu, поэтому следите за соответствующими путями.

ВЫВОД: http://imgur.com/2v4ucGI Заключительная ссылка: http://imgur.com/a/GHc9l

import pygame, os 
pygame.init() 

original_image = pygame.image.load('test_pic.jpg') 

x_max = 1920 
y_max = 1080 

current_x = 0 
current_y = 0 

count = 1 

begin_surf = pygame.Surface((x_max,y_max), flags = pygame.SRCALPHA) 
begin_surf.blit(original_image,(0,0)) 

cropped_surf = pygame.Surface((100,100),flags=pygame.SRCALPHA) 

while current_y + 100 < y_max: 

    while current_x + 100 < x_max: 
    cropped_surf.blit(begin_surf, (0,0), (current_x, current_y,100,100)) 
    pygame.image.save(cropped_surf, os.path.join("test_data", str(count) + '.jpg')) 

    current_x += 100 

    count += 1 

    current_x = 0 

    current_y += 100 

бы теперь фактически работать, чтобы загрузить эти изображения и охватывают их, как он сказал.

+0

Спасибо за ваш ответ!Я решил проблему вроде этого - хотя я должен признать, что проект был приостановлен примерно с трех лет ... –

1

Единственный способ добиться этого с помощью Pygame - разбить изображения на меньшие квадраты (скажем, 250x250), а затем, как пользовательские кастрюли, просто получить текущие координаты x, y, а также экран размер и загружать любые плитки, которые вписываются в этот экран или вокруг края буфера в память, и очищать любые другие, которые находятся за пределами этого диапазона. Математика будет довольно простой, если вы не добавите поддержку вращения и/или масштабирования. Я бы назвал плитки после их местоположения как кратные квадратному размеру (например, плитка на 500, 500 будет называться 2-2.png). Это создаст очень тривиальное значение для генерации имени плитки, которое вам нужно загрузить в каждом месте, - возьмите текущие координаты x/y, целое число на 250, вычтите количество буферной плитки, а затем зациклируйте на целое число ширины экрана, деленное на 250 плюс 1 плюс количество буферной плитки для каждой строки. Сделайте этот цикл для каждого столбца.

+0

Спасибо за ваш ответ - это на самом деле тот подход, который я взял тогда, хотя я остановил проект весной -14. –