Pygame 粒子物理:Numba实现同时渲染十万+像素

图中同时渲染了十万个像素,没有明显掉帧

我对Pygame的印象一直是慢的扣脚的,直到前段时间看到了一段MandelBrot代码(源地址弄丢了)其中使用了这个功能:pygame.surfarray.make_surface()

这里可以直接把numpy阵列转换为pygame.surface,对比draw来说节省了大量算力

在运算物理效果的时候还可以使用numba即时编译,速度指数型上升。

这里粒子用了水粒子作为示范,原理十分简单,依次检测每个像素下方,左边,右边,如果像素为空则移动到临近像素。

代码见下

import pygame as pg
import random
import numpy as np
from numba import njit, prange@njit(cache=True)
def palette(im):  # I snatched this from stack exchangeim = 255 * (im / im.max())w, h = im.shaperet = np.empty((w, h, 3), dtype=np.uint8)ret[:, :, 0] = ret[:, :, 1] = ret[:, :, 2] = imreturn ret@njit(cache=False,fastmath=False,nopython=True)
def frame_calculation(particles, pix_array):if len(particles) == 0:returnfor ob in particles:x=ob[0]y=ob[1]if y<1 or y>resH-1:continueif pix_array[y-1,x]==0:pix_array[y-1,x]=255pix_array[y,x] = 0ob[1] = y-1continueif x+1<resW:if pix_array[y, x+1] == 0:pix_array[y, x+1] = 255pix_array[y, x] = 0ob[0] = x + 1continueif x-1>0:if pix_array[y, x - 1] == 0:pix_array[y,x-1] = 255pix_array[y, x] = 0ob[0] = x - 1continuedef draw_on_array(x, y):global particlesglobal pix_arrayy_=resH-yif y_ < resH:for i in range(-1,1):for j in range(-1,1):pix_array[y_+i, x+j] = 255particles = np.vstack((particles, [x+i, y_+j]))# pix_array[y_,x] = 255# particles = np.vstack((particles, [x, y_]))resW,resH = [1050, 600]
pg.init()
pg.font.init()
screen = pg.display.set_mode((resW,resH))
l_mouse_clicked = False
pix_array = np.zeros((resH,resW),np.int32)
run = True
particles = np.array([[-1,-1]],np.int32)while run:screen.fill([0, 0, 0])x, y = 0,0for event in pg.event.get():if event.type == pg.QUIT:run = Falsepg.quit()if event.type == pg.MOUSEBUTTONDOWN:if event.button == 1:l_mouse_clicked = Trueif event.button == 3:print(len(particles))if event.type == pg.MOUSEBUTTONUP:if event.button == 1:l_mouse_clicked = Falseif l_mouse_clicked:x, y = pg.mouse.get_pos()draw_on_array(x,y)frame_calculation(particles, pix_array)pixel_surface = pg.surfarray.make_surface(palette(pix_array))pixel_surface = pg.transform.rotate(pixel_surface,90)screen.blit(pixel_surface, [0, 0])pg.display.flip()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“vector”: 不是“std”的成员_libcxx 的 std::function 源码分析

链接&#xff1a;functional。其中 std::function 的主体内容在 2100 多行。先来看 function 的头部。template<class _Rp, class ..._ArgTypes> class _LIBCPP_TEMPLATE_VIS function<_Rp(_ArgTypes...)>: public __function::__maybe_derive_from_unary_function…

python验证身份证号码大全_身份证号码处理技巧大全

身份证号码处理技巧大全&#xff0c;汇总了常用的身份证号码处理六大技巧&#xff1a;不需要复杂的公式&#xff0c;点点鼠标即可完成&#xff0c;简单快捷&#xff0c;下面将详细介绍六大功能的具体用法。(文章最后有工具和演示文件的下载地址&#xff0c;可以下载下来同步操作…

语言print如何实现连续输出_【每日一题】如何实现一个高效的单向链表逆序输出?...

今后&#xff0c;动力节点Java学院将每天为大家带来一道大厂面试真题&#xff0c;这些面试题都是大厂技术专家们结合多年的工作、面试经验总结提炼而成的面试真题。通过这些面试题&#xff0c;还可以间接地了解技术大牛们出题思路与考察要点。建议大家收藏并分享给更多需要的人…

恩尼格玛模拟器_用C语言编的恩格尼码模拟器

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼void enumio(char pie1[],char pie2[],char pie3[],char pier[],char ch0[],char chz[],char ip[],char k[],int cou){ int check(char *a);int excheck(char *a);int compare(char *le,char *unle);int factorial(int n);void cyc…

louvain算法python_复杂网络任务6:Louvain社区发现算法的原理、细节和实现,作业,六,以及...

ΔQ[∑in2∗mki,in2∗m−(∑tot2∗m)2−(2∗∑tot∗ki4∗m2)−(ki2∗m)2]−[∑in2∗m−(∑tot2∗m)2−(ki2∗m)2]ki,in2∗m−2∗∑tot∗ki4∗m212∗m∗(ki,in−∑tot∗kim)\Delta{Q} [\frac{\sum_{in}} {2*m} \frac{k_{i,in}}{2*m} - (\frac{\sum_{tot}}{2*m})^2 - (\frac{2*…

系统相机裁剪比例_从单反到手机,三种黄金比例构图方法,让你的照片与众不同...

古埃及金字塔和达芬奇蒙娜丽莎有什么共同之处&#xff1f;它们都是使用黄金比例进行设计的。不管是建筑设计还是绘画&#xff0c;它们都是属于艺术的一种&#xff0c;所以黄金比例也同样适用于摄影构图中。很多优秀的摄影作品都会使用黄金比例的构图方法进行拍摄&#xff0c;因…

mysql安装图解_MySQL安装图解

目录一、安装详细过程MySQL默认安装在“C:\Program Files”目录下。普通使用只安装MySQL Server就足够了&#xff0c;大小为416M。如果不想装在C盘&#xff0c;也可以安装完成之后再将其移动到其他盘。1.接受许可&#xff0c;点击Next2.选择安装功能&#xff0c;推荐选择Server…

mysql字符集设置_mysql字符集设置

配置文件路径&#xff1a; /full/path/mysql/bin/my.cnf (默认为/etc/my.cnf )[client]default-character-setutf8[mysql]default-character-setutf8[mysqld]init_connectSET collation_connection utf8_unicode_ciinit_connectSET NAMES utf8character-set-serverutf8collati…

mysql 索引 原理_MySQL——索引实现原理

在MySQL中&#xff0c;索引属于存储引擎级别的概念&#xff0c;不同存储引擎对索引的实现方式是不同的&#xff0c;本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。MyISAM索引实现MyISAM引擎使用BTree作为索引结构。MyISAM会按照数据插入的顺序分配行号&#xff0c;从…

mysql 字段 中文_如何配置mysql支持中文字段名与中文字段

匿名用户1级2018-11-18 回答中文字段名都可以了 但是中文记录不行 奇怪啊mysql>; create table a (a char(20));Query OK, 0 rows affected (0.05 sec)mysql>; insert into a values(^_^);Query OK, 1 row affected (0.05 sec)mysql>; insert into a values(中guo);Qu…

mysql中如何删除多个表格_mysql怎么批量删除多个表?

mysql批量删除多个表的方法&#xff1a;使用“DROP TABLE”语句&#xff0c;只要将表名依次写在后面&#xff0c;相互之间用逗号隔开即可&#xff1b;语法格式“DROP TABLE [IF EXISTS] 表名1 [ ,表名2, 表名3 ...]”。mysql批量删除多个表使用 DROP TABLE 语句可以删除一个或多…

mysql 图片 格式_mysql存储图片 用什么格式

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

mysql5.5更改端口后初始化_centos7 修改mysql5.7默认端口后启动异常

关闭selinux的方法有两种&#xff1a;临时关闭和永久关闭。查看selinux的状态&#xff1a;sestatus[root162-219-29-3 ~]# sestatusSELinux status: enabledSELinuxfs mount: /sys/fs/selinuxSELinux root directory: /etc/selinuxLoaded policy name: targetedCurrent mode: e…

开启mysql日志记录_Mysql开启日志记录

vim /etc/my.conf.d/server.cnf:#lower_case_tables_name 1#错误日志log_error /var/log/mysql_error.log#慢查询日志slow_query_logONslow_query_log_file/mnt/lnx_log/mysql/slow.loglong_query_time1 #单位秒&#xff0c;超过此值则记录为慢查询#通用查询日志&#xff0c;…

mysql存储引擎innodb_MySQL常用存储引擎之Innodb

1. mysql 5.5及之后版本默认存储引擎为不了解存储引擎的数据库使用者&#xff0c;提供了很大的便利&#xff0c;因为innodb适应大部分应用场景。和myisam不同的是&#xff0c;innodb是一种事务型存储引擎。也就是说&#xff0c;innodb是支持事务的acid特性的。innodb的设计&…

mysql 的驱动是多少_mysql驱动参数变化

在java平台使用的mysql jdbc驱动为&#xff1a;mysql-connector-java。在项目中添加如下依赖&#xff1a;mysqlmysql-connector-java${version.mysql.connector}在6.0.2版本之前drivercom.mysql.jdbc.Driverurljdbc:mysql://host:port/dbname?characterEncodingutf8在6.0.2版本…

mysql 对已有表分区_mysql怎么对先有表进行分区

mysql如何对先有表进行分区&#xff1f;有一张表&#xff0c;已经创建了&#xff0c;是一张普通的表&#xff0c;先要对这张表进行hash分区&#xff0c;我用一下语句创建提示错误&#xff1a;mysql> alter table 33-> partition by hash(id)-> partitions 2;ERROR 106…

如何查看mysql my.ini_MySQL学习笔记(一)

MySQL 学习笔记一.安装Typical:经典安装Custom:自定义安装Complete: 完全安装二.修改编码方式[mysqld]myini:character-set-serverutf8[client] port3306 default-character-setutf8三.启动停止mysql服务cmd net stop mysqlcmd net start mysql四.MySQL登录mysql -V 查看版本&…

springboot quartz 动态配置_springboot集成quartz实现动态任务调度

quartz是一个开源的作业调度框架&#xff0c;本文就是介绍下springboot框架下继承quartz的一些使用示例首先我们需要添加quartz的spring-boot-starter-quartz依赖org.springframework.bootspring-boot-starter-quartz我们需要做一些配置。quartz提供了基于内存(MEMORY)和基于jd…

sql server cdc 清理_基于CDC技术的ElasticSearch索引同步机制

概述ElasticSearch作为一个基于Lucene的搜索引擎被广泛应用于各种应用系统&#xff0c;比如电商、新闻类、咨询类网站。在使用ElasticSearch开发应用的过程中&#xff0c;一个非常重要的过程是将数据导入到ElasticSearch索引中建立文档。在一开始系统规模比较小时&#xff0c;我…