将 100 多张图像组合在一起的更优化方法
More Optimal Method of Combining 100+ Images Together
Python3.4
太平船
我将 100 多个 16x16 的图块组合在一起,为测试应用程序随机生成地形,并另存为 .png 文件进行存储。
我在测试时担心的是我收到以下完成时间:
- 100x100 地图(1600x1600 像素)= 1.16 分钟
- 200x200 地图(3200x3200 像素)= 2.43 分钟
- 300x300 地图(4800x4800 像素)= 5.27 分钟
- 500x500 地图(8000x8000 像素)= 13.14 分钟
对于 mobile/desktop 应用,这太长了。创建这些地图是否有更优化的方法?
注意:我不打算使用 16x16 瓷砖以外的任何东西。不过,我对其他 Python 模块持开放态度。
from datetime import datetime
from os import listdir, chdir
from random import randint
from time import strftime
from PIL import Image
x_size = 4800
y_size = 4800
x_tile_size = 16
y_tile_size = 16
x_tile_amount = int(x_size/x_tile_size)
y_tile_amount = int(y_size/y_tile_size)
new_im = Image.new('RGB', (x_size, y_size))
file_path = './assets/terrain/plains/'
print("Generating map.")
start_time = strftime("%H:%M:%S")
for i in range(x_tile_amount):
for j in range(y_tile_amount):
dice_roll = randint(1,7)
if dice_roll == 1:
terrain_file_path = 'grass_1.png'
elif dice_roll == 2:
terrain_file_path = 'grass_2.png'
elif dice_roll == 3:
terrain_file_path = 'grass_3.png'
elif dice_roll == 4:
terrain_file_path = 'grass_4.png'
elif dice_roll == 5:
terrain_file_path = 'white_flower.png'
elif dice_roll == 6:
terrain_file_path = 'red_flower.png'
elif dice_roll == 7:
terrain_file_path = 'blue_flower.png'
old_im = Image.open(file_path + terrain_file_path)
new_im.paste(old_im, (i*x_tile_size,j*y_tile_size))
end_time = strftime("%H:%M:%S")
t_format = "%H:%M:%S"
t_delta = datetime.strptime(end_time, t_format) - datetime.strptime(start_time, t_format)
print('Time to generate map = ' + str(t_delta))
new_im.save('pillow_test.png', 'PNG')
您正在打开一张新图片 n^2 次。这使得它非常慢。
您应该在执行 for 循环之前预加载这些图像
grass_1 = Image.open(file_path + 'grass_1.png')
grass_2 = Image.open(file_path + 'grass_2.png')
...
for i in range(x_tile_amount):
for j in range(y_tile_amount):
dice_roll = random.randint(1, 7)
if dice_roll == 1:
etc.
您可以做的另一个补充是将图片设置为字典。
my_dict = {
1: 'grass_1',
2: 'grass_2',
...
}
那你就可以了
dice_roll = random.randint(1,7)
new_im.paste(my_dict[dice_roll], (i*x_tile_size,j*y_tile_size))
尝试一下,看看是否对您的时间有帮助。
主要问题是当您生成 100x100 地图时,您要加载图像 10,000 次。没有理由将相同的 7 个图像文件加载 10k 次,因此您只需预加载它们并根据需要添加。
您正在为每个随机选择加载每个地形图像。最好预加载所有图片,然后使用 random.choice()
为您选择其中一张,如下所示:
from datetime import datetime
import random
from time import strftime
from PIL import Image
x_size = 4800
y_size = 4800
x_tile_size = 16
y_tile_size = 16
x_tile_amount = int(x_size/x_tile_size)
y_tile_amount = int(y_size/y_tile_size)
new_im = Image.new('RGB', (x_size, y_size))
file_path = './assets/terrain/plains/'
images = ['grass_1.png', 'grass_2.png', 'grass_3.png', 'grass_4.png', 'white_flower.png', 'red_flower.png', 'blue_flower.png']
terrain = [Image.open(os.path.join(file_path, image)) for image in images]
print("Generating map.")
start_time = strftime("%H:%M:%S")
for i in range(x_tile_amount):
for j in range(y_tile_amount):
old_im = random.choice(terrain)
new_im.paste(old_im, (i*x_tile_size,j*y_tile_size))
end_time = strftime("%H:%M:%S")
t_format = "%H:%M:%S"
t_delta = datetime.strptime(end_time, t_format) - datetime.strptime(start_time, t_format)
print('Time to generate map = ' + str(t_delta))
new_im.save('pillow_test.png', 'PNG')
这种方法应该可以大大加快速度。
Python3.4 太平船
我将 100 多个 16x16 的图块组合在一起,为测试应用程序随机生成地形,并另存为 .png 文件进行存储。
我在测试时担心的是我收到以下完成时间:
- 100x100 地图(1600x1600 像素)= 1.16 分钟
- 200x200 地图(3200x3200 像素)= 2.43 分钟
- 300x300 地图(4800x4800 像素)= 5.27 分钟
- 500x500 地图(8000x8000 像素)= 13.14 分钟
对于 mobile/desktop 应用,这太长了。创建这些地图是否有更优化的方法?
注意:我不打算使用 16x16 瓷砖以外的任何东西。不过,我对其他 Python 模块持开放态度。
from datetime import datetime
from os import listdir, chdir
from random import randint
from time import strftime
from PIL import Image
x_size = 4800
y_size = 4800
x_tile_size = 16
y_tile_size = 16
x_tile_amount = int(x_size/x_tile_size)
y_tile_amount = int(y_size/y_tile_size)
new_im = Image.new('RGB', (x_size, y_size))
file_path = './assets/terrain/plains/'
print("Generating map.")
start_time = strftime("%H:%M:%S")
for i in range(x_tile_amount):
for j in range(y_tile_amount):
dice_roll = randint(1,7)
if dice_roll == 1:
terrain_file_path = 'grass_1.png'
elif dice_roll == 2:
terrain_file_path = 'grass_2.png'
elif dice_roll == 3:
terrain_file_path = 'grass_3.png'
elif dice_roll == 4:
terrain_file_path = 'grass_4.png'
elif dice_roll == 5:
terrain_file_path = 'white_flower.png'
elif dice_roll == 6:
terrain_file_path = 'red_flower.png'
elif dice_roll == 7:
terrain_file_path = 'blue_flower.png'
old_im = Image.open(file_path + terrain_file_path)
new_im.paste(old_im, (i*x_tile_size,j*y_tile_size))
end_time = strftime("%H:%M:%S")
t_format = "%H:%M:%S"
t_delta = datetime.strptime(end_time, t_format) - datetime.strptime(start_time, t_format)
print('Time to generate map = ' + str(t_delta))
new_im.save('pillow_test.png', 'PNG')
您正在打开一张新图片 n^2 次。这使得它非常慢。
您应该在执行 for 循环之前预加载这些图像
grass_1 = Image.open(file_path + 'grass_1.png')
grass_2 = Image.open(file_path + 'grass_2.png')
...
for i in range(x_tile_amount):
for j in range(y_tile_amount):
dice_roll = random.randint(1, 7)
if dice_roll == 1:
etc.
您可以做的另一个补充是将图片设置为字典。
my_dict = {
1: 'grass_1',
2: 'grass_2',
...
}
那你就可以了
dice_roll = random.randint(1,7)
new_im.paste(my_dict[dice_roll], (i*x_tile_size,j*y_tile_size))
尝试一下,看看是否对您的时间有帮助。
主要问题是当您生成 100x100 地图时,您要加载图像 10,000 次。没有理由将相同的 7 个图像文件加载 10k 次,因此您只需预加载它们并根据需要添加。
您正在为每个随机选择加载每个地形图像。最好预加载所有图片,然后使用 random.choice()
为您选择其中一张,如下所示:
from datetime import datetime
import random
from time import strftime
from PIL import Image
x_size = 4800
y_size = 4800
x_tile_size = 16
y_tile_size = 16
x_tile_amount = int(x_size/x_tile_size)
y_tile_amount = int(y_size/y_tile_size)
new_im = Image.new('RGB', (x_size, y_size))
file_path = './assets/terrain/plains/'
images = ['grass_1.png', 'grass_2.png', 'grass_3.png', 'grass_4.png', 'white_flower.png', 'red_flower.png', 'blue_flower.png']
terrain = [Image.open(os.path.join(file_path, image)) for image in images]
print("Generating map.")
start_time = strftime("%H:%M:%S")
for i in range(x_tile_amount):
for j in range(y_tile_amount):
old_im = random.choice(terrain)
new_im.paste(old_im, (i*x_tile_size,j*y_tile_size))
end_time = strftime("%H:%M:%S")
t_format = "%H:%M:%S"
t_delta = datetime.strptime(end_time, t_format) - datetime.strptime(start_time, t_format)
print('Time to generate map = ' + str(t_delta))
new_im.save('pillow_test.png', 'PNG')
这种方法应该可以大大加快速度。