| 赞 | 87 |
| VIP | |
| 好人卡 | |
| 积分 | 136 |
| 经验 | |
| 最后登录 | 2021-1-24 |
| 在线时间 | 2753 小时 |
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 回帖
- 705

|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有账号?注册会员
×
本帖最后由 SixRC 于 2020-9-15 18:47 编辑
RM画面渲染过程中核心部分之一是blt (这里的blt和位图的blt本质一样 具体上不同)
把所有要呈现的位图依次blt到背景上
他好像会根据目标CPU的特性不同在运行时生成blt机器码 效率很高
不过那个时候普及的大概就MMX?
然后我就写了需要SSE2或AVX2的版本 会根据支持的情况替换原来的过程(现在基本都有SSE2所以只判断是否有AVX2)
效率测试我这里大概是 SSE2版是原版2倍 AVX2版2.2倍
就这样
实际意义大概不大 毕竟效率瓶颈很可能不在这 也不缺这点
写了就发 早知结果大概就不写了..
因为实际计算量并不大 多线程的效果不好(实际计算量小则更慢 计算量稍高则高CPU占用低收益) 所以没有加
(什么 你问我之前的多线程版不规则blt? 只能说年少不懂事 误把测试当事实 不过反正没人说 我懒得去改了)
仅支持103J
[fold=代码]
[pre lang="ruby"]=begin
------------------------------渲染加速------------------------SixRC-20-09-15---
-------------------------------------------------------------------------------
------根据CPU是否支持SSE2和AVX2--替换原渲染过程-------------------------------
---若支持SSE2---大概为--2x-----------------------------------------------------
---若支持AVX2---大概为--2.2x---------------------------------------------------
------如果不用FPS限制解除---测试的结果会是错误的-------------------------------
------那个脚本能保证每帧刷新及取消刷新限制-------------------------------------
---这里渲染指画面刷新中把精灵展示的位图呈现的计算过程--------------------------
------不包括其余运算!---------------------------------------------------------
-------------------------------------------------------------------------------
=end
# 改变临时位图大小 效率提升不明显 但是卡顿时不会出现一片片的画面
# 原来是 640*8 每次刷新 现在是 640*480
cwp = Win32API.new("user32","CallWindowProc","pllll","l")
dll = Win32API.new("kernel32","GetModuleHandleA","p","l").call("rgss103j")
code = [0x8B,0x0D].pack("C*") + [dll + 0x12B6C4].pack("l") +
[0x8B,0x89,0x34,0x01,0x00,0x00,0xC7,0x81,0x84,0x00,0x00,0x00,
0x01,0x00,0x00,0x00,0x68,0xE0,0x01,0x00,0x00,0x6A,0x20,0xB8].pack("C*") +
[dll + 0x888D0].pack("l") + [0xFF,0xD0,0xC2,0x10,0x00].pack("C*")
cwp.call(code,0,0,0,0)
wpm = Win32API.new('kernel32','WriteProcessMemory','llpll','l')
wpm.call(-1,dll+0x87F8B,"\xeb",1,0)
wpm.call(-1,dll+0x888E7,"\x00",1,0)
# 不要注释下面三句看起来没用的东西
s=Sprite.new
Graphics.update
s.dispose
# DllMain会处理 所有没有导入函数
Win32API.new("kernel32","LoadLibraryA","p","v").call "bltacc"[/pre]
[/fold]
bltacc.zip
(39.97 KB, 下载次数: 134)
放到目录就行 |
|