python - 为循环 PyGame 绘制双倍加速
问题描述
我有一个 pygame 游戏,它目前在绘制到屏幕过程中遇到瓶颈。这是代码(pg是pygame):
def draw_living_cells(self):
self.screen.fill(BLACK)
for x in range(0, GRID_WIDTH + 1):
for y in range(0, GRID_HEIGHT):
if self.grid[x + 1][y + 1] == 1:
pos = (int(x * CELL_SIZE), int(y * CELL_SIZE), int(CELL_SIZE), int(CELL_SIZE))
pg.draw.rect(self.screen, LIFE_COLOR, pos, 0)
pg.display.flip()
我认为多处理可能会有所帮助,但我不确定如何实现,如果可能(由于可能的共享内存问题)或者它是否有帮助。
在 800x600 显示器中,使用大小为 200x150 的 self.grid 时,此过程大约需要 20 毫秒。我认为在如此简单的过程中拥有约 50fps 的速度很奇怪。
解决方案
最后,我尝试了类似于 Glenn 建议的方法。我使用 numpy 来获取活细胞的位置,然后遍历这些坐标而不是整个网格。这使性能提高了 2.5~3 倍。新代码:
def draw_living_cells(self):
self.screen.fill(BLACK)
living_cells_xy = np.where(self.grid == 1)
living_cells = len(living_cells_xy[0])
for i in range(0, living_cells):
x = living_cells_xy[0][i] - 1
y = living_cells_xy[1][i] - 1
pos = (int(x * CELL_SIZE), int(y * CELL_SIZE), int(CELL_SIZE), int(CELL_SIZE))
pg.draw.rect(self.screen, LIFE_COLOR, pos, 0)
pg.display.flip()
推荐阅读
- c# - 使用 Xamarin Forms 进行 Active Directory(本地 AD 而非 Azure AD)身份验证
- ruby-on-rails - 尝试反序列化参数时出现 Shopify API 错误
- amazon-web-services - Cloudformation中删除ECS服务失败
- information-retrieval - permuterm 索引是如何工作的?
- android - 可以对 PWA 贴纸使用 Firebase 应用索引吗?
- android - 如何用 EditText 完全填充 TextInputLayout?
- ruby - Rspec,无法在我的类中为 ruby gem 调用方法,错误:ruby NoMethodError:未定义方法 `pull' for Status::Page:Module
- python - Gensim Word2Vec 从预训练模型中选择少量词向量
- javascript - 性能 - 您更喜欢哪个选项?
- intershop - 无法访问组件中视图管道的管道字典条目